vue中,修改checkbox的值时,没有触发change事件

1 问题描述

vue中,我用 v-model 将 checkbox 绑定到变量 flag 上。
但是,当我用 js 去修改 flag 的值时,却没有触发 checkbox 的 change 事件。

代码:

<!DOCTYPE html>
<html>
<head>
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
	<section id="app">
		<button @click="flag=!flag">切换!</button>
		<input type="checkbox" v-model="flag" @change="handleChange">
	</section>
	<script>
		var app = new Vue({
			el: '#app',
			watch: {
				flag(val) {
					console.log("监听到flag变化:", val);
				}
			},
			data: {
				flag: true,
			},
			methods: {
				handleChange() {
					console.log("触发change事件");
				}
			}
		})
	</script>
</body>
</html>

flag 的值发生变化,有两种可能:

  1. 用户通过鼠标点击checkbox:checkbox的勾选状态变了,flag的值变了,触发change事件
  2. 点击按钮,用 js 直接修改 flag 的值:checkbox的勾选状态变了,flag的值变了,但是没有触发change事件

如下图:
在这里插入图片描述


2 是 v-model 的bug吗?

在网上没有搜索到相关的内容。最后在vue官方教程中看到了:

在这里插入图片描述在这里插入图片描述
简单来说, v-model 的原理是:

  • 监听 checkbox 的 change 事件,用 checkbox 的 checked 属性的值去更新 flag。这样一来,用户通过鼠标点击等操作修改了checkbox 的值后,数据也会自动更新了!这就是常说的 vue双向绑定 中的 视图更新 => 数据更新
  • 监听 flag 值的变化,用 flag 去更新 checkbox 的 checked 属性。这是 vue双向绑定 中的 数据更新 => 视图更新

现在回头去看我遇到的问题:点击按钮,用 js 直接修改 flag 的值后,checkbox的勾选状态变了,但是 没有触发change事件

checkbox 的勾选状态改变了,说明 数据更新 => 视图更新 这条链没有问题,v-model 已经完成了它的使命。

我推测,可能问题不在 vue ,而在原生的 js 和 html 上!


3 大胆假设

我的猜想:用js去修改 checkbox 的 checked 属性,不会触发 change 事件

代码:

<body>
	<section id="app">
		<button onclick="alterCheckboxValue()">切换!</button>
		<input type="checkbox" id="checkbox1" onchange="handleChange()">
	</section>
	<script>
		function alterCheckboxValue() {
			const el = document.querySelector("#checkbox1");
			el.checked = !el.checked;
		}
		function handleChange(e) {
			console.log("触发change事件");
		}
	</script>
</body>

结果如下图,证实了猜想:

在这里插入图片描述


4 结论

用 js 去修改 checkbox 的 checked 属性,不会触发change事件

所以,想要全方位监听 checkbox 的变化,只能:

  1. 用户的操作用 change 事件监听
  2. 自己用 js 修改的时候,自己在后面写处理函数

5 补充

我测试了其他函数,总结如下:
用户操作和 js 修改都会触发的事件:

  • onscroll
  • onclick

用户操作会触发,用 js 修改不会触发的事件

  • selectonchange
  • input[type="checkbox"]onchange
  • input[type="text"]onchange

我猜测可能是因为表单元素是和用户交互的元素 ,所以被区别对待了

  • 18
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 当Vuecheckbox被选时,可以通过v-model指令绑定一个变量来获取选状态。同时,可以使用@change事件监听checkbox的变化,从而触发相应的事件处理函数。例如: ``` <template> <div> <input type="checkbox" v-model="isChecked" @change="handleCheck"> </div> </template> <script> export default { data() { return { isChecked: false } }, methods: { handleCheck() { if (this.isChecked) { // checkbox被选时的处理逻辑 } else { // checkbox被取消选时的处理逻辑 } } } } </script> ``` 在上述代码,当checkbox被选时,isChecked变量的值会变为true,从而触发handleCheck方法。在handleCheck方法,可以根据isChecked的值来执行相应的逻辑。 ### 回答2: VueCheckbox组件可以通过绑定v-model来实现选状态的绑定,而触发事件则可以通过对Checkbox事件绑定来实现。 Checkbox事件有三种:@click,@change和@input。 @click事件是在点击后立即触发的,不管Checkbox的选状态是否被改变,因此它适用于需要在点击后立即响应的场景。 @change事件是在选状态被改变后触发的,因此适用于需要在选状态改变后响应的场景。 @input事件也是在选状态被改变后触发的,但与@change不同的是,它在Checkbox状态被改变时并不会等待值的更新,而是立即触发,因此在绑定v-model后,它可以立即响应选状态的改变。 以下是一个简单的例子: ```html <template> <div> <input type="checkbox" v-model="isChecked" @change="handleChange" /> <p>{{isChecked}}</p> </div> </template> <script> export default { data() { return { isChecked: false }; }, methods: { handleClick() { console.log("clicked!"); }, handleChange() { console.log("changed!"); }, handleInput() { console.log("inputted!"); } } }; </script> ``` 以上代码Checkbox的选状态通过v-model和isChecked进行绑定,@change事件绑定在Checkbox上,在选状态改变时会触发handleChange方法,其余两个事件绑定同理。 需要注意的是,在使用Checkbox时,为避免触发多个事件,应该选择其一个事件绑定即可。 ### 回答3: Vue的复选框(checkbox)选触发事件通常有两种方式: 1. v-model绑定值 将复选框的选状态绑定至Vue实例的一个数据,可以在数据改变时触发相应的事件。例如: ```html <input type="checkbox" v-model="isChecked" @change="handleCheck"> ``` ```javascript export default { data() { return { isChecked: false } }, methods: { handleCheck() { if (this.isChecked) { console.log('已选') } else { console.log('未选') } } } } ``` 在上面的例子,当复选框选状态改变时,会触发change事件,然后执行handleCheck方法的相应逻辑。 2. 直接监听change事件 可以直接监听复选框的change事件,然后在事件回调函数处理相应逻辑。例如: ```html <input type="checkbox" @change="handleCheck"> ``` ```javascript export default { methods: { handleCheck(event) { const target = event.target if (target.checked) { console.log('已选') } else { console.log('未选') } } } } ``` 在上面的例子,通过监听change事件,获取到选状态的值,然后根据选状态的值执行相应的逻辑。 综上所述,Vue的复选框选触发事件可以通过v-model绑定值或直接监听change事件来实现,具体方式可以根据自己的使用场景和需求来选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值