DescriptionForm.vue 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <template>
  2. <el-form ref="descriptionFormRef" :model="formData" :rules="rules" label-width="120px">
  3. <!--富文本编辑器组件-->
  4. <el-form-item label="商品详情" prop="description">
  5. <Editor v-model:modelValue="formData.description" />
  6. </el-form-item>
  7. </el-form>
  8. </template>
  9. <script lang="ts" name="DescriptionForm" setup>
  10. import type { Spu } from '@/api/mall/product/spu'
  11. import { Editor } from '@/components/Editor'
  12. import { PropType } from 'vue'
  13. import { propTypes } from '@/utils/propTypes'
  14. import { copyValueToTarget } from '@/utils'
  15. const message = useMessage() // 消息弹窗
  16. const props = defineProps({
  17. propFormData: {
  18. type: Object as PropType<Spu>,
  19. default: () => {}
  20. },
  21. activeName: propTypes.string.def('')
  22. })
  23. const descriptionFormRef = ref() // 表单Ref
  24. const formData = ref<Spu>({
  25. description: '' // 商品详情
  26. })
  27. // 表单规则
  28. const rules = reactive({
  29. description: [required]
  30. })
  31. /**
  32. * 富文本编辑器如果输入过再清空会有残留,需再重置一次
  33. */
  34. watch(
  35. () => formData.value.description,
  36. (newValue) => {
  37. if ('<p><br></p>' === newValue) {
  38. formData.value.description = ''
  39. }
  40. },
  41. {
  42. deep: true,
  43. immediate: true
  44. }
  45. )
  46. /**
  47. * 将传进来的值赋值给formData
  48. */
  49. watch(
  50. () => props.propFormData,
  51. (data) => {
  52. if (!data) return
  53. // fix:三个表单组件监听赋值必须使用 copyValueToTarget 使用 formData.value = data 会监听非常多次
  54. copyValueToTarget(formData.value, data)
  55. },
  56. {
  57. // fix: 去掉深度监听只有对象引用发生改变的时候才执行,解决改一动多的问题
  58. immediate: true
  59. }
  60. )
  61. /**
  62. * 表单校验
  63. */
  64. const emit = defineEmits(['update:activeName'])
  65. const validate = async () => {
  66. // 校验表单
  67. if (!descriptionFormRef) return
  68. return await unref(descriptionFormRef).validate((valid) => {
  69. if (!valid) {
  70. message.warning('商品详情为完善!!')
  71. emit('update:activeName', 'description')
  72. // 目的截断之后的校验
  73. throw new Error('商品详情为完善!!')
  74. } else {
  75. // 校验通过更新数据
  76. Object.assign(props.propFormData, formData.value)
  77. }
  78. })
  79. }
  80. defineExpose({ validate })
  81. </script>