不依賴 React,用 閉包 + 批處理隊列 實現可合并更新的
useState
。
一、20 行完整代碼
function createUseState(initialValue) {let state = initialValue;let pending = null; // 合并隊列let listeners = [];const flush = () => {if (pending !== null) {state = pending(state);pending = null;listeners.forEach(fn => fn(state));}};const useState = (value) => {if (arguments.length) state = value; // 初始化return [state,(updater) => {// 合并更新:函數或值pending = typeof updater === 'function'? (prev) => updater(prev): () => updater;Promise.resolve().then(flush); // 微任務批處理}];};useState.subscribe = (fn) => listeners.push(fn);return useState;
}
二、使用示例
const [count, setCount] = createUseState(0);setCount(c => c + 1);
setCount(c => c + 2); // 合并執行,state 變為 3
console.log(count); // 3
三、一句話總結
20 行閉包 + 微任務批處理,讓多次 setState 合并為一次更新。