How to use useSyncExternalStore hook
// demo/useSyncExternalStore
export class Counter {
state: { count: number };
listeners: Set<() => void>;
constructor() {
this.state = { count: 0 };
this.listeners = new Set();
this.inc.bind(this);
this.des.bind(this);
}
setState(fnOrState: ((state: { count: number }) => { count: number }) | { count: number }) {
const newState = typeof fnOrState === 'function' ? fnOrState(this.state) : fnOrState;
this.state = {
...this.state,
...newState,
};
this.listeners.forEach((listener) => {
listener();
});
}
subscribe = (callback: () => void) => {
this.listeners.add(callback);
return () => {
this.listeners.delete(callback);
};
};
getSnapshot = () => this.state;
inc() {
this.setState((state) => ({ count: state.count + 1 }));
}
des() {
this.setState((state) => ({ count: state.count - 1 }));
}
}