Vue里methods和computed的易死循环的错误操作
发布于 7 年前 作者 acer_vue 7863 次浏览 最后一次编辑是 7 年前 来自 分享
粉丝福利 : 关注VUE中文社区公众号,回复视频领取粉丝福利

本人才刚接触vue几天,在写demo试手的时候发现了两个容易造成死循环的错误操作,而官方文档对此细节描述的不多,也没看到什么人说,就分享下。

1、调用表达式绑定和属性绑定 先上代码:

<div>{{test()}}</div>


data:{
    a:0,  
},
methods:{
    test:function(){
        this.a++;
        return this.a++;
    }
}

这个大家应该都踩过,实际就是数据绑定时若采用表达式,每次dom更新的时候,绑定的表达式都会重新执行。从而造成test()→属性a变化→dom更新→执行test()→…从而造成死循环。 2、compute里触发事件 一样先上代码:

<div id="test" > test:{{test}} </div>


 var vm = new Vue({
       el:'#test',
       data:{
           a:0,
           b:0,
       },
       created:function () {
           this.$on('change',this.add)
       },
       computed:{
           test:function () {
               this.$emit('change');
               console.log('计算属性执行');
               return this.a;
           }
       },
       methods:{
           add:function () {
               this.b++;
           }
       }
   })

在浏览器控制台输入 ‘vm.b++’,你会惊奇的发现 ‘计算属性执行’也被打印出来了,说明test()方法居然和属性b关联在一起了,发现的时候我都惊了。 大家知道Vue子组件是通过事件同父元素通信,若你在计算属性computed里触发事件,多个组件之间非常容易触发死循环(我就不说我花了整整半天才找到原因)。

通过上面的例子,感觉vue实质上应该有个规范,computed、methods、watch等应该进行哪些操作,不该执行哪些操作。不然很容易踩坑 以上便是我个人分享,毕竟才接触vue几天,若有不对的地方,欢迎大家指出。

回到顶部