计算属性
虽然我们可以在模板内使用表达式, 但是设计初衷是用于简单的运算, 如果在模板中放入太多的逻辑会让模板过重难以维护
1
| <div>{{ message.split('').reverse().join() }}</div>
|
例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <template> <div id="app"> <p>原始message: {{ message }}</p> <p>计算属性message: {{ newMessage }}</p> </div> </template>
<script> export default { name: 'HelloWorld', data() { return { message: 'Hello World' } }, computed: { newMessage() { return this.message .split('') .reverse() .join('') } } } </script>
|
计算属性缓存 vs 方法
如果我们在methods中定义方法, 在模板中调用, 一样可以实现这个功能
不同的是, 计算属性是基于他们的响应式依赖进行缓存的, 只有在相关响应式依赖发生改变时他们才会重新计算求值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <template> <div id="app"> <p>原始message: {{ message }}</p> <p>计算属性message: {{ reverseStr() }}</p> </div> </template>
<script> export default { name: 'HelloWorld', data() { return { message: 'Hello World' } }, methods: { reverseStr() { return this.message .split('') .reverse() .join('') } } } </script>
|
计算属性的 getter
计算属性默认只有 getter, 不过我们在需要时也可以提供一个 setter:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| <template> <div id="app"> <p>{{ firstName }}</p> <p>{{ lastName }}</p> <p v-if="fullNmae">{{ fullNmae }}</p> <button @click="()=>{fullNmae = 'Hi,Ginger'}">update fullName</button> </div> </template>
<script> export default { name: 'HelloWorld', data() { return { firstName: 'Hello', lastName: 'World' } }, computed: { fullNmae: { get() { return this.firstName + this.lastName }, set(newVal) { let arr = newVal.split(',') this.firstName = arr[0] this.lastName = arr[1] } } } } </script>
|
侦听器
Vue 通过watch选项提供了一个可自定义的侦听器来响应数据的变化, 当需要在数据变化时执行异步或开销较大的操作时, 适合使用过
例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| <template> <div id="app"> <p>{{ content }}</p> <button @click="onClick">page++</button> </div> </template>
<script> export default { name: 'HelloWorld', data() { return { content: '', page: 1 } }, methods: { onClick() { this.page++ } }, watch: { page(newVal) { ... } } } </script>
|
计算属性 vs 侦听属性
Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动: 侦听属性.
不过官方更推荐使用计算属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| <template> <div id="app"> <p>{{ fullName}}</p> </div> </template>
<script> export default { name: 'HelloWorld', data() { return { firstName: 'Hello', lastName: 'World', fullName: '' } }, created() { this.firstName = 'Hello' }, watch: { firstName(val) { return (this.fullName = val + this.lastName) }, lastName(val) { return (this.fullName = this.firstName + val) } }, computed: { fullName() { return this.firstName + this.lastName } } } </script>
|