-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
86 lines (73 loc) · 2.06 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
r:<input id="r" type=range min=0 max=255 />
<br>
g:<input id="g" type=range min=0 max=255 />
<br>
b:<input id="b" type=range min=0 max=255 />
<div id="color" style="width: 100px; height: 100px;"></div>
<script>
let handlers = new Map();
let reactivities = new Map();
let usedReactivities = [];
let object = {
a: { x: 3 },
b: 2
}
function reactive(obj) {
if (reactivities.has(obj)) {
return reactivities.get(obj);
}
let proxy = new Proxy(obj, {
get(obj, prop) {
usedReactivities.push([obj, prop]);
return typeof obj[prop] === 'object' ? reactive(obj[prop]) : obj[prop];
},
set(obj, prop, val) {
obj[prop] = val;
if (handlers.get(obj))
if (handlers.get(obj).get(prop))
for (let handler of handlers.get(obj).get(prop))
handler();
return obj[prop];
}
})
reactivities.set(obj, proxy);
reactivities.set(proxy, proxy); // 处理相同的返回proxy
return proxy;
}
function effect(handler) {
usedReactivities = [];
handler();
for (let usedReactivity of usedReactivities) {
let [obj, prop] = usedReactivity;
if (!handlers.has(obj)) {
handlers.set(obj, new Map());
}
if (!handlers.get(obj).has(prop)) {
handlers.get(obj).set(prop, []);
}
handlers.get(obj).get(prop).push(handler);
}
}
let p = reactive({ r: 100, g: 100, b: 100 });
effect(() => {
document.getElementById('r').value = p.r;
});
effect(() => {
document.getElementById('g').value = p.g;
});
effect(() => {
document.getElementById('b').value = p.b;
});
document.getElementById('r').addEventListener('input', (event) => {
p.r = event.target.value;
})
document.getElementById('g').addEventListener('input', (event) => {
p.g = event.target.value;
})
document.getElementById('b').addEventListener('input', (event) => {
p.b = event.target.value;
})
effect(() => {
document.getElementById('color').style.backgroundColor = `rgb(${p.r}, ${p.g}, ${p.b})`
})
</script>