• vue中computed(计算属性)和watch(数据监听)


    1.computed(计算属性)

      根据一个现有数据去生成一个新数据,并且这两个数据会永久的建立关系,还会建立缓存,当无关数据改变的时候,不会重新计算而是直接使用缓存中的值

    <div id="app">
        <p>计算属性fullName:{{fullName}}</p>
    </div>
    
    <script>
        var vm = new Vue({  
            el: '#app',  
            data: {  
                firstName: 'Foo',  
                lastName: 'Bar',  
            },  
            computed: {  
                fullName: function () {  
                    return this.firstName + ' ' + this.lastName  
                }  
            }  
        })
    </script>

    需要注意的是,就算在data中没有直接声明出要计算的变量,也可以直接在computed中写入。

      1.1computed的缓存功能

    <div id="app">
        <h1>{{message}}</h1>
        <p class="test1">{{methodTest}}</p>
        <p class="test2-1">{{methodTest()}}</p>
        <p class="test2-2">{{methodTest()}}</p>
        <p class="test2-3">{{methodTest()}}</p>
        <p class="test3-1">{{computedTest}}</p>
        <p class="test3-2">{{computedTest}}</p>
    </div>
    
    <!--script部分-->
    let vm = new Vue({
        el: '#app',
        data: {
            message: '我是消息,'
        },
        methods: {
            methodTest() {
                return this.message + '现在我用的是methods'
            }
        },
        computed: {
            computedTest() {
                return this.message + '现在我用的是computed'
            }
        }
    })

       methods定义的方法是以函数调用的形式来访问的,那么test2-1,test2-2,test2-3反复地将methodTest方法运行了三遍,如果我们碰到一个场景,需要1000个methodTest的返回值,那么毫无疑问,这势必造成大量的浪费
    更恐怖的是,如果你更改了message的值,那么这1000个methodTest方法每一个又会重新计算。。。。

      computed依赖于data中的数据,只有在它的相关依赖数据发生改变时才会重新求值

      如上例,在Vue实例化的时候,computed定义computedTest方法会做一次计算,返回一个值,在随后的代码编写中,只要computedTest方法依赖的message数据不发生改变,computedTest方法是不会重新计算的,也就是说test3-1,test3-2是直接拿到了返回值,而非是computedTest方法重新计算的结果。

      这样的好处也是显而易见的,同样的,如果我们碰到一个场景,需要1000个computedTest的返回值,那么毫无疑问,这相对于methods而言,将大大地节约内存
    哪怕你改变了message的值,computedTest也只会计算一次而已

      1.2get和set用法

    data: {
        firstName: 'Foo',
        lastName: 'Bar'
      },
      computed: {
      fullName:{
       get(){//回调函数 当需要读取当前属性值是执行,根据相关数据计算并返回当前属性的值
          return this.firstName + ' ' + this.lastName
        },
       set(val){//监视当前属性值的变化,当属性值发生变化时执行,更新相关的属性数据
           //val就是fullName的最新属性值
           console.log(val)
            const names = val.split(' ');
            console.log(names)
            this.firstName = names[0];
            this.lastName = names[1];
       }
       }
      }

    2.watch(数据监听)  

    在vue中,使用watch来响应数据的变化。
    var vm = new Vue({
      data: {
        a: 1,
        b: 2,
        c: 3,
        d: 4,
        e: {
          f: {
            g: 5
          }
        }
      },
      watch: {
        a: function (val, oldVal) {
          console.log('new: %s, old: %s', val, oldVal)
        },
        // 方法名
        b: 'someMethod',
        // 该回调会在任何被侦听的对象的 property 改变时被调用,不论其被嵌套多深
        c: {
          handler: function (val, oldVal) { /* ... */ },
          deep: true
        },
        // 该回调将会在侦听开始之后被立即调用
        d: {
          handler: 'someMethod',
          immediate: true
        },
        e: [
          'handle1',
          function handle2 (val, oldVal) { /* ... */ },
          {
            handler: function handle3 (val, oldVal) { /* ... */ },
            /* ... */
          }
        ],
        // watch vm.e.f's value: {g: 5}
        'e.f': function (val, oldVal) { /* ... */ }
      }
    })
    vm.a = 2 // => new: 2, old: 1
     

    Talk is cheap,show me the code
  • 相关阅读:
    如何在Mac终端中进入含空格文件名的文件夹
    redis测试常用工具及方法
    Spark3.0 Standalone模式部署
    使用Quorum Journal Manager(QJM)的HDFS NameNode高可用配置
    任务-实业-化工:王永庆
    节日-传统节日:排灯节
    葡萄科:乌蔹梅
    植物界:蕨类植物门
    修辞手法-汉语-词语:明喻
    修辞手法-汉语-词语:隐喻
  • 原文地址:https://www.cnblogs.com/qc-one/p/11425545.html
Copyright © 2020-2023  润新知