React 和 easy-peasy - 如何重置完整状态?

React and easy-peasy - How to reset full state?

我找不到将完整状态重置为新状态的方法。一旦我尝试一种或另一种方法,有时它似乎可以工作(使用较小的新状态),但大多数时候我的组件重新渲染(因为状态改变并且我假设尚未重新水化)并且我得到一个错误有些东西没有定义。

我试过 store.reconfigure(newStateModel),但我不太明白它在保持旧状态时应该如何工作(看起来它合并了旧状态和新状态)。所以我在重新配置之前尝试了 await store.persist.clear(),但是我再次遇到重新渲染错误,有些东西是未定义的。

我也找到了 this thread on GitHub 并尝试了两种方法:

setState: action((state, payload) => payload),

// and

reset: action((state, payload) => ({
  ...initialState,
}),

仍然是完全相同的问题(重新渲染时未定义某些内容)

正在考虑以某种方式在主要 App 组件上显示“正在加载...”视图,但我没有在那里使用任何状态(仅 store 本身),所以它没有甚至重新渲染。目前我的 App 是:

const WaitForStateRehydration = ({children}) => {
    return useStoreRehydrated() ? children : <Loader/>
}

export default ({store}) => {
    return (
        <StoreProvider store={store}>
            <WaitForStateRehydration>
                <FsContextProvider>
                    <Panel />
                </FsContextProvider>
            </WaitForStateRehydration>
        </StoreProvider>
    )
}

我的 FsContextProvider 是一个加载器(有上下文),它在一些数据可用后加载:

const FsContextProvider = ({children}) => {
    // ...

    return (
        <LoaderWrapper waitToLoad={someData}>
            <FsContext.Provider value={someData}>
                {children}
            </FsContext.Provider>
        </LoaderWrapper>
    )
}

我在这里迷路了
任何帮助将不胜感激

不确定这是否可行,但它似乎对我有用。
我向我的商店模型添加了一个 loading 参数和一个操作:

    loading: boolean
    setLoading: Action<StoreState, boolean>

更改了我的 reset 操作以重置除 loading 参数之外的所有内容。
然后在我的 <Panel /> 中添加了一个支票:

const Panel = () => {
    const loading = useStoreState(state => state.loading)

    return (
        loading
            ? <Loader/>
            : (
                <>
                    // Other panel components
                </>
            )
    )
}

最后在我需要重置状态的地方,我这样做了:

store.dispatch.setLoading(true)
store.dispatch.reset(newState)
store.dispatch.setLoading(false)