refactor: fix reactivity

This commit is contained in:
2026-04-01 22:57:33 +08:00
parent 4761806a02
commit dbd2a25185
4 changed files with 102 additions and 39 deletions
+48 -10
View File
@@ -9,6 +9,43 @@ export type EntityAccessor<T extends Entity> = {
value: T;
}
function createReactiveProxy<T extends Entity>(entitySignal: Signal<T>): T {
return new Proxy({} as T, {
get(_target, prop) {
const current = entitySignal.value;
const value = current[prop as keyof T];
if (typeof value === 'function') {
return value.bind(current);
}
return value;
},
set(_target, prop, value) {
const current = entitySignal.value;
entitySignal.value = { ...current, [prop]: value };
return true;
},
ownKeys(_target) {
return Reflect.ownKeys(entitySignal.value);
},
getOwnPropertyDescriptor(_target, prop) {
return Reflect.getOwnPropertyDescriptor(entitySignal.value, prop);
},
});
}
function createReactiveAccessor<T extends Entity>(id: string, entitySignal: Signal<T>): EntityAccessor<T> {
const proxy = createReactiveProxy(entitySignal);
return {
id,
get value() {
return proxy;
},
set value(value: T) {
entitySignal.value = value;
}
} as EntityAccessor<T>;
}
export function createEntityCollection<T extends Entity>() {
const collection = signal({} as Record<string, Signal<T>>);
const remove = (...ids: string[]) => {
@@ -24,17 +61,18 @@ export function createEntityCollection<T extends Entity>() {
};
};
const get = (id: string) => {
return {
id,
get value(){
return collection.value[id]?.value;
},
set value(value: T){
const signal = collection.value[id];
if(signal)signal.value = value;
}
const get = (id: string): EntityAccessor<T> => {
const entitySignal = collection.value[id];
if (!entitySignal) {
return {
id,
get value() {
return undefined as unknown as T;
},
set value(_value: T) {}
} as EntityAccessor<T>;
}
return createReactiveAccessor(id, entitySignal);
}
return {