实现一个简易版的 Zustand

6 阅读1分钟
// mini-zustand.jsfunction createUseStore(func) {    let state = func(setState);    let listeners = null;    function setState(newState) { // 更改 state        if (typeof newState === 'function') {            newState = newState(state);        }        state = {            ...state,            ...newState        };        listeners && listeners.forEach(listener => listener());    }    function useStore(selectFunc) {        const [, setId] = useState(0);        const updateId = useCallback(() => {            setId(id => id + 1);        }, []);        useEffect(() => {            if (!listeners) {                listeners = new Set();            }            listeners.add(updateId);            return () => {                listeners.delete(updateId);            }        }, [updateId]);        return selectFunc(state);    }    return useStore;}// userStore.jsconst useUserStore = createUseStore(setState => ({    userName: '',    getUserName: async () => {        const userName = await queryUserName();        setState({ userName });    }}));export default useUserStore;// App.jsxfunction App(params) {    const userName = useUserStore(store => {        return store.userName;    });}