首页 > 其他 > 详细

computed和watch区别

时间:2021-04-19 11:11:31      阅读:17      评论:0      收藏:0      [点我收藏+]
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>浅谈computed的原理</title>
</head>

<body>
  <div id="app">
    <p> 姓<input type="text" v-model="firstName"></p>
    <p> 名<input type="text" v-model="lastName"></p>
    <p> 姓名<input type="text" v-model=‘fullName‘>单项数据绑定</p>
    <!-- 这里有访问fullName  所以相当于get访问时调用一次  在页面加载的时候就调用 -->
    <p> 姓名1<input type="text"><input type="text" v-model="fullName1"></p>
    <p> 姓名2<input type="text"><input type="text" v-model=‘fullName2‘></p>

    ------
    <p> 姓名2<input type="text"><input type="text" v-model=‘fullName2‘></p>
    <p> 姓名2<input type="text"><input type="text" v-model=‘fullName2‘></p>
    <p> 姓名2<input type="text"><input type="text" v-model=‘fullName2‘></p>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    var vm = new Vue({
      el: ‘#app‘,
      data: {
        firstName: ‘A‘,
        lastName: ‘B‘,
        fullName1: ‘‘
      },
      computed: {
        /*
 1、vue控制的所有回调的this都是vm/组件对象
 2、vue的vm定义一些与data中的属性对应的属性
 同名
 比如log.vue中的this其实相当于log.new String(‘abc‘) 一个有值的string类型 为什么不是打印‘abc‘呢,
 同理Vue也是构造函数,所以打印的结果 你可以看到里面有一个_data属性与data属性同名,就是vm实例对象构造的
 换句话说vm实例对象上的_data里的值是get方法得到了包装类里的实参data的值


 getter方法:当通过vm.xxx = value 读取新的值时,读取data对象中同名属性的值
 setter方法:当通过vm.xxx = value 指定新的值时,值就保留在data中对应的属性上
 数据代理:vm._data.xxx ===> vm.data  通过vm代理对vm内部的data对象的属性的操作(读/写)

*/
        fullName() {
          console.log(‘fullName get()‘, this);

          return this.firstName + ‘-‘ + this.lastName
        },
        fullName2: {
          get() {
            console.log(‘fullName2 get()‘);

            return this.firstName + ‘-‘ + this.lastName
          },
          // 监视属性值变化的时候 该做什么(更新firstName和lastName)
          set(val) {
            console.log(‘fullName2 set()‘);
            this.firstName = val.split(‘-‘)[0]
            this.lastName = val.split(‘-‘)[1]
          }
        }
      },
      watch: {
        firstName: function (value) {
          console.log(‘watch firstName‘);
          this.fullName1 = value + ‘-‘ + this.lastName
        }
      }
    })
    // $watch说明前面调用者是new Vue的实例对象  实例使用$调用属性用于区别你自己定义的方法,代表这是Vue的方法
    vm.$watch(‘lastName‘, function (value) {
      console.log(‘watch lastName‘);
      this.fullName1 = this.firstName + ‘-‘ + value

    })
// 看到这里相信大家也明白了watch和computed的区别,虽然watch的浅显用法是和computed的get()函数是一样的
// 但是watch在页面一开始的时候并不会监听 只会读取data中定义的数据先,而computed可以不用在data中定义,页面一加载凡是用到了这个值就会触发get方法
// 然后就是watch有深度监听的作用(计算属性特征:有缓存,多次读取只执行一次getter计算,提高性能)

// 补充:其实computed计算属性缓存,其实一开始页面刷新就是去computed容器里面找是否有这个缓存的属性值,如果没有,而刚好页面加载需要读取,那么就自动执行computed里的get()回调函数执行,进行计算return后的值并保存在computed对象容器里。那么下一次只要没改变依赖的数据从而触发set回调的操作的话,那么就第一时间去computed容器缓存里取数据,也就不会进行重复计算啦。我是小曹,有更多问题欢迎留言!
  </script>
</body>

</html>

computed和watch区别

原文:https://www.cnblogs.com/coderwhytop/p/14675319.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!