计算属性computed

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

  上面的代码是在模板里实现字符串翻转的逻辑,这样直接写在模板里不仅会是模板过重且难以维护。所以应当使用计算属性。

<div id="example">
   <p>Original message: "{{ message }}"</p>
   <p>Computed reversed message: "{{ reversedMessage }}"</p>
</div>

<script>
export default {
    data() {
        return {
            message: 'Hello'
        }
    },
    computed: {
        reversedMessage: function() {
            return this.message.split('').reverse().join('')
        }
    }
}
</script>
1. 计算属性缓存(computed) vs 方法(methods)

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

<p>Reversed Message: "{{ reversedMessage() }}"</p>

/*在组件中*/
<script>
export default {
    methods: {
       reversedMessage: function(){
          return this.message.split('').reverse().join('')
       }
    }
}
</script>

  这两种方法都可以达到我们的目的,为什么我们建议用计算属性呢?
  计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时才会重新求值。即只要message没有发生改变,多次访问reverseMessage,计算属性会立即返回之前的计算结果,而不必再次执行函数。相比之下,每当触发重新渲染时,调用方法总会再次执行函数。
  总之,数据量大,需要缓存的时候用computed;每次确实需要重新加载,不需要缓存时使用methods.

2. computed vs watch

  vue提供了一种更加通用的方式来观察和响应vue实例上的数据变动:watch属性

<div id="demo">{{fullName}}</div>
export default {
    data() {
        return {
            firstName: 'Foo',
            lastName: 'Bar',
            fullName: 'Foo Bar'
        }
    },
    watch: {
        firstName: function(val) {
            this.fullName = val + '' + this.lastName
        },
        lastName: function(val) {
            this.fullName = this.firstName + '' + val
        }
    }
}

上面的代码是命令式的和重复的,如果采用computed属性,可以写成如下形式:

export default {
    data() {
        return {
            firstName: 'Foo',
            lastName: 'Bar'
        }
    },
    computed: {
        fullName: function() {
            return this.firstName + this.lastName
        }
    }
}

  很明显computed更加智能简洁一些,但是当需要在数据变化时执行异步或者开销比较大的情况下,用watch比较合适。

3. computed的get和set方法

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

<script>
export default {
    computed: {
        fullName: {
            get: function() {
                return this.firstName + '' + this.lastName
            },
            set: function() {
                var names = newValue.split(' ')
                this.firstName = names[0]
                this.lastName = names[name.length-1]
            }
        }
    }
}
</script>

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

参考
Vue: method/computed/watch的使用和区别
vue计算属性get和set的作用和使用场景

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值