DescriptionForm.vue 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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 { SpuType } from '@/api/mall/product/management/type/spuType'
  11. import { Editor } from '@/components/Editor'
  12. import { PropType } from 'vue'
  13. import { copyValueToTarget } from '@/utils/object'
  14. import { propTypes } from '@/utils/propTypes'
  15. const message = useMessage() // 消息弹窗
  16. const props = defineProps({
  17. propFormData: {
  18. type: Object as PropType<SpuType>,
  19. default: () => {}
  20. },
  21. activeName: propTypes.string.def('')
  22. })
  23. const DescriptionFormRef = ref() // 表单Ref
  24. const formData = ref<SpuType>({
  25. description: '' // 商品详情
  26. })
  27. /**
  28. * 富文本编辑器如果输入过再清空会有残留,需再重置一次
  29. */
  30. watch(
  31. () => formData.value.description,
  32. (newValue) => {
  33. if ('<p><br></p>' === newValue) {
  34. formData.value.description = ''
  35. }
  36. },
  37. {
  38. deep: true,
  39. immediate: true
  40. }
  41. )
  42. // 表单规则
  43. const rules = reactive({
  44. description: [required]
  45. })
  46. /**
  47. * 将传进来的值赋值给formData
  48. */
  49. watch(
  50. () => props.propFormData,
  51. (data) => {
  52. if (!data) return
  53. copyValueToTarget(formData.value, data)
  54. },
  55. {
  56. deep: true,
  57. immediate: true
  58. }
  59. )
  60. const emit = defineEmits(['update:activeName'])
  61. /**
  62. * 表单校验
  63. */
  64. const validate = async () => {
  65. // 校验表单
  66. if (!DescriptionFormRef) return
  67. return unref(DescriptionFormRef).validate((valid) => {
  68. if (!valid) {
  69. message.warning('商品详情为完善!!')
  70. emit('update:activeName', 'description')
  71. // 目的截断之后的校验
  72. throw new Error('商品详情为完善!!')
  73. } else {
  74. // 校验通过更新数据
  75. Object.assign(props.propFormData, formData.value)
  76. }
  77. })
  78. }
  79. defineExpose({ validate })
  80. </script>