Simple, Powerful State Handling
export class State<IState = Record<string, unknown>> { private data: Map<keyof IState, IState[keyof IState]> = new Map(); private subscribers: Map<string, ((...args: any[]) => void)[]> = new Map(); set(name: keyof IState, value: IState[keyof IState]): void { this.data.set(name, value); this.publish(`change:${String(name)}`, value); } get(name: keyof IState): any | undefined { return this.data.get(name); } has(name: keyof IState): boolean { return this.data.has(name); } clear(): void { this.data.clear(); this.publish('clear'); } publish(name: string, ...args: any[]): void { this.subscribers.get(name)?.forEach(fn => fn(...args)); } subscribe(name: string, fn: (...args: any[]) => void): void { this.subscribers.has(name) ? this.subscribers.get(name)!.push(fn) : this.subscribers.set(name, [fn]); } unsubscribe(name: string, fn: (...args: any[]) => void): void { if (this.subscribers.has(name)) { const idx = this.subscribers.get(name)!.indexOf(fn); if (idx > -1) this.subscribers.get(name)!.splice(idx, 1); } } unsubscribeAll(name: string): void { this.subscribers.delete(name); } }
Data Binding: The Real Reactivity
React Integration Example
function UserProfile() { const state = new State<{ name: string; age: number; }>(); const [userData, setUserData] = useState({ name: state.get('name') || '', age: state.get('age') || 0 }); // Automatic reactivity through state changes state.subscribe('change:name', (newName) => { setUserData(prev => ({ ...prev, name: newName })); }); return ( <div> <input value={userData.name} onChange={({target}) => state.set('name', target.value)} /> </div> ); }
Why This Beats Reactive Libraries
- Zero external dependencies
- Minimal bundle size
- Native JavaScript performance
- Simple, intuitive API
- Built-in change tracking
Key Reactive Principles
- State changes trigger updates
- Subscribers automatically notified
- No complex stream processing
- Direct, predictable data flow
Conclusion
Reactivity isn't about libraries. It's about understanding how data flows and changes. This implementation proves that powerful state management is native to JavaScript.
Top comments (0)