This commit is contained in:
2026-04-08 00:32:52 +02:00
parent d632526597
commit d864765359

View File

@@ -55,29 +55,54 @@ export const Effect = (fn, is_scope = false) => {
}; };
// --- Signals & Reactividad --- // --- Signals & Reactividad ---
const track = (subs) => {
if (activeEffect) {
subs.add(activeEffect);
activeEffect.deps.add(subs);
}
};
export const Signal = (value) => { export const Signal = (value) => {
const subs = new Set(); const subs = new Set();
return { return {
_isSig: true, _isSig: true,
get value() { get value() {
if (activeEffect) { track(subs);
subs.add(activeEffect);
activeEffect.deps.add(subs);
}
return value; return value;
}, },
set value(v) { set value(v) {
if (v === value) return; if (v === value) return;
value = v; value = v;
subs.forEach(fn => queue.add(fn)); subs.forEach(fn => queue.add(fn));
if (!isScheduled) { if (!isScheduled) { isScheduled = true; queueMicrotask(tick); }
isScheduled = true;
queueMicrotask(tick);
}
} }
}; };
}; };
export const Reactive = (obj) => {
if (!obj || typeof obj !== 'object') return obj;
if (reactiveCache.has(obj)) return reactiveCache.get(obj);
const subs = {};
const proxy = new Proxy(obj, {
get(t, k) {
track(subs[k] ??= new Set()); // <--- Uso de track
const val = t[k];
return (val && typeof val === 'object') ? Reactive(val) : val;
},
set(t, k, v) {
if (t[k] === v) return true;
t[k] = v;
if (subs[k]) {
subs[k].forEach(fn => queue.add(fn));
if (!isScheduled) { isScheduled = true; queueMicrotask(tick); }
}
return true;
}
});
reactiveCache.set(obj, proxy);
return proxy;
};
export const Computed = (fn) => { export const Computed = (fn) => {
const c = Signal(fn()); const c = Signal(fn());
Effect(() => c.value = fn()); Effect(() => c.value = fn());