0
点赞
收藏
分享

微信扫一扫

Vue的响应式原理

上古神龙 2022-01-05 阅读 47

1.什么是响应式?

同步状态下,JavaScript代码是自上而下执行的

let count = 1
let getDouble = n => n * 2
let double = getDouble(count)
consolle.log(count, double) // 1   2

count = 2
double = getDouble(count)
console.log(count, double) // 2 4

double的值是count乘以2得到的结果;如果我们能让getDouble函数随着count的变化而自动执行。那么这就是响应式。

2.Vue的响应式解决方案

(1)Vue2.0使用Object.defineProperty() MDN文档

let obj = {}
let count = 1
let getDouble = n => n * 2
let double = getDouble(count)
console.log(double) //2

Object.defineProperty(obj, 'count', {
	get() {
		return count
	},
	set(val) {
		count = value
		double = getDouble(value)
	}
})
let obj.count = 2
console.log(double) //4

但是在Object.defineProperty()中删除obj.count的时候,set是不执行的,所以double是无法改变的。为了让删除某个数据可以响应式,Vue实现了$set、$delete以及数组变异方法等API。

(2)Vue3.0使用Proxy(reactive)、value setter(ref)来解决。ProxyMDN文档

let obj = {
    count: 1
}
let getDouble = n => n * 2
let double = getDouble(obj.count)
let proxy = new Proxy(obj, {
    get: (target, prop) => {
        return target[prop]
    },
    set: (target, prop, value) => {
        target[prop] = value
        if(prop === 'count') {
            double = getDouble(value)
        }
    },
    deleteProperty(target, prop) {
        delete target[prop]
        if(prop === 'count') {
            double = NaN
        }
    }
})
console.log(obj.count, double) // 1  2
proxy.count = 2
console.log(obj.count, double) // 2  4
delete proxy.count
console.log(obj.count, double) // undefined  NaN
let getDouble = n => n * 2
let _value = 1
let double = getDouble(_value)
let count = {
	get value() {
		return _value
	},
	set vlaue(val) {
		_value = val
		double = getDouble(_value)
	}
}
console.log(count.value, double) // 1  2
count.value = 2
console.log(count.vauel, double) // 2  4
举报

相关推荐

0 条评论