src/utils/reactivity.ts (view raw)
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 |
export function createReactive<T extends object>(initialState: T, onChange: (state: T) => void): T {
const handler: ProxyHandler<any> = {
get(target, prop, receiver) {
const value = Reflect.get(target, prop, receiver);
if (typeof value === "object" && value !== null) return new Proxy(value, handler);
return value;
},
set(target, prop, value, receiver) {
const oldValue = Reflect.get(target, prop, receiver);
const success = Reflect.set(target, prop, value, receiver);
if (success && oldValue !== value) onChange(initialState);
return success;
},
deleteProperty(target, prop) {
const success = Reflect.deleteProperty(target, prop);
if (success) onChange(initialState);
return success;
},
};
return new Proxy(initialState, handler);
}
|