Redux 坚持重新水化以前的身份验证状态太晚了
Redux persist rehydrate previous auth state too late
我已经设置了经过身份验证的路由,以便在未经身份验证的情况下将用户重定向到登录页面。我还设置了 redux-persist
以自动取消我的身份验证状态,以便用户在刷新时保持登录状态。问题是这种再水化为时已晚,用户已经被重定向到登录页面
第一次位置更改是到经过身份验证的路由,第二次是登录。注意在这些之后补充水分。理想情况下,至少应该在@@INIT 之后?
用于使您的商店持久化的 persistStore
函数有第三个参数 callback
,它在商店补水完成后调用。您必须使用某种预加载器启动您的应用程序,它等待重新水化发生并仅在它完成后呈现您的完整应用程序。
redux-persist
甚至 have a recipe 记录了这种情况。在你的情况下,所有 react-router
的东西也应该在初始加载器中呈现:
export default class Preloader extends Component {
constructor() {
super()
this.state = { rehydrated: false }
}
componentWillMount(){
persistStore(this.props.store, {}, () => {
this.setState({ rehydrated: true });
})
}
render() {
if(!this.state.rehydrated){
return <Loader />;
}
return (
<Provider store={store}>
<ConnectedRouter history={history}>
<App />
</ConnectedRouter>
</Provider>
);
}
}
const store = ...; // creating the store but not calling persistStore yet
ReactDOM.render(<Preloader store={store} />, ... );
当用户刷新页面时,第一个 LOCATION_CHANGE
将触发,因为您将历史记录与商店同步。但是,它只同步历史记录,并没有将用户重定向到任何地方。
唯一重要的是第二个 LOCATION_CHANGE
,它应该出现在 persistStore()
之后。好消息是 persistStore()
有回电。
const store = ...
// persist store
persistStore(store, options, () => {
const states = store.getState();
// if authenticated, do nothing,
// if not, redirect to login page
if (!states.auth.isAuthenticated) {
// redirect to login page
}
});
render(...);
希望以上内容能帮到您解决问题。
我已经设置了经过身份验证的路由,以便在未经身份验证的情况下将用户重定向到登录页面。我还设置了 redux-persist
以自动取消我的身份验证状态,以便用户在刷新时保持登录状态。问题是这种再水化为时已晚,用户已经被重定向到登录页面
第一次位置更改是到经过身份验证的路由,第二次是登录。注意在这些之后补充水分。理想情况下,至少应该在@@INIT 之后?
用于使您的商店持久化的 persistStore
函数有第三个参数 callback
,它在商店补水完成后调用。您必须使用某种预加载器启动您的应用程序,它等待重新水化发生并仅在它完成后呈现您的完整应用程序。
redux-persist
甚至 have a recipe 记录了这种情况。在你的情况下,所有 react-router
的东西也应该在初始加载器中呈现:
export default class Preloader extends Component {
constructor() {
super()
this.state = { rehydrated: false }
}
componentWillMount(){
persistStore(this.props.store, {}, () => {
this.setState({ rehydrated: true });
})
}
render() {
if(!this.state.rehydrated){
return <Loader />;
}
return (
<Provider store={store}>
<ConnectedRouter history={history}>
<App />
</ConnectedRouter>
</Provider>
);
}
}
const store = ...; // creating the store but not calling persistStore yet
ReactDOM.render(<Preloader store={store} />, ... );
当用户刷新页面时,第一个 LOCATION_CHANGE
将触发,因为您将历史记录与商店同步。但是,它只同步历史记录,并没有将用户重定向到任何地方。
唯一重要的是第二个 LOCATION_CHANGE
,它应该出现在 persistStore()
之后。好消息是 persistStore()
有回电。
const store = ...
// persist store
persistStore(store, options, () => {
const states = store.getState();
// if authenticated, do nothing,
// if not, redirect to login page
if (!states.auth.isAuthenticated) {
// redirect to login page
}
});
render(...);
希望以上内容能帮到您解决问题。