Vue中的computed和watch的区别

举报
青年码农 发表于 2022/08/24 23:41:10 2022/08/24
【摘要】 Vue项目开发中,有这么两个属性比较容易混淆,如果不特别注意,用法比较相似,这两个属性就是computed和watch,其实这两个还是有很大差别,下面就讲讲这两个属性的用法及不同 先说说为什么比较像,我们看下面代码。 <template>  <div> &nbsp...

Vue项目开发中,有这么两个属性比较容易混淆,如果不特别注意,用法比较相似,这两个属性就是computed和watch,其实这两个还是有很大差别,下面就讲讲这两个属性的用法及不同

先说说为什么比较像,我们看下面代码。


   
  1. <template>
  2.   <div>
  3.     <input type="text" v-model="a" />
  4.     <div>a={{ a }}</div>
  5.     <div>b={{ b }}</div>
  6.     <div>c={{ c }}</div>
  7.   </div>
  8. </template>
  9. <script>
  10. export default {
  11.   data() {
  12.     return {
  13.       a: 1,
  14.       c: 0
  15.     }
  16.   },
  17.   watch: {
  18.     a(val) {
  19.       console.log(val)
  20.       this.c = val + '数据'
  21.     }
  22.   },
  23.   computed: {
  24.     b: function() {
  25.       return this.a + '数据'
  26.     }
  27.   }
  28. }
  29. </script>

c8df5636bbb1a2bc5ff8a09c9a03d739.gif

通过代码和gif可以看到当我输入框在变的情况下,b和c数据始终保持一致,这种效果项目中可能会用到。所以说很多人容易混淆,分不清用法。接下来就说说他们的用法和不同。

1 computed:计算属性

computed官方定义计算属性,模板内使用表达式是非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。所以,对于任何复杂逻辑,你都应当使用计算属性。


   
  1. <template>
  2.   <div>
  3.     <input type="text" v-model="a" />
  4.     <br />
  5.     <button @click="setb()">设置b</button>
  6.     <div>a={{ a }}</div>
  7.     <div>b={{ b }}</div>
  8.   </div>
  9. </template>
  10. <script>
  11. export default {
  12.   data() {
  13.     return {
  14.       a: ''
  15.     }
  16.   },
  17.   computed: {
  18.     b: {
  19.       get: function() {
  20.         console.log('获取b')
  21.         return this.a
  22.       },
  23.       set: function(val) {
  24.         console.log('设置b值')
  25.         console.log('传入值:' + val)
  26.         console.log('b值:' + this.b)
  27.       }
  28.     }
  29.   },
  30.   methods: {
  31.     setb() {
  32.       this.b = 1
  33.     }
  34.   }
  35. }
  36. </script>

7487a2ce2e4d204ccf36e85edfd4207f.gif

当我们点击按钮“设置b”时,我们会给b设置一个值“1”,通过set方法可以获取到设置的值,但是我们打印b值,其实是没有变化的。computed里的数据有get和set方法,但是我们常用的是get方法,一般很少用set方法。

从上面可以看出,computed支持缓存,属性值会默认走缓存,只有基于data中声明过或者父组件传递的props中的数据通过计算得到的值发生改变,才会重新进行计算。

强调一点,使用computed的数据不能在data中声明,否则会提示错误,并且函数也不在执行。

671f19ad615584d4fa54a262c6f005e1.png

2 watch:监听属性

虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器。这就是为什么 Vue 通过 watch 选项提供了一个更通用的方法,来响应数据的变化。当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。


   
  1. <template>
  2.   <div>
  3.     <input type="text" v-model="a" />
  4.     <div>a={{ a }}</div>
  5.     <div>c={{ c }}</div>
  6.   </div>
  7. </template>
  8. <script>
  9. export default {
  10.   data() {
  11.     return {
  12.       a: '',
  13.       c: ''
  14.     }
  15.   },
  16.   watch: {
  17.     a(val) {
  18.       console.log(val)
  19.       this.c = val + '数据'
  20.     }
  21.   }
  22. }
  23. </script>

bf27f6b2dd8d889253cf16a501703b52.gif

上面的代码是,监听a,如果a发生变化,就在a的后面加上“数据”,把值保存给c。watch监听不支持缓存,数据发生变化,会直接触发相应的操作,监听的函数接收两个参数,第一个参数是最新的值;第二个参数是输入之前的值;具体内容请参考另外一篇文章

Vue中watch的详细用法

注:监听的数据必须是data中声明的或者父组件传递过来的数据。

3 总结

Computed特点:
需要主动调用,具有缓存能力只有数据再次改变才会重新渲染,否则就会直接拿取缓存中的数据。

Watch特点:
无论在哪只要被绑定数据发生变化Watch就会响应,这个特点很适合在异步操作时用上。

文章来源: blog.csdn.net,作者:NMGWAP,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/NMGWAP/article/details/125067090

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。