watch、computed和methods的比较

watch、computed和methods的比较

先看computed和methods的比较

computed是计算属性,methods是方法,都可以实现对 data 中的数据加工后再输出。不同的是 computed计算属性是基于它们的依赖进行缓存的。计算属性 computed 只有在它的相关依赖发生改变时才会重新求值。这就意味着只要data 中的数据message 还没有发生改变,多次访问 reversedMessage(对message 进行加工的处理函数)计算属性会立即返回之前的计算结果,而不必再次执行函数。而对于method ,只要发生重新渲染,method调用总会执行该函数。当有一个性能开销比较大的的计算属性 A ,它需要遍历一个极大的数组和做大量的计算。 然后我们可能有其他的计算属性依赖于 A ,这时候,我们就需要缓存。也就是使用 computed 而不是methods。但对于每次都需要进行重新计算的属性比如下面这个函数的返回值 function () { return Date.now()} ,我们最好使用 methods。总之:数据量大,需要缓存的时候用 computed ;每次确实需要重新加载,不需要缓存时用methods

这短话有借用别人的博客的内容,但是这是比较早的笔记,没有记录是谁的,所以就直接这样引用了,语言不是讲的很清楚,上代码就看的很明白了

<div id ="app"> 
    <input type="text" v-model="firstName">+
    <input type="text" v-model="lastName">=
    <input type="text" v-model="fullName">
    <h2>{{fullName}}</h2>
    <h2>{{fullName}}</h2>
    <h2>{{fullName}}</h2>
    <h2>{{getFullname()}}</h2>
    <h2>{{getFullname()}}</h2>
</div>
<script>
   let app = new Vue({
      el: '#app',
      data: {
          firstName:"",
          lastName:""
      },
      methods: {
          getFullname:function(){
              console.log("getFullname");
              return this.firstName + ' ' + this.lastName;
          }
      },
      computed:{
          fullName:function(){
              //每当这里面使用的data中的数据发生改变时才会调用一次这个方法
              console.log("fullName");
              return this.firstName + ' ' + this.lastName;
          }
      },
   });
</script>

因为computed会检查缓存中的数据有没有变化,只要computed中的函数引用的data里面的数据,那么就只会输出一个fullName
在这里插入图片描述
不过computed不支持异步,当computed内有异步操作时无效,无法监听数据的变化,其实computed有setter和getter的属性,不过一般情况下是不使用setter的方法,是只读属性,要写成set和get也可以

fullName:function(){
    set:function(data){
        const names = data.split(" ");
        firstName = names[0];
        lastName = names[1];
    },
    get:function(){
         return this.firstName + ' ' + this.lastName;
    }
}

监听属性watch:

而侦听器 watch 是侦听一个特定的值,当该值变化时执行特定的函数。例如分页组件中,我们可以监听当前页码,当页码变化时执行对应的获取数据的函数,还可以监听this.$route.path的路径改变,这个最好监听一下那些比较虚拟的数据变化,

基本的监听方法

<input type="text" v-model="firstName">+
<input type="text" v-model="lastName">=
<input type="text" v-model="fullName">
data: {
    firstName:"",
    lastName:"",
    fullName:""
},
watch:{
    firstName: function (nawVal,oldVal) {
        this.fullName = newVal + ' ' + this.lastName
    },
    lastName: function (nawVal,oldVal) {
        this.fullName = this.firstName + ' ' + nawVal
    }
}

不过要注意,watch不可以使用箭头函数
watch的其他使用方法:
基本的监听有个不足的地方就是我们在初始值的时候不会执行handler方法。为了解决这个问题我们就需要用到immediate属性了
使用场景:父组件向子组件动态传值时,子组件props首次获取到父组件传来的默认值时,也需要执行函数,这时只需要将immediate设为true就行了

watch: {
    fullName: {
        immediate: true,
        handler(val) {
            console.log(val)
        }
    }
} 

上面的两种方法监听一个对象的变化时,普通的watch方法无法监听到对象内部属性的变化,这时就需要使用deep属性对对象进行深度监听

data: {
    student: {id: 1, name: "none",sex: "男"}
},
watch: {
    student: {
        handler(val) {
            console.log(val)
        },
        deep: true,
    }
} 

computed和watch的区别

1、
computed计算属性都会有一个返回值,他依赖于多个data中的数据进行计算
watch只依赖于一个数据进行监视,watch没有返回值
2、
computed支持缓存,只有依赖数据发生改变,才会重新进行计算
watch不支持缓存,数据变,直接会触发相应的操作
3、
computed不支持异步,当computed内有异步操作时无效,无法监听数据的变化
watch支持异步

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值