Write.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. <script setup lang="ts">
  2. import { Form } from '@/components/Form'
  3. import { useForm } from '@/hooks/web/useForm'
  4. import { PropType, reactive } from 'vue'
  5. import { TableData } from '@/api/table/types'
  6. import { useI18n } from '@/hooks/web/useI18n'
  7. import { required } from '@/utils/formRules'
  8. import { IDomEditor } from '@wangeditor/editor'
  9. const props = defineProps({
  10. currentRow: {
  11. type: Object as PropType<Nullable<TableData>>,
  12. default: () => null
  13. }
  14. })
  15. const { t } = useI18n()
  16. const schema = reactive<FormSchema[]>([
  17. {
  18. field: 'title',
  19. label: t('exampleDemo.title'),
  20. component: 'Input',
  21. formItemProps: {
  22. rules: [required]
  23. },
  24. colProps: {
  25. span: 24
  26. }
  27. },
  28. {
  29. field: 'author',
  30. label: t('exampleDemo.author'),
  31. component: 'Input',
  32. formItemProps: {
  33. rules: [required]
  34. }
  35. },
  36. {
  37. field: 'display_time',
  38. label: t('exampleDemo.displayTime'),
  39. component: 'DatePicker',
  40. componentProps: {
  41. type: 'datetime',
  42. valueFormat: 'YYYY-MM-DD HH:mm:ss'
  43. },
  44. formItemProps: {
  45. rules: [required]
  46. }
  47. },
  48. {
  49. field: 'importance',
  50. label: t('exampleDemo.importance'),
  51. component: 'Select',
  52. formItemProps: {
  53. rules: [required]
  54. },
  55. componentProps: {
  56. options: [
  57. {
  58. label: '重要',
  59. value: 3
  60. },
  61. {
  62. label: '良好',
  63. value: 2
  64. },
  65. {
  66. label: '一般',
  67. value: 1
  68. }
  69. ]
  70. }
  71. },
  72. {
  73. field: 'pageviews',
  74. label: t('exampleDemo.pageviews'),
  75. component: 'InputNumber',
  76. value: 0,
  77. formItemProps: {
  78. rules: [required]
  79. }
  80. },
  81. {
  82. field: 'content',
  83. component: 'Editor',
  84. colProps: {
  85. span: 24
  86. },
  87. componentProps: {
  88. defaultHtml: '',
  89. onChange: (edit: IDomEditor) => {
  90. const { setValues } = methods
  91. setValues({
  92. content: edit.getHtml()
  93. })
  94. }
  95. },
  96. label: t('exampleDemo.content')
  97. }
  98. ])
  99. const rules = reactive({
  100. title: [required],
  101. author: [required],
  102. importance: [required],
  103. pageviews: [required],
  104. display_time: [required],
  105. content: [required]
  106. })
  107. const { register, methods, elFormRef } = useForm({
  108. schema
  109. })
  110. if (props.currentRow) {
  111. const { setValues, setSchema } = methods
  112. setValues(props.currentRow)
  113. setSchema([
  114. {
  115. field: 'content',
  116. path: 'componentProps.defaultHtml',
  117. value: props.currentRow.content
  118. }
  119. ])
  120. }
  121. defineExpose({
  122. elFormRef,
  123. getFormData: methods.getFormData
  124. })
  125. </script>
  126. <template>
  127. <Form :rules="rules" @register="register" />
  128. </template>