zoukankan      html  css  js  c++  java
  • watch和computed区别 及二者使用场景

    1、区别

    watch中的函数是不需要调用的
    computed内部的函数调用的时候不需要加()   (内部的不是函数,而是属性对象只有get方法时的简写,其实它是属性对象
     
    watch  属性监听 监听属性的变化
    computed:计算属性通过属性计算而得来的属性
     
    watch需要在数据变化时执行异步或开销较大的操作时使用
    对于任何复杂逻辑或一个数据属性在它所依赖的属性发生变化时,也要发生变化,这种情况下,我们最好使用计算属性computed。 
     

    computed 属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算。主要当作属性来使用;

    computed中的函数必须用return返回最终的结果

    当computed中的函数所依赖的属性如果没有发生改变的时候,那么调用当前函数的时候结果会从缓存中读取

    watch 一个对象,键是需要观察的表达式,值是对应回调函数。主要用来监听某些特定数据的变化,从而进行某些具体的业务逻辑操作;

    2、使用场景
    computed     
        当一个属性受多个属性影响的时候就需要用到computed
        最典型的例子: 购物车商品结算的时候
    watch
        当一条数据影响多条数据的时候就需要用watch
        搜索数据
     
     
     
    data: {
        firstName: 'Foo',
        lastName: 'Bar'
      },
      computed: {
      fullName:{
       get(){//回调函数 当需要读取当前属性值是执行,根据相关数据计算并返回当前属性的值
          return this.firstName + ' ' + this.lastName
        },
       set(val){//监视当前属性值的变化,当属性值发生变化时执行,更新相关的属性数据   (当fullName的值改变时就会执行set方法)
           //val就是fullName的最新属性值
           console.log(val)
            const names = val.split(' ');
            console.log(names)
            this.firstName = names[0];
            this.lastName = names[1];
       }
       }
      }






    handler方法和immediate属性

    
    

    这里 watch 的一个特点是,最初绑定的时候是不会执行的,要等到 firstName 改变时才执行监听计算。那我们想要一开始就让他最初绑定的时候就执行改怎么办呢?我们需要修改一下我们的 watch 写法,修改过后的 watch 代码如下:

    
    
    watch: {
      firstName: {
        handler(newName, oldName) {
          this.fullName = newName + ' ' + this.lastName;
        },
        // 代表在wacth里声明了firstName这个方法之后立即先去执行handler方法
        immediate: true
      }
    }
    
    

    注意到handler了吗,我们给 firstName 绑定了一个handler方法,之前我们写的 watch 方法其实默认写的就是这个handler,Vue.js会去处理这个逻辑,最终编译出来其实就是这个handler

    
    

    immediate:true代表如果在 wacth 里声明了 firstName 之后,就会立即先去执行里面的handler方法,如果为 false就跟我们以前的效果一样,不会在绑定的时候就执行。

    当我们在在输入框中输入数据视图改变obj.a的值时,我们发现是无效的。受现代 JavaScript 的限制 (以及废弃 Object.observe),Vue 不能检测到对象属性的添加或删除。由于 Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让 Vue 转换它,这样才能让它是响应的。

    默认情况下 handler 只监听obj这个属性它的引用的变化,我们只有给obj赋值的时候它才会监听到,比如我们在 mounted事件钩子函数中对obj进行重新赋值:

    watch: {
      obj: {
        handler(newName, oldName) { //特别注意,不能用箭头函数,箭头函数,this指向全局
          console.log('obj.a changed');
        },
        immediate: true,  //刷新加载 立马触发一次handler
        deep: true  // 可以深度检测到 obj 对象的属性值的变化
      }
    }

    deep的意思就是深入观察,监听器会一层层的往下遍历,给对象的所有属性都加上这个监听器,但是这样性能开销就会非常大了,任何修改obj里面任何一个属性都会触发这个监听器里的 handler。

     深度监听,为了发现对象内部值的变化,复杂类型的数据时使用,例如数组中的对象内容的改变,注意监听数组的变动不需要这么做。

    优化,我们可以是使用字符串形式监听。

    watch: {
      'obj.a': {
        handler(newName, oldName) {
          console.log('obj.a changed');
        },
        immediate: true,
        // deep: true
      }
    }

    这样Vue.js才会一层一层解析下去,直到遇到属性a,然后才给a设置监听函数。

     

    ---------------------------------------------------------------------------------------------------------

    2021-01-11

    使用watch时有一个特点,就是当值第一次绑定的时候,不会执行监听函数,只有值发生改变才会执行。如果我们需要在最初绑定值的时候也执行函数,则就需要用到immediate属性。 

    handler方法和immediate属性

    当父组件向子组件动态传值时,子组件props首次获取到父组件传来的默认值时,也需要执行函数,此时就需要将immediate设为true

    之前我们写的 watch 方法其实默认写的就是这个handler,Vue.js会去处理这个逻辑,最终编译出来其实就是这个handler。

    immediate:true代表如果在 wacth 里声明了 viewDetials之后,就会立即先去执行里面的handler方法,如果为 false就跟我们以前的效果一样,不会在绑定的时候就执行

    deep属性

    watch 里面还有一个属性 deep,默认值是 false,代表是否深度监听当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变,只有data中的数据才能够监听到变化,此时就需要deep属性对对象进行深度监听。

    设置deep: true 则可以监听到newTemplateForm 的变化,此时会给newTemplateForm 的所有属性都加上这个监听器,当对象属性较多时,每个属性值的变化都会执行handler。如果只需要监听对象中的一个属性值,则可以做以下优化:使用字符串的形式监听对象属性:'newTemplateForm .cycleUpkeep'

     

  • 相关阅读:
    如何使用dom拼接xml字符串(标准方式)
    javascript默认将数字类型的“002,00123”,作为整数,去掉前面的0
    java学习小记
    如何将div排成一行显示(默认垂直显示)
    【转】JDBC调用存储过程之实例讲解
    数组求和算法系列
    《12个球问题》分析
    C#类在什么时候分配内存
    C++请不要问我string s=”a”+”b”分配了几次内存
    算法两道百度笔试题
  • 原文地址:https://www.cnblogs.com/ygyy/p/13653101.html
Copyright © 2011-2022 走看看