zoukankan      html  css  js  c++  java
  • Vue中computed和watch使用场景和方法

    watch和computed都是以Vue的依赖追踪机制为基础,它们都试图处理这样一件事情:当某一个数据(称它为依赖数据)发生变化的时候,所有依赖这个数据的“相关”数据“自动”发生变化,也就是自动调用相关的函数去实现数据的变动

    methods用来定义函数,它需要手动调用才能执行,需要像”fuc()”这样去调用它(假设函数为fuc)

    computed是计算属性,事实上和data对象里的数据属性是同一类的(使用上),在取值的时候,用this.fullName去取用,就和取data一样(不要当成函数调用!!)

    watch和computed各自处理的数据关系场景不同:

    1. watch擅长处理的场景:一个数据影响多个数据
    2. computed擅长处理的场景:一个数据受多个数据影响

    computed 和 methods相比,computed有缓存,性能开销小,何谓computed缓存呢?
    在改变number(任一跟computed中不相关的数据)时,整个应用会重新渲染,如果使用的是getName ()方法,则这个方法会被重复调用

    而computed不会重新计算,只有依赖的值有变化时(该案例中,number不是computed依赖的值),才会去重新计算,这就是computed的缓存

    import Vue from 'vue'
     
    new Vue({
      el: '#root',
      template: `
        <div>
          <p>Name: {{name}}</p>
          <p>Name: {{getName()}}</p>
          <p>Number: {{number}}</p>
          <p>FullName: {{fullName}}</p>
          <p><input type="text" v-model="number"></p>
          <p>FirstName: <input type="text" v-model="firstName"></p>
          <p>LastName: <input type="text" v-model="lastName"></p>
          <p>Name: <input type="text" v-model="name"></p>
          <p>Obj.a: <input type="text" v-model="obj.a"></p>
        </div>
      `,
      data: {
        firstName: 'Wang',
        lastName: 'HaiLi',
        number: 0,
        fullName: '',
        obj: {
          a: 0
        }
      },
      computed: {
        name: {
          get () {
            console.log('new name')
            return `${this.firstName} ${this.lastName}`
          },
          set (name) {
            const names = name.split(' ')
            this.firstName = names[0]
            this.lastName = names[1]
          }
        }
      },
      watch: {
        'obj.a': {
          handler () {
            console.log('obj.a changed')
            // this.obj.a += 1 // 不要在watch和computed修改当前值,会无限循环
          },
          immediate: true // 默认只有数据改变才会监听,第一次不会执行,设置true则第一次也能执行
          // deep: true
        }
      },
      methods: {
        getName () {
          console.log('getName invoked')
          return `${this.firstName} ${this.lastName}`
        }
      }
    })




    原文链接:https://www.jianshu.com/p/4f2c995b64bc

  • 相关阅读:
    第09组 Beta版本演示
    第09组 Beta冲刺(5/5)
    第09组 Beta冲刺(4/5)
    网络对抗技术 2017-2018-2 20155215 Exp9 Web安全基础
    网络对抗技术 2017-2018-2 20152515 Exp 8 Web基础
    网络对抗技术 2017-2018-2 20152515 Exp7 信息搜集与漏洞扫描
    网络对抗技术 2017-2018-2 20152515 Exp6 信息搜集与漏洞扫描
    网络对抗技术 2017-2018-2 20152515 Exp5 MSF基础应用
    网络对抗技术 2017-2018-2 20152515 Exp4 恶意代码分析
    网络对抗技术 2017-2018-2 20152515 Exp3 免杀原理与实践
  • 原文地址:https://www.cnblogs.com/fsg6/p/13223770.html
Copyright © 2011-2022 走看看