需求:突然客户提了个需求,想在原来的系统上做一个这样的操作,就是可以取消选中的单选按钮,我当时心里想,( 你不要选不就完了吗?但是我不能这样说)。我就说下来看看可以做不。
查文档:查了一下radios的文档,发现它只绑定了change事件,如果想做点击取消的效果,肯定是用不了的,只能用click事件。就加上了试试看。首先是加了不起效果,需要添加native绑定原生事件,将radios的label值作为参数传递过去,如果点击的是同一个按钮,就在队列里面添加一个事件,等所有的同步事件处理完成之后,在处理异步的事件,就是写在定时器里面的内容。可以给radios藜麦赋值为不一样的值,就会有取消的效果,但是需要和后端协商一下,传递的数据的格式,是不是要保留一些固定的格式,val值传递什么值。
0.组件里面的元素有可能使用不了事件修饰符,可以在时间修饰符后面添加native解决。
1.因为el-input是el-radios的子元素,所以在点击的时候,会触发el-radios的点击事件,所以就想到了事件修饰符,但是使用的时候就遇到了问题,发现没有效果。查了资料才知道,需要加native.stop可以实现。
2.没有方法的元素也可以添加click事件,可以不用写方法。
<el-radio v-for="item in dataList" :key="item.id" v-model="input" :label="item.val" :disabled="iscz == '1' ? false : true" @change="change" @click.native。stop="clickradios(item.val,$event)" :class="item.issr == 1 ? 'hasinput' : ''" :style="'width:' + width">
{{ item.name }}
<el-input v-if="item.issr == '1'" type="textarea" height="40px" autosize style="margin-left: 10px" placeholder="请输入内容" :disabled="iscz == '1' ? false : true" v-model="model" :class="model == '' ? 'cred' : ''" @change="inputChange" @click.native.stop >
</el-input>
</el-radio>
methods: {
clickradios (val, e) {
// 因为原生click事件会执行两次,第一次在label标签上,第二次在input标签上,故此处理
// console.log(e.target.tagName);
if (e.target.tagName === 'INPUT') return;
if (this.input == val) {
// 写一个异步的操作,等change事件完成会后在进入里面的代码
setTimeout(() => {
// 点击了一样的按钮
//返回参数
this.parentList = '-1'
this.return()
}, 500)
}
},
change: function (data) {
//单选按钮改变
this.parentList = this.setObj(data);
//讲参数名,以及数据传递给父组件
this.return();
},
}
ps:重点就是click事件不会触发,且会在触发了click事件之后再调用change事件,需要做的就是利用事件循环机制将操作在异步容器里面执行,就是常用的定时器。就可以实现操作了!耶,又解决一个问题!希望能帮到大家。