计算属性 —> 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 //默认falsehandler(){...}}}
计算属性和监听
- 计算属性中不能开启异步任务 —定时器等等
- 监听可以
- 定时器不是vue管理,而是js引擎管理
- computed能完成的功能,watch都可以完成
- watch能完成的功能,computed不一定能完成,例如:watch可以进行异步操作
- 所被Vue管理的函数,最好写成普通函数,这样this的指向才是vm或组件实例对象
- 所有不被Vue所管理的函数(定时器的回调函数,ajax的回调函数等),最好写成箭头函数,这样this的指向才是vm或组件实例对象
