vue-computed和watch

文章详细介绍了Vue.js中computed计算属性和watch侦听器的工作原理和应用场景。computed具有缓存机制,仅在依赖变化时更新视图,常用于数据计算。watch是一个侦听器,用于监听数据变化,可执行异步操作,但无缓存。两者都能响应数据变化,但watch更灵活,能处理复杂逻辑,包括深度监听和立即执行。在使用时,应根据功能需求选择computed或watch。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.computed

computed计算属性:

1.computed计算属性是一个watcher,同时具备缓存能力,只有当依赖的属性发生改变时才会更新视图。当页面中有属性需求计算时,可以使用computed计算属性来代替。要用的属性不存在,通过已有的属性计算得来。

  let app = new Vue({
        el: "#app",
        data: {
            first: "wei",
            last: "xi",
        },
        computed:{
        fullname:{
        get(){
           return this.first+this.last
         }
        set(value){
           const names = value.split(" ");
           this.first = names[0];
           this.last = names[1];
         }
      }
    }

2.原理是借助Object.defineproperty方法提供的getter和setter

3.get函数什么时候会执行?

        当初次读取时会执行一次

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

但是由于一般是只获取计算属性的get值,所以可以简写

 fullname:function(){
            return this.first+this.last
 }

2.watch  侦听器

1.watch是属于一个侦听器,和computed属性实现原理一样,都是watcher,只是watch不具备缓存

2.watch一般监听单个变量或者一个数组,对于监听基本的数据类型或者进行浅度监听,watch监听器可以得到一个oldValue和newValue值,但是进行深度监听无法得到oldValue值

3.watch进行深度监听 deep

监听单个属性,由于是对象中的属性名

data() {
	return {
		obj: {
			a: 1000
		}
	}
},
watch: {
	'obj.a': function(newValue, oldValue){
		// 监听单个属性时可以取到oldValue值
		console.log(newValue, oldValue)
	}
}

使用watch进行深度监听

使用deep:true进行深度监听时,会将监听的应用类型的属性层层遍历,都加上监听事件,这样会导致性能开销比较大,那么可以对引用数据类型内的单个属性进行监听

data() {
	return {
		obj: {
			a: 1000,
            b:80
		}
	}
},
watch: {
	obj: {
		// 深度监听中handler执行函数中的oldValue获取不到值
		handler(oldValue, newValue) {
			console.log("深度监听: " oldValue, newValue);
		},
		// 进行深度监听加上deep属性为true
		deep: true,
		// 加上immediate属性为true,则侦听的的handler会立即执行一次
		// immediate: true
	}
}

如果watch中监听的数据为多层嵌套的引用结构,可以使用deep进行监听,当数据发生改变时,可以监听到改变。

3.computed和wacth的使用区别

        1.computed能完成的功能,watch都可以完成。

        2.watch可以完成的功能,computed不一定可以完成,watch可以进行异步操作。因为computed是借助于返回值。而watch是可以直接得到值。

在vue里面写函数的一些原则,所被vue管理的函数,最好写成普通函数,这样this此时vm 或者 组件实例

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值