Vue中的计算属性与监视属性

计算属性

computed:{

                fullName:{

                get(){

                        return this.firstName + '-' + this.lastName

                },

                set(value){

                        const arr = value.split('-')

                        this.firstName = arr[0]

                        this.lastName = arr[1]

                  } 

}

定义:要用的属性不存在,需要通过已有属性计算得来。

原理:底层借助了Objcet.defineproperty()方法提供的getter和setter。

get函数什么时候执行?

    1)初次读取时会执行一次

    2)当依赖的数据发生改变时会被再次调用

优势:与methods实现相比,内部有缓存机制(复用),效率更高,调试方便

备注:

    1)计算属性最终会出现在vm上,直接读取使用即可

    2)如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生改变

    3)如果计算属性确定不考虑修改,可以使用计算属性的简写形式

    computed:{

            fullName(){

            return this.firstName + '-' + this.lastName

            }

    }



监视属性watch:

1、当被监视的属性变化时,回调函数自动调用,进行相关操作

2、监视的属性必须存在,才能进行监视

3、监视有两种写法:

    1)创建Vue时传入watch配置

    2)通过vm.$watch监视

    vm.$watch('isHot',{

            immediate:true,

            handler(newValue,oldValue){

            console.log('isHot被修改了',newValue,oldValue)

        }

    })


深度监视:

Vue中的watch默认不监测对象内部值的改变(一层)

在watch中配置deep:true可以监测对象内部值的改变(多层)

备注:

Vue自身可以监测对象内部值的改变,但Vue提供的watch默认不可以

使用watch时根据监视数据的具体结构,决定是否采用深度监视

简写:

    watch:{

            //正常写法

            isHot:{

                handler(newValue,oldValue){

                console.log('isHot被修改了',newValue,oldValue)

                }

            },

            //简写

            isHot(newValue,oldValue){

                    console.log('isHot被修改了',newValue,oldValue,this)

            }

     }

//正常写法

vm.$watch('isHot',{

      handler(newValue,oldValue){

          console.log('isHot被修改了',newValue,oldValue)

      }

})

//简写

vm.$watch('isHot',function(newValue,oldValue){

    console.log('isHot被修改了',newValue,oldValue,this)

})


computed和watch之间的区别:

computed能完成的功能,watch都可以完成(可能写起来更复杂)

computed:{

         fullName(){

            return this.firstName + '-' + this.lastName

         }

    }

watch能完成的功能,computed不一定能完成,例如:watch可以进行异步操作(定时)

watch:{

        firstName(val){

            setTimeout(()=>{

                this.fullName = val + '-' + this.lastName

            },1000);

        },

        lastName(val){

                this.fullName = this.firstName + '-' + val

        }

}

两个重要的小原则:

1)所有被Vue管理的函数,最好写成普通函数,这样this的指向才是 vm 或 组件实例对象

2)所有不被Vue所管理的函数(定时器的回调函数、ajax的回调函数等、Promise的回调函数),最好写成箭头函数,这样this的指向才是vm 或 组件实例对象。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容