computed vue 不 触发_vue computed使用注意

本文围绕Vue中computed不触发的问题展开。页面需求是数组有内容且勾选框选中时提交按钮点亮,使用computed判断。但list为空时,改变check无法改变computed结果。分析发现这与computed原理有关,给出规避方法,确保变量都执行getter。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前在介绍过vue computed原理分析:vue computed原理分析,今天来看一个我遇到的关于computed比较奇怪的问题:

需求比较简单,一个页面上有一个勾选框,还有一个数组(列表,可以通过按钮添加),需要数组中有内容并且是选中状态提交按钮才会点亮。代码如下:

至少添加一个项目且勾选才能提交

添加项目

  • {{item}}

是否勾选

提交

const app = new Vue({

el: '#app',

data: {

check: false, //是否选中

list: [],

value: '',

},

computed: {

canSubmit: function() {

console.log('触发执行canSubmit');

return this.list.length && this.check;

}

},

mounted: function() {

},

methods: {

addItem: function() { //增加项目

if(this.value) {

this.list.push(this.value);

this.value = '';

}

}

}

})

其中按钮点亮用的是一个computed:canSubmit,根据list和check判断:return this.list.length && this.check;

因为computed中同时关联了check和list,那么按理说check或list发生变化的时候,canSubmit应该变化的,但是看上图可以发现,当list为空的时候(未添加),触发check的时候,canSubmit并无任何变化!!

虽然这个小细节并不影响整体的功能,但是我们仔细思考一下,为什么当list为空的时候,改变check无法改变canSubmit呢?

问题分析

这个其实和computed的实现原理有关,不太熟悉的朋友,可以点进文章开头的链接去看看原理。computed之所有可以关联多个变量,是因为执行computed方法的时候,内部调用了data上的对象,(list,check),执行了getter,才会让Dep和Watcher关联上。

我们的方法是return this.list.length && this.check;第一个条件为false,那么第二个条件自然也就不执行了,因此check和canSubmit之间没有关联关系。只有list和canSubmit的关联关系。所以当list没有数据的时候,修改check并不会改变canSubmit。

但是当list有数据的时候,canSubmit会执行,此时的this.list.length得到的true,会执行到this.check,因此此时check又和canSubmit恢复了绑定关系。

问题规避

通过上面的分析可以得到,如果变量直接和&&,||之类一起执行的时候,可能导致不执行,因此我们要确保变量都执行了getter:

computed: {

canSubmit: function() {

let len=this.list.length,

_check=this.check;

return len && _check;

}

},

改成上面那样,无论list有没有数据,都可以取保执行了this.check,那么check就和canSubmit就可以保持关联了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值