欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > vue2 element-ui 中 el-radio 单选框点击事件失效问题

vue2 element-ui 中 el-radio 单选框点击事件失效问题

2025/4/20 10:19:00 来源:https://blog.csdn.net/liuguowei14/article/details/147307047  浏览:    关键词:vue2 element-ui 中 el-radio 单选框点击事件失效问题

前情提要

点进这篇文章的小伙伴,应该和博主一样,都是遇到了这种单选框可点击取消的需求。也就只有这种不同寻常的需求,才能让我们发现element框架的缺陷点,话不多说,下面博主来提供一个解决思路。

@click为什么无法触发

其实很简单,在vue中有一条规则,@函数 在自定义组件上使用时,监听的是该组件内部触发的自定义事件方法,所以当我们对组件使用 @click 方法时,就需要组件在内部设置一个 $emit(‘click’) 触发,我们观察下图el-redio的源码,可以发现其未对 click 函数进行绑定
在这里插入图片描述
这也就是为什么 el-radioclick事件无效,就是因为在el-radio组件内部并未监听 click 方法,所以我们的事件失效了。而在 element-ui 组件中大部分组件都对 click 进行处理了,所以出现无法点击的问题,我们第一时间都是怀疑自己哪调错了。

使用 @click.native 触发方式解决

知道了原因,我们选择正确的方法就行,小伙伴们还记得在 vue 中出现的事件修饰符吗,其中一个 vue2 特有的修饰符 .native 刚好满足我们的要求,它的作用就是专门用于监听组件根元素的原生的事件

vue2特有修饰符说明
.native监听组件根元素的原生事件
.sync双向绑定语法糖 (Vue 3 中已被 v-model 参数替代)

接着我们把代码中原本的 @click 改为 @click.native 并对元素进行一个判断,因为事件会向下捕获,我们进行一个元素名判断防止误触发,接着进行 setTimeout 延后处理,因为要取消功能必须保证click函数延后触发,不然会和单选框本身的选中逻辑有冲突,调整完成后我们可以尝试一下功能是否生效,

<template><el-radio v-model="select" :label="id" @click.native="select_Click($event,id)" />
</template>
<script>// methods 函数中select_Click(event, value) {// 处理点击元素if (event.target.tagName === 'INPUT') { return }const old = this.select // 记录一个过去值,防止判断出错setTimeout(() => {if (old === value) {this.select = ''}}, 0)}
</script>

完整演示示例

<template><el-radio v-model="select" :label="id" @click.native="select_Click($event,id)" />
</template>
<script>
export default {data() {return {id:1,select:''}    },methods:{select_Click(event, value) {// 处理点击元素if (event.target.tagName === 'INPUT') { return }const old = this.select // 记录一个过去值,防止判断出错setTimeout(() => {if (old === value) {this.select = ''// 如果 el-radio 嵌套层级深可增加// this.$forceUpdate()}}, 0)}    }
}
</script>

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com