美文网首页
计算属性和侦听器

计算属性和侦听器

作者: 车在路上爬fly | 来源:发表于2020-12-07 16:11 被阅读0次

    计算属性


    在插值语法中,一些比较复杂的逻辑可以使用计算属性处理之后再使用。

    例如:将如下字符串翻转代码用计算属性求值后,就比较简单明了

    <div id="example">
      {{ message.split('').reverse().join('') }}
    </div>
    
    \color{green}{基础例子}
    <div id="example">
      <p>原始 message: "{{ message }}"</p>
      <p>翻转后 message: "{{ reversedMessage }}"</p>
    </div
    
    
    //实例化对象
    var vm = new Vue({
      el: '#example',
      data: {
        message: 'Hello'
      },
      computed: {
        // 计算属性的 getter
        reversedMessage: function () {
          // `this` 指向 vm 实例
          return this.message.split('').reverse().join('')
        }
      }
    })
    

    这里声明一个计算属reversedMessage。提供函数将用作property vm.reversedMessage的geter函数:

    console.log(vm.reversedMessage) // => 'olleH'
    vm.message = 'Goodbye'
    console.log(vm.reversedMessage) // => 'eybdooG'
    
    \color{green}{计算属性缓存vs方法}

    我们也可以通过在表达式中调用方法来达到同样的效果:

    <p>Reversed message: "{{ reversedMessage() }}"</p>
    
    // 在组件中
    methods: {
      reversedMessage: function () {
        return this.message.split('').reverse().join('')
      }
    }
    

    这两种区别:

    • 结果最终是完全相同的。
    • 不同是:计算属性是基于他们的响应式依赖进行缓存的。只有在相关响应式依赖发生改变时他们才会重新求值。而方法调用则每次都会重新计算(性能较差)。
    \color{green}{计算属性vs侦听属性}

    侦听属性:通过来观察和响应vue实例上的数据变动,有些数据需要随着他的数据变动而变动时,很容易滥用watch

    下面的例子是用watch侦听器来监听各个属性的变化

    <div id="demo">{{ fullName }}</div>
    //实例对象
    var vm = new Vue({
      el: '#demo',
      data: {
        firstName: 'Foo',
        lastName: 'Bar',
        fullName: 'Foo Bar'
      },
      watch: {
        firstName: function (val) {
          this.fullName = val + ' ' + this.lastName
        },
        lastName: function (val) {
          this.fullName = this.firstName + ' ' + val
        }
      }
    })
    

    上面代码是命令式且重复的,将他与计算属性的版本进行比较:(简洁明了了好多,所以要合理使用watch)

    var vm = new Vue({
      el: '#demo',
      data: {
        firstName: 'Foo',
        lastName: 'Bar'
      },
      computed: {
        fullName: function () {
          return this.firstName + ' ' + this.lastName
        }
      }
    })
    
    \color{green}{计算属性的setter}

    计算属性默认只有getter,不过在需要时也可以提供一个setter:

    computed: {
      fullName: {
        // getter
        get: function () {
          return this.firstName + ' ' + this.lastName
        },
        // setter
        set: function (newValue) {
          var names = newValue.split(' ')
          this.firstName = names[0]
          this.lastName = names[names.length - 1]
        }
      }
    }
    

    现在运行vm.fullName = 'john Doe'时,setter会被调用,vm.firstNamevm.lastName也会相应的被更新。

    侦听器


    Vue通过watch选项提供了一个更通用的方法,来响应数据的变化,当需要在数据变化时执行异步或者开销较大时,这个方式是最有效的。

    相关文章

      网友评论

          本文标题:计算属性和侦听器

          本文链接:https://www.haomeiwen.com/subject/pehtgktx.html