将 redux-persist 与路由反应

Posted

技术标签:

【中文标题】将 redux-persist 与路由反应【英文标题】:react redux-persist with routes 【发布时间】:2017-11-15 16:56:00 【问题描述】:

我正在使用 redux-persist 的反应,并且如果用户从 /home 转到 /search,“Rehydrate”事件会被触发两次。

所以首先状态在根中是正确的。然后我改变我的搜索参数。点击搜索后,我可以看到“Rehydrate”事件被激活,它再次改变了应用程序的状态。

知道出了什么问题以及我能做些什么来解决它吗?

这是我正在使用的代码

import Router, Route, browserHistory, Redirect from 'react-router';
import persistStore, autoRehydrate from 'redux-persist'
import Provider from 'react-redux';
import compose,createStore, applyMiddleware from 'redux';
import reducers from './reducers';
import thunkMiddleware  from 'redux-thunk';
import promiseMiddleware from 'redux-promise-middleware';
import localForage from "localforage";


export const store = createStore(
    reducers,
    window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__(),
    compose(
        applyMiddleware(
            thunkMiddleware,
            promiseMiddleware()),
        autoRehydrate()
    )
);
const persistor = persistStore(store, storage: localForage);
render(
    <Provider store=store persistor=persistor>
        <Router history=browserHistory>
            <Route path="/" component=Home/>
            <Route path="/search" component=Search/>
        </Router>
    </Provider>,
    document.getElementById('root')
);

感谢和问候

PS:附上redux状态的图片。正如您在触发搜索后看到的那样,有一个新的 persist/Rehydrate 事件。我有点幸运,在补水事件之后搜索仍然完成 - 但行为并不好。

【问题讨论】:

【参考方案1】:

我不确定 react-persist 是如何工作的。但我认为您想像这样将 exact 道具添加到 Home 的路线中:

<Route path="/" exact component=Home/>

否则两条路由都会渲染,并且当每个组件渲染时,可能会触发您看到的双重操作。

【讨论】:

我试图添加确切的道具,但它并没有解决问题。我附上了一张 react redux 状态的图片【参考方案2】:

我查看了文档,似乎persistStore() 可能会触发补液操作,因此可能不需要autoRehydrate()

提供自动补水是为了方便。在大型应用程序中, 或具有非典型还原剂成分的一种,可能不会自动补液 方便的。在这种情况下,只需省略 autoRehydrate。补液 操作仍将由 persistStore 触发,然后可以处理 单独通过减速器或使用自定义补液处理程序。

所以尝试删除autoRehydrate()

【讨论】:

感谢您的帮助!我试图删除 autoRehydrate(),行为仍然相同(只是破坏了一些组件)。我想商店会保存每条路线的状态。【参考方案3】:

补水是创建商店后的第二步,其他任何事情都应该在补水回调中完成。

它是persiststore func 中的第三个参数。 persistStore(store, [config, callback])

看看使用补液回调是否有帮助。

【讨论】:

以上是关于将 redux-persist 与路由反应的主要内容,如果未能解决你的问题,请参考以下文章

如何将 React.createContext() 与反应路由器一起使用?

我可以将反应路由器链接与 CardActionArea 一起使用吗?

如何将上下文 api 与反应路由器 v4 一起使用?

使用 connect 与 react-redux 和 redux-persist

无法让 React-redux 与 redux-persist 一起使用

Wix React-Native-Navigation v2 和 redux-persist