• vue 的computed


    定义:

    当其依赖的属性的值发生变化时,计算属性会重新计算,反之,则使用缓存中的属性值。

    为什么要使用computed

    首先,通过vue官方文档的案例,来解释一下,为什么要使用computed。我们都知道,在模板内的表达式非常遍历的,但是,有时候,我们会在模板内的放入太多逻辑的东西。会让模板变重,且难于维护。

    1 <div id="example">
    2   {{ message.split('').reverse().join('') }}
    3 </div>

    在这模板中的代码中,其实,我们需要花费上一小段时间去理解,这块渲染的是什么---message的翻转字符串。然而,当初模板中使用表达式的初衷时为了简单运算的。所以,从这点出发,我们是不是就不建议在模板中使用过于复杂的表达式了。此时,计算属性就横空出世了。计算属性就是当依赖的属性的值发生变化的时候,才会触发他的更改,如果依赖的值,不发生变化的时候,使用的是缓存中的属性值。

     1 <div id="example">
     2   <p>Original message: "{{ message }}"</p>
     3   <p>Computed reversed message: "{{ reversedMessage }}"</p>
     4 </div>
     5 
     6 
     7 var vm = new Vue({
     8   el: '#example',
     9   data: {
    10     message: 'Hello'
    11   },
    12   computed: {
    13     // 计算属性的 getter
    14     reversedMessage: function () {
    15       // `this` 指向 vm 实例
    16       return this.message.split('').reverse().join('')
    17     }
    18   }
    19 })

    computed的getter函数

    在vue中,computed的属性可以被视为是data一样,可以读取和设值。因此,在computed中可以分为getter(读取)和setter(设值),一般情况下,是没有setter的,computed只是预设了getter,也就是只能读取,不可以改变设值。所以,computed默认格式(是不表明getter函数的):
    html:

    1     <div>
    2      message: {{message}}
    3     </div>
    4 
    5     <!-- 计算属性 -->
    6     <div>
    7      计算属性: {{updateMessage}}
    8    </div>
    1 computed: {
    2     updateMessage(): {
    3             console.log('计算属性', this.message)
    4             return this.message
    5     }
    6 }

    等价于

    1 computed: {
    2     
    3     updateMessage: {
    4       get: function() {
    5         console.log('计算属性', this.message)
    6         return this.message
    7       }
    8     }
    9   },

    发现了一个小小的惊喜:当模板中不使用updateMessage,即使message发生改变之后,也不会走computed。神奇不神奇??哈哈哈

    在这里,就需要我们注意一下,不是说我们更改了getter中使用的变量(即依赖的属性),就会触发computed的更新,他有一个前提是computed里的值必须要在模板中使用才可以。但是会触发生命周期的updated()

    computed中的setter函数

    当赋值给计算属性的时候,将调用setter函数。多用于在模板组件中需要修改计算属性自身的值的时候。

     1 computed: {
     2     updateMessage: {
     3       get: function() {
     4         console.log('计算属性', this.message)
     5         return this.message
     6       },
     7       set: function(newVal) {
     8         this.message = newVal
     9         console.log('newVal', newVal)
    10       }
    11     }
    12   },
    13  mounted () {
    14     this.updateMessage = '222'
    15     console.log('测试:', this)
    16  },

    只有当计算属性中的属性被直接赋值的时候,才会走setter函数,而且,setter函数和getter函数是相互独立的,不是说,走setter函数,就必须走getter函数。上面的案例,打印结果是

    1 newVal: 222,
    2 计算属性: 222

    是因为,在setter中触发了message的更改,当message发生改变的时候,getter函数中就会改变。

     1 computed: {
     2     updateMessage: {
     3       get: function() {
     4         console.log('计算属性', this.message)
     5         return this.message
     6       },
     7       set: function(newVal) {
     8         console.log('newVal', newVal)
     9       }
    10     }
    11   },
    12  mounted () {
    13     console.log('测试:', this)
    14  },

    这种情况下,打印结果是:

    1 newVal 222

    此时,就只是单单的走了setter的函数,而没有走getter函数。

    总结

    这篇文章呢,主要是介绍一下关于computed的基本构成和使用,也算是,自己对computed的一个简单的总结把。不会让自己在做项目的过程中,遇见关于类似的问题,而无法解决。不知道如何使用。然后呢,等撸vue的源码的时候,在深入的写一篇关于computed的原理的文章。因为有些神奇的现象是必须要通过原理来解释的。

  • 相关阅读:
    pat03-树1. 二分法求多项式单根(20)
    pat05-图1. List Components (25)
    pat06-图4. Saving James Bond
    pat05-图3. 六度空间 (30)
    pat05-图2. Saving James Bond
    pat04-树9. Path in a Heap (25)
    pat04-树8. Complete Binary Search Tree (30)
    pat04-树7. Search in a Binary Search Tree (25)
    pat04-树5. File Transfer (25)
    Two Sum
  • 原文地址:https://www.cnblogs.com/zhilu/p/15252046.html
Copyright © 2020-2023  润新知