Vue Antdv a-form 表单中使用自定义组件,并支持 v-decorator 效验

14 篇文章 4 订阅
一、简介
  • Vue 自定义组件实现 v-model 数据双向绑定

  • 在使用 AntdvForm 表单的时候,有时候需要官方自带的组件未必够用。

  • 这个时候需要使用到自定义的一些组件,自定义的组件需要支持数据双向绑定,也需要支持 v-decorator 的数据效验,或者默认值设置等等。

二、自定义相关组件
  • CustomInput.vue:自定义一个输入框来举例

    <template>
      <!-- 包装一个 input,让它支持数据双向绑定 v-model,同时也支持 form 表单的效验 -->
      <div class="custom-input">
        <!-- 使用一个输入框 -->
        <a-input
          :placeholder="placeholder"
          v-model="valuePro"
          @change="inputChange"
        />
      </div>
    </template>
    
    <script>
    export default {
      // a-form 表单会监听下面事件与值,到时候需要通过 change 事件传出新的值即可,v-decorator 会通过 change 事件接受新值
      model: {
        prop: 'value',
        event: 'change'
      },
      props: {
        // 当前组件值
        // 默认是给 v-model 绑定值使用的
        value: {
          type: String
          // 当通过 a-from 标签包裹时:
          // 这个参数是 v-decorator 给子组件传值用的
          // 这里不要给默认值, 在 form 下使用会爆警告 Warning: SquareUpload `default value` can not collect,  please use `option.initialValue` to set default value.
        },
        // 占位符
        placeholder: {
          type: String,
          default: () => undefined
        }
      },
      computed: {
        // 支持 v-model 双向数据绑定,如果有新数据会通过 $emit 一个 input 事件进行修改 v-model 的值,也就是当前 value 值。
        // 写法是固定的,vue 自动处理,只管通过 $emit('input', newValue) 抛出去新的值即可。
        currentValue: {
          get () {
            return this.value
          },
          set (newValue) {
            this.$emit('input', newValue)
          }
        }
      },
      watch: {
        // 监听当前值变化,及时提交给父组件
        currentValue: {
          deep: true,
          immediate: true,
          handler: function (newValue) {
            // 记录最新的值
            this.valuePro = newValue
            // 判断当前的 value 值是否为 undefined, 如果是的话不用抛出去,要不然 form 标签就会走效验,并提示对应的错误了
            if (newValue !== undefined) {
              // v-decorator 会通过 change 事件接受新值
              this.$emit('change', newValue)
            }
          }
        }
      },
      data () {
        return {
          // 当前页面值,用于做桥梁使用的
          // 当前页面操作修改的就是这个值,外部传进来也会更新这个值,它变化了在通过 input change 去更新外部的值
          valuePro: undefined
        }
      },
      methods: {
        // input 输入
        inputChange (e) {
          // 传出去最新值,这里只需要通过 change 事件传出去即可,内部的 value 也会发生变化
          this.$emit('change', e.target.value)
        }
      }
    }
    </script>
    
  • home.vue:进行使用

    <template>
      <!-- form -->
      <a-form
        :form="form"
        :label-col="{ span: 3 }"
        :wrapper-col="{ span: 5 }"
        @submit="handleSubmit"
      >
        <!-- 原生组件 -->
        <a-form-item label="原生组件">
          <a-input
            placeholder="请输入名称"
            v-decorator="['name', { rules: [{ required: true, message: '请输入名称!' }] }]"
          />
        </a-form-item>
        <!-- 自定义组件 -->
        <a-form-item label="自定义组件">
          <custom-input
            placeholder="请输入简介"
            v-decorator="['info', { rules: [{ required: true, message: '请输入名称!' }] }]"
          />
        </a-form-item>
        <!-- 提交按钮 -->
        <a-form-item label="提交按钮">
          <a-button type="primary" html-type="submit">Submit</a-button>
        </a-form-item>
      </a-form>
    </template>
    
    <script>
    import CustomInput from './CustomInput'
    export default {
      components: {
        CustomInput
      },
      data () {
        return {
          // 创建一个 Form 对象
          form: this.$form.createForm(this)
        }
      },
      methods: {
        // 提交按钮
        handleSubmit(e) {
          e.preventDefault()
          // 效验数据
          this.form.validateFields((err, values) => {
            if (!err) {
              console.log('Form表单数据效验成功:', values)
            }
          })
        }
      }
    }
    </script>
    
  • 使用效果,跟官方封装的组件比较,使用基本没一致

    temp.gif

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用 Ant Design Vue 的 `a-form` 表单时,自定义校验器可以使用 `validator` 属性来指定。默认情况下,校验器会对表单项进行非空判断。如果你想要自定义校验器但不想进行非空判断,可以在校验器函数手动判断。 例如,你可以定义一个自定义校验器函数来检查输入值是否为正整数: ```javascript const validatePositiveInteger = (rule, value, callback) => { if (value && !/^[1-9]\d*$/.test(value)) { callback(new Error('请输入正整数')) } else { callback() } } ``` 在这个例子,我们首先判断了输入值是否存在,如果存在,再使用正则表达式来判断输入值是否为正整数,如果不是,则调用 `callback` 函数并传递错误信息。如果输入值是正整数,则调用 `callback` 函数并传递一个空参数,表示校验通过。 然后,你可以在表单使用这个自定义校验器,并在 `rules` 属性指定它: ```html <a-form-item label="正整数"> <a-input v-model:value="value" /> </a-form-item> ``` ```javascript { data() { return { value: '' } }, setup() { const { validatePositiveInteger } = yourValidateFunctions const rules = { value: [ { required: true, message: '请输入值' }, { validator: validatePositiveInteger, message: '请输入正整数' } ] } return { rules } } } ``` 在这个例子,我们在 `rules` 属性定义了一个校验规则,其包括了一个非空校验规则和一个自定义校验规则。当表单项的值发生变化时,Ant Design Vue 会自动触发这些校验规则,然后根据校验结果来显示错误信息或者提交表单
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡尔特斯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值