自定义表单元素组件内容变化触发ElForm重新校验

对于下图中“付费类型”怎么实现有很多种方式,我能想到的是以下两种:

  1. Element Plus的RadioButton
  2. 自定义组件
    在这里插入图片描述

1. RadioButton

它本质上就是一个单选组件,它跟Element Plus的RadioButton本质上没有区别,无非是外观上的差别。那么我们就可以复用RadioButton的逻辑功能,而通过修改样式的方式达到上图的视觉效果。其实,我一般都选则第二种方式,自定义组件,原因是直到今天我才想到可以用RadioButton来实现:(
在这里插入图片描述

2. 自定义组件

写一个FeeTypeSelector的组件,它的属性大概是这样的

interface FeeTypeSelectorProps {
	modelValue: string;
	data: FeeTypeSelectorItem[]; // 可选项的数据
}

interface FeeTypeSelectorItem {
	value: string;
	text: string;
	....
}

...

通过接收参数modelValue和触发update:modelValue让FeeTypeSelector组件支持v-model。至此这个组件就大致上写好了。把它放入带有规则的FormItem中,也能正常的校验。不过我今天发现,Element Plus的表单输入组件在有校验错误后再次输入正确的值后校验错误会自动消失,而不需要点击提交按钮调用form.validate方法,而上面的自定义组件就不能。其实以前也知道有这个问题,当时就没当回事,今天下定决心要去解决这个问题,就去翻看了Element Plus的源码,直接说结果吧,过程也没人爱看。
自定义组件内部watch一下modelValue,变化的话调用FormItem的validate方法,代码如下:

import { useFormItem } from 'element-plus'
const { formItem } = useFormItem()
watch(() => props.modelValue, () => {
	if (props.validateEvent) {
    	formItem?.validate?.('change').catch((err) => console.warn(err))
  	}
})

本来是想介绍一下在重新输入后怎么消除自定义组件的报错信息的,经过这一番思考,我的想法有了变化,优先借助Element Plus现有的表单元素组件(即方法1),如果真的不能实现了我才会自定义表单元素组件

如果对你有帮助,帮忙点赞哈,嘻嘻:)

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以通过在子组件中使用`v-model`指令,并将父组件表单校验状态作为`v-model`的绑定值,来避免父组件表单校验触发组件的输入框。具体步骤如下: 1. 在父组件中定义表单校验状态,并将其作为`v-model`的绑定值传递给子组件。 2. 在子组件中使用`v-model`指令绑定输入框的值,并将其绑定到子组件的数据属性上。 3. 在子组件中使用`watch`监听父组件传递的表单校验状态,当表单校验状态发生变化时,根据需要进行相应的处理。 下面是一个示例代码: ```vue <!-- 父组件 --> <template> <div> <form> <child-component v-model="formValid"></child-component> <button @click="validateForm">校验表单</button> </form> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { formValid: false }; }, methods: { validateForm() { // 校验表单逻辑 } } }; </script> <!-- 子组件 --> <template> <div> <input v-model="inputValue" type="text"> </div> </template> <script> export default { props: ['value'], data() { return { inputValue: '' }; }, watch: { value(newValue) { // 根据父组件传递的表单校验状态进行相应的处理 } } }; </script> ``` 在上述示例中,父组件通过`v-model`将表单校验状态`formValid`传递给子组件,并在子组件中使用`watch`监听`value`属性的变化。当父组件表单校验状态发生变化时,子组件可以根据需要进行相应的处理,例如禁用输入框或显示错误提示信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值