use-model-change.js 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import { computed, readonly } from 'vue'
  2. import { getFieldValue, isArray, isEmpty, isNotEmpty, setFieldValue } from '@cip/utils/util'
  3. import { getValuesByKeys } from '@cip/components/cip-form-item/util'
  4. import { emptySign } from '../../helper/update-form-stream'
  5. export const useFieldValue = (key, model, updateModelQueue, changeEffect) => {
  6. const isArrayKey = computed(() => {
  7. return isArray(key.value)
  8. })
  9. const value = computed(() => {
  10. if (!key.value || key.value.length === 0) return undefined
  11. // 根据key的类型不同调用不同的方法获取otherValue
  12. if (isArrayKey.value) {
  13. return getValuesByKeys(model.value, key.value)
  14. } else {
  15. return getFieldValue(model.value, key.value)
  16. }
  17. })
  18. const updateValue = async (val) => {
  19. if (!key.value) return
  20. if (changeEffect?.value) { // TODO: 需要区分
  21. try {
  22. const result = await changeEffect.value(val, key.value, model.value)
  23. if (result === false) throw new Error('changeEffect false interrupted data update')
  24. } catch (e) {
  25. throw new Error('changeEffect reject interrupted data update')
  26. }
  27. }
  28. if (isArrayKey.value) {
  29. key.value.forEach(k => {
  30. // 如果otherKey是输出, 在设置undefined是将导致报错,故使用默认空对象进行防御
  31. updateModelQueue.append(k, getFieldValue(val = {}, k))
  32. })
  33. } else {
  34. updateModelQueue.append(key.value, val)
  35. }
  36. }
  37. return [value, updateValue]
  38. }
  39. export const useSteamUpdateValues = (fieldKey, otherKey, model, updateModel, changeEffect) => {
  40. const keys = computed(() => {
  41. return [].concat(fieldKey.value).concat(otherKey.value)
  42. })
  43. const values = computed(() => {
  44. return keys.value.map(key => getFieldValue(model.value, key))
  45. })
  46. const streamUpdateModel = async (values) => {
  47. if (changeEffect?.value && isNotEmpty(values[0])) {
  48. let value = values[0]
  49. if (values[0] === emptySign) value = undefined
  50. try {
  51. const result = await changeEffect.value(value, keys.value[0], readonly(model.value))
  52. if (result === false) throw new Error('changeEffect false interrupted data update')
  53. } catch (e) {
  54. throw new Error('changeEffect reject interrupted data update')
  55. }
  56. }
  57. const innerModel = model.value // 不能结构,结构将导致监听到整个model数据的变化
  58. keys.value.forEach((key, index) => {
  59. const value = values[index]
  60. if (value === emptySign) {
  61. setFieldValue(innerModel, key, undefined)
  62. } else if (!isEmpty(value)) {
  63. setFieldValue(innerModel, key, values[index])
  64. }
  65. })
  66. updateModel(innerModel)
  67. }
  68. const clearValues = () => {
  69. const innerModel = model.value // 不能结构,结构将导致监听到整个model数据的变化
  70. keys.value.forEach((key) => {
  71. setFieldValue(innerModel, key, undefined)
  72. })
  73. }
  74. return {
  75. values,
  76. streamUpdateModel,
  77. clearValues
  78. }
  79. }