在生产中的现有Redux商店中保留版本号

问题描述:

我希望能够在具有不同状态树的生产React/Redux应用程序中加载新捆绑包,并容纳已登录的用户。我想要通过提示这些用户注销以便我可以重置状态树来完成此操作。在生产中的现有Redux商店中保留版本号

我的做法


通过传承来自节点版本,我可以配置店里插入version: {latest: VERSION, current: null}钥匙插入的状态树(或没有)版本密钥。当我从本地存储装载用户现有状态时(只会在用户重新连接到节点服务器时发生),才能将其“劫持”到状态树中。

const {VERSION} = process.env; 

const preloadedState = loadStateFromLocalStorage(); 

const browserVersion = (preloadedState.version && preloadedState.version.current) || null; 

const store = createStore(
    rootReducer, 
    Object.assign({}, preloadedState, {version: {latest: VERSION, current: browserVersion}}), 
    middleware 
); 

然后我可以检查我的AppContainer成分(因为它的认证后贴装头组件)为latest版本兑current版本。

class AppContainer extends React.Component { 
    componentDidMount() { 
     this.props.dispatch(checkForUpdates()); 
    } 
    componentDidUpdate() { 
     this.props.dispatch(checkForUpdates()); 
    } 
    render() { 
     return <App {...this.props} /> 
    } 
} 

checkForUpdates()会提示一个模式,指示用户必须注销才能继续。注销会将整个状态设置为{version: {latest: VERSION, current: VERSION}}


这种做法似乎过于复杂,在完成什么,我试图完成的,这基本上是(一)通知升级的用户(二)登录用户输出/净化阶段(C)加载新的,初始状态从更新的JS捆绑。

这个工作,并说明边缘情况?这是一个合理的方式来完成一个版本号的状态树吗?

任何原因你必须在Redux中做到这一点? [回应意见]

在执行ReactDOM.render之前,您可以通过使用vanilla JS来比较版本来避免整个reducer和分派。

UPDATE

看看redux-persistredux-persist-migrate。我没有使用它们,但是它是一个关于redux状态持久性和迁移的抽象。

+0

我仍然希望DOM树能够反映当前会话,并且需要利用状态树中的项目,例如模态功能。 – Himmel