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函数延后触发,不然会和单选框本身的选中逻辑有冲突,调整完成后我们可以尝试一下功能是否生效,

html 复制代码
<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>

完整演示示例

html 复制代码
<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>
相关推荐
一 乐12 分钟前
家政服务管理系统|基于springboot + vue家政服务管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·家政服务管理系统
独泪了无痕3 小时前
Vue3中防御XSS攻击的“特效药”-DOMPurify
前端·vue.js·安全
云水一下3 小时前
Vue.js从零到精通系列(五):全局状态管理——Pinia 核心与实践
前端·javascript·vue.js
老马聊技术4 小时前
AI对话功能之SpringBoot整合Vue3
vue.js·人工智能·spring boot·后端
英勇无比的消炎药5 小时前
一站式汇总TinyVue工具案例与真实落地经验
vue.js·前端框架
梵得儿SHI7 小时前
Vue 项目实战与性能优化全攻略:从代码、渲染到首屏,一站式解决卡顿慢加载
前端·vue.js·性能优化·vite·前端面试·前端优化·首屏优化
一 乐9 小时前
幼儿园管理系统|基于springboot + vue幼儿园管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·幼儿园管理系统
云水一下9 小时前
Vue.js从零到精通系列(七):高级特性实战——Teleport、异步组件、自定义指令与TypeScript深度结合
前端·vue.js·typescript
qq4356947019 小时前
Vue05
前端·vue.js
英勇无比的消炎药9 小时前
收藏备用TinyVue开发高频踩坑问题合集
vue.js