6. 计算属性
姓名案例
插值语法实现
<div id="room">
姓:<input type="text" v-model="firstName"></br>
名: <input type="text" v-model="lastName"></br>
姓名:{{firstName}}-{{lastName}}
</div>
<script>
// 创建Vue实例
const vm = new Vue({
el: '#room',
data: {
firstName: 'R',
lastName: 'cloud'
}
})
</script>
假设我们想实现复杂一点的:无论在姓里输入多少个字,在姓名里只显示三个,或者再将其反转,如果都写在模板里面,这就违背了vue模板简洁的原则。
methods实现
<div id="room">
姓:<input type="text" v-model="firstName"></br>
名: <input type="text" v-model="lastName"></br>
姓名:<span>{{fullName()}}</span>
</div>
<script>
// 创建Vue实例
const vm = new Vue({
el: '#room',
data: {
firstName: 'R',
lastName: 'cloud'
},
methods: {
fullName() {
return this.firstName + '-' + this.lastName
}
}
})
</script>
虽然也能实现功能,但是模板被解析一次,即使数据没被改变,函数也会重新调用一次。
computed计算属性
定义
当我们要用的属性不存在时,需要通过已有的属性计算得来
原理
底层借助了Object.defineproperty()
方法提供的getter
和setter
- getter什么时候执行?
- 初次读取数据时会执行一次
- 当依赖的数据发生改变时会被再次调用
优势
与methods相比,计算属性内部有缓存机制,它只在相关依赖发生改变时才会重新求值。这就意味着只要计算属性用到的数据还没有发生改变,多次访问其计算属性会立即返回之前的计算结果,而不必再次执行函数。
笼统地说,当用到的数据没改变,但是模板重新解析时,计算属性不会重新计算,而是直接使用缓存中的数据;methods会再次执行一遍函数获取同样的数据。
<div id="room">
姓:<input type="text" v-model="firstName"></br>
名: <input type="text" v-model="lastName"></br>
姓名:<span>{{fullName}}</span>
</div>
<script>
// 创建Vue实例
const vm = new Vue({
el: '#room',
data: {
firstName: 'R',
lastName: 'cloud'
},
computed: {
fullName: {
//get作用:当有人读取fullName时,get就会被调用,且返回值就作为fullName的值
get() {
return this.firstName + '-' + this.lastName
},
//set何时被调用?当fullName被修改时
set(value) {
// split() 方法用于把一个字符串分割成字符串数组
const arr = value.split('-')
this.firstName = arr[0]
this.lastName = arr[1]
}
}
}
})
</script>
备注
- 计算属性最终会出现在vm上,直接读取使用即可
- 如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生改变
- 如果计算属性确定不考虑修改,可以使用计算属性的简写
<div id="room">
姓:<input type="text" v-model="firstName"></br>
名: <input type="text" v-model="lastName"></br>
姓名:<span>{{fullName}}</span>
</div>
<script>
// 创建Vue实例
const vm = new Vue({
el: '#room',
data: {
firstName: 'R',
lastName: 'cloud'
},
computed: {
//一般只读取属性值而不修改,所以简写只读取属性值
fullName() {
return this.firstName + '-' + this.lastName
}
}
})
</script>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步