首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Vue中computed和watch比较

Vue中computed和watch比较

作者头像
wade
发布2020-04-24 17:17:04
6740
发布2020-04-24 17:17:04
举报
文章被收录于专栏:coding个人笔记coding个人笔记

Vue在监听数据的时候我们都会用computed和watch,但是很少人真正的去比较两个的区别,一般都是能实现就行。本人也是,习惯了watch,之后就几乎没用过computed。所以用官网的例子理解一下这两者的区别。

computed: {
    // 计算属性的getter
    reversedMessage: function () {
console.log('调用了');
    return this.message.split('').reverse().join('');
  }
},
默认是getter方法,在页面中直接使用{{reversedMessage}}。官网上说用methods也能实现相同的功能。
methods: {
    reversedMessage: function () {
console.log('调用了');
    returnthis.message.split('').reverse().join('');
  }
}

页面使用{{reversedMessage()}}

然而不同的地方就在于计算属性computed有缓存。当我们连续调用计算属性:

console.log(vm.reversedMessage) console.log(vm.reversedMessage) console.log(vm.reversedMessage)

你会发现计算属性是基于它们的依赖进行缓存的。只在相关依赖发生改变时它们才会重新求值。这就意味着只要 message 还没有发生改变,多次访问 reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数。

Methods就不同,你要是多次调用:

{{reversedMessage()}} {{reversedMessage()}} {{reversedMessage()}}

那么这个方法就会执行多次。

至于为什么需要缓存,在计算性能开销较大的时候,在依赖不变的时候就不用执行方法。

watch也是监听属性,跟computed一样也是依赖的改变了就会改变,不同的是,当你一个数据关联两个数据的时候,watch两个数据还不如直接一个computed。

firstName: 'Foo',
lastName: 'Bar',
fullName: 'Foo Bar'
fullName依赖于firstName和lastName,如果我们要用watch,那么就要监听两个数据
watch: {
    firstName: function (val) {
      this.fullName = val + ' ' +this.lastName
    },
    lastName: function (val) {
      this.fullName = this.firstName + '' + val
    }
  }
使用计算属性computed:
fullName: function () {
      return this.firstName + ' ' +this.lastName
    }

这就是watch和computed在选择使用的时候要考虑的一个重要因素,另外一个重要因素是官网所说的当需要在数据变化时执行异步或开销较大的操作时,watch方式是最有用的。简单来说就是涉及异步操作然后需要设定不同中间值等,这时候就使用watch。

Computed还有一个setter方法:

fullName: {
    // getter
    get: function () {
        console.log('get');
        return this.firstName + ' ' +this.lastName;
    },
    // setter
    set: function (newValue) {
        this.firstName = '120';
        this.lastName = '021';
        console.log('set');
    }
}

然后我们调用:

vm.fullName = 'John Doe';

你会发现,首先触发set方法,然后执行get方法,得到的结果是120 021,这就表明我们需要验证一些数据然后要根据验证得到不同的结果的时候我们就可以使用set进行逻辑验证然后设置对应的结果,最后通过get方法得到最终的结果。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 coding个人笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档