1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- import { computed, readonly } from 'vue'
- import { getFieldValue, isArray, isEmpty, isNotEmpty, setFieldValue } from '@cip/utils/util'
- import { getValuesByKeys } from '@cip/components/cip-form-item/util'
- import { emptySign } from '../../helper/update-form-stream'
- export const useFieldValue = (key, model, updateModelQueue, changeEffect) => {
- const isArrayKey = computed(() => {
- return isArray(key.value)
- })
- const value = computed(() => {
- if (!key.value || key.value.length === 0) return undefined
- // 根据key的类型不同调用不同的方法获取otherValue
- if (isArrayKey.value) {
- return getValuesByKeys(model.value, key.value)
- } else {
- return getFieldValue(model.value, key.value)
- }
- })
- const updateValue = async (val) => {
- if (!key.value) return
- if (changeEffect?.value) { // TODO: 需要区分
- try {
- const result = await changeEffect.value(val, key.value, model.value)
- if (result === false) throw new Error('changeEffect false interrupted data update')
- } catch (e) {
- throw new Error('changeEffect reject interrupted data update')
- }
- }
- if (isArrayKey.value) {
- key.value.forEach(k => {
- // 如果otherKey是输出, 在设置undefined是将导致报错,故使用默认空对象进行防御
- updateModelQueue.append(k, getFieldValue(val || {}, k))
- })
- } else {
- updateModelQueue.append(key.value, val)
- }
- }
- return [value, updateValue]
- }
- export const useSteamUpdateValues = (fieldKey, otherKey, model, updateModel, changeEffect) => {
- const keys = computed(() => {
- return [].concat(fieldKey.value).concat(otherKey.value)
- })
- const values = computed(() => {
- return keys.value.map(key => getFieldValue(model.value, key))
- })
- const streamUpdateModel = async (values) => {
- if (changeEffect?.value && isNotEmpty(values[0])) {
- let value = values[0]
- if (values[0] === emptySign) value = undefined
- try {
- const result = await changeEffect.value(value, keys.value[0], readonly(model.value))
- if (result === false) throw new Error('changeEffect false interrupted data update')
- } catch (e) {
- throw new Error('changeEffect reject interrupted data update')
- }
- }
- const innerModel = model.value // 不能结构,结构将导致监听到整个model数据的变化
- keys.value.forEach((key, index) => {
- const value = values[index]
- if (value === emptySign) {
- setFieldValue(innerModel, key, undefined)
- } else if (!isEmpty(value)) {
- setFieldValue(innerModel, key, values[index])
- }
- })
- updateModel(innerModel)
- }
- const clearValues = () => {
- const innerModel = model.value // 不能结构,结构将导致监听到整个model数据的变化
- keys.value.forEach((key) => {
- setFieldValue(innerModel, key, undefined)
- })
- }
- return {
- values,
- streamUpdateModel,
- clearValues
- }
- }
|