计算属性 —> computed
- 不需要重新渲染整个模板
- 效率比methods快
- 定义: 要用的属性不存在,要通过已有属性计算得来
- 原理: 底层借助了Object.defineproperty方法提供的getter和setter
- get函数执行事件
- 初次读取会执行一次
- 当依赖的数据发生变化时会被再次调用
- 优势:与methods实现相比,内部有缓存机制(复用),效率高,调试方便
备注:
- 计算属性最终会出现在vm上,直接读取使用
- 如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生变化
//写法一
computed:{
fullName:{
//当有人读取fullName时,get就会被调用,且返回值就作为fullName的值
//get什么时候调用1,初次读取fullName时,2,所依赖的数据更新后
get(){
console.log("fullName调用了")
console.log(this)
return this.firstName+this.lastName
}
},
set(e){
console.log("fullName开始修改")
console.log(e)
}
}
写法二
computed:{
fullName(){
console.log("fullName调用了")
console.log(this)
return this.firstName+this.lastName
}
}
}
监听
当被监视的属性变化时,回调函数自动调用,进行相关操作
- 监视的属性必须存在,才能进行监控
- 监视的两种写法
- new Vue时传入watch配置
- 通过vm.$watch监视
- Vue中的watch默认不监视对象内部值的变化(一层)
- 使用watch时根据数据的具体结构,决定是否采用深度监视 deep
//监视方法一
watch:{
//isHot可以是data也可以是计算属性
isHot:{
//handler 当isHot被修改时
handler(newValue,oldValue){
console.log(newValue,oldValue)
console.log("isHot修改了")
},
immediate:true //初始化就执行handler 默认false
},
//简写
isHot(newValue,oldValue){
....
}
}
监视方法二
vm.$watch('isHot',{
//isHot可以是data也可以是计算属性
isHot:{
//handler 当isHot被修改时
handler(newValue,oldValue){
console.log(newValue,oldValue)
console.log("isHot修改了")
},
immediate:true //初始化就执行handler 默认false
})
//多级监听
watch:{
'a.b':{
....
}
}
//深度监听
watch:{
isObject:{
deep:true //默认false
handler(){
...
}
}
}
计算属性和监听
- 计算属性中不能开启异步任务 —定时器等等
- 监听可以
- 定时器不是vue管理,而是js引擎管理
- computed能完成的功能,watch都可以完成
- watch能完成的功能,computed不一定能完成,例如:watch可以进行异步操作
- 所被Vue管理的函数,最好写成普通函数,这样this的指向才是vm或组件实例对象
- 所有不被Vue所管理的函数(定时器的回调函数,ajax的回调函数等),最好写成箭头函数,这样this的指向才是vm或组件实例对象