index.vue 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <template>
  2. <!--
  3. Form 智能表单组件
  4. 功能:
  5. 1. 封装所有校验逻辑
  6. 2. 自动provide校验函数给子组件
  7. 3. 支持v-model双向绑定
  8. 4. 极简使用方式
  9. 使用方式:
  10. <Form :rules="fieldConfigs" v-model="formData">
  11. <up-table>
  12. <up-tr>
  13. <up-th>事由</up-th>
  14. <ValidatedTd field="reason">
  15. <up-input placeholder="请输入事由" />
  16. </ValidatedTd>
  17. </up-tr>
  18. </up-table>
  19. </Form>
  20. -->
  21. <view class="smart-form">
  22. <!-- 直接渲染子内容,不使用插槽参数 -->
  23. <slot></slot>
  24. </view>
  25. </template>
  26. <script setup>
  27. import { computed, provide, watch } from 'vue'
  28. import { useFormValidation } from '@/composables/useFormValidation'
  29. const props = defineProps({
  30. // 表单数据 - 支持v-model
  31. modelValue: {
  32. type: Object,
  33. default: () => ({})
  34. },
  35. // 校验规则配置
  36. rules: {
  37. type: Object,
  38. default: () => ({})
  39. }
  40. })
  41. const emit = defineEmits(['update:modelValue'])
  42. // 直接使用外部传入的formData,避免双向绑定的复杂性
  43. const formData = computed({
  44. get: () => props.modelValue,
  45. set: (value) => emit('update:modelValue', value)
  46. })
  47. // 表单校验
  48. const { validateField, validateForm, errors, clearErrors, getFieldConfig, setFieldConfigs } = useFormValidation(props.rules)
  49. // 监听 props.rules 的变化,同步更新内部配置
  50. watch(() => props.rules, (newRules) => {
  51. console.log('Form组件检测到rules变化:', newRules)
  52. setFieldConfigs(newRules)
  53. }, { deep: true, immediate: true })
  54. // Form组件初始化完成
  55. // 计算是否有错误
  56. const hasErrors = computed(() => {
  57. return Object.keys(errors.value).some(key =>
  58. errors.value[key] && errors.value[key].length > 0
  59. )
  60. })
  61. // 向子组件提供校验函数和数据
  62. provide('validateField', validateField)
  63. provide('errors', errors)
  64. provide('clearErrors', clearErrors)
  65. provide('formData', formData)
  66. provide('getFieldConfig', getFieldConfig)
  67. provide('validateForm', validateForm) // 添加这个,供外部使用
  68. // 移除初始化校验,让Td组件自己处理
  69. // Form组件provide完成
  70. // 暴露方法给父组件
  71. defineExpose({
  72. validateForm,
  73. validateField,
  74. errors,
  75. clearErrors
  76. })
  77. </script>
  78. <style lang="scss" scoped>
  79. .smart-form {
  80. width: 100%;
  81. }
  82. </style>