把proxy处理封装一个reactive函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite App</title>
</head>
<body>
<div id="app"></div>
<script>
function isObject(data) {
return typeof data === "object" && data !== null;
}
function reactive(data) {
if (isObject(data)) {
return new Proxy(data, {
get(target, key) {
console.log("get访问", key, target[key]);
return target[key];
},
set(target, key, value) {
console.log("set 修改", key, value);
target[key] = value;
},
});
}
}
let states = { name: "xiaoming" };
let p = reactive(states);
p.name
p.name = "xiaoxiao";
</script>
</body>
</html>
proxy 执行多个副作用函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite App</title>
</head>
<body>
<div id="app"></div>
<script>
function isObject(data) {
return typeof data === "object" && data !== null;
}
function reactive(data) {
if (isObject(data)) {
return new Proxy(data, {
get(target, key) {
console.log("get访问", key);
return target[key];
},
set(target, key, value) {
console.log("set 修改", key, value);
target[key] = value;
},
});
}
}
let states = { name: "xiaoming" };
let p = reactive(states);
function effect() {
console.log("执行副作用函数1");
p.name;
}
effect();
function effect2() {
console.log("执行副作用函数2");
p.name;
}
effect2();
setTimeout(() => {
p.name = "xiaoxiao";
}, 2000);
执行副作用函数1
get访问 name
执行副作用函数2
get访问 name
set 修改 name xiaoxiao
</script>
</body>
</html>
proxy代理 用set集合执行多个副作用函数 为了去重
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite App</title>
</head>
<body>
<div id="app"></div>
<script>
let bucket = new Set();
function isObject(data) {
return typeof data === "object" && data !== null;
}
function reactive(data) {
if (isObject(data)) {
return new Proxy(data, {
get(target, key) {
console.log("get访问", key);
return target[key];
},
set(target, key, value) {
console.log("set 修改", key, value);
target[key] = value;
bucket.forEach((fn) => fn());
},
});
}
}
let states = { name: "xiaoming", age: 18 };
let p = reactive(states);
function effect() {
console.log("执行副作用函数1");
p.name;
}
bucket.add(effect);
bucket.add(effect);
function effect2() {
console.log("执行副作用函数2");
p.age;
}
bucket.add(effect2);
setTimeout(() => {
p.name = "xiaofei";
}, 1000);
</script>
</body>
</html>
proxy代理map解决一个属性访问多个副作用

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite App</title>
</head>
<body>
<div id="app"></div>
<script>
let bucket = new Map();
let activeEffect = null;
function isObject(data) {
return typeof data === "object" && data !== null;
}
function effect(fn) {
activeEffect = fn;
fn();
activeEffect = null;
}
function track(target, key) {
if (activeEffect) {
let depSet = new Set();
if (!bucket.get(key)) {
bucket.set(key, depSet);
}
depSet.add(activeEffect);
}
}
function trigger(target, key) {
let depSet = bucket.get(key);
console.log(depSet);
if (depSet) {
depSet.forEach((fn) => fn());
}
}
function reactive(data) {
if (isObject(data)) {
return new Proxy(data, {
get(target, key) {
track(target, key);
return target[key];
},
set(target, key, value) {
console.log("set 修改", key, value);
target[key] = value;
trigger(target, key);
return true;
},
});
}
}
let states = { name: "xiaoming", age: 18 };
let p = reactive(states);
effect(() => {
console.log("执行副作用函数2", p.age);
});
effect(() => {
console.log("执行副作用函数3", p.age);
});
</script>
</body>
</html>
proxy代理weakmap创建多个对象方法同一个属性

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite App</title>
</head>
<body>
<div id="app"></div>
<script>
let bucket = new WeakMap();
let activeEffect = null;
function isObject(data) {
return typeof data === "object" && data !== null;
}
function effect(fn) {
activeEffect = fn;
fn();
activeEffect = null;
}
function track(target, key) {
if (activeEffect) {
let depMap = bucket.get(target);
if (!depMap) {
depMap = new Map();
bucket.set(target, depMap);
}
let depSet = depMap.get(key);
if (!depSet) {
depSet = new Set();
depMap.set(key, depSet);
}
depSet.add(activeEffect);
}
}
function trigger(target, key) {
let depMap = bucket.get(target);
if (!depMap) return;
let depSet = depMap.get(key);
if (depSet) {
depSet.forEach((fn) => fn());
}
}
function reactive(data) {
if (isObject(data)) {
return new Proxy(data, {
get(target, key) {
track(target, key);
return target[key];
},
set(target, key, value) {
console.log("set 修改", key, value);
target[key] = value;
trigger(target, key);
return true;
},
});
}
}
let p = reactive({ name: "xiaoming", age: 18 });
let p2 = reactive({ name: "xiaoming2", age: 18 });
effect(() => {
console.log("执行副作用函数2", p.age);
});
effect(() => {
console.log("执行副作用函数3", p2.age);
});
console.log(bucket);
setTimeout(() => {
p.name = "xiaofei";
}, 1000);
</script>
</body>
</html>