dispatch存储数据到localStorage后history.push跳转/cart页数据未更新怎么办
问题根因
你当前的写法默认dispatch(saveBeneficiaireProfile())是同步执行完成的,但实际上这个action内部包含写localStorage的异步逻辑(比如是redux-thunk、redux-saga管理的异步流程),dispatch触发后不等逻辑执行完成就立刻执行了history.push跳转到/cart页,此时localStorage还没完成写入,自然读不到最新数据。
解决方案
方案1:等待异步action执行完成后再跳转(最推荐)
如果你的项目用了redux-thunk,直接给异步action返回Promise,在提交函数中用async/await等待执行完成再跳转:
// 首先修改saveBeneficiaireProfile的action定义,返回Promise const saveBeneficiaireProfile = (data) => async (dispatch) => { // 你的原有业务逻辑,比如接口请求、写localStorage localStorage.setItem('beneficiaireProfile', JSON.stringify(data)) // 其余逻辑... } // 提交函数改成async写法 const submitHandler = async (e) => { await dispatch( saveBeneficiaireProfile({ firstname, identifiant, adultCount, childCount, babyCount, }) ); // 确认localStorage写入完成后再跳转 props.history.push("/cart"); };
方案2:基于状态变更触发跳转
如果你用redux-saga管理异步流程,可以监听saveBeneficiaireProfile执行成功的action,在回调中执行跳转逻辑:
// saga中处理逻辑 function* saveProfileSaga(action) { try { // 写localStorage等业务逻辑 localStorage.setItem('beneficiaireProfile', JSON.stringify(action.payload)) // 触发成功action yield put({type: 'SAVE_PROFILE_SUCCESS'}) } catch (e) { // 异常处理逻辑 } } // 组件内监听状态变更后跳转 const profile = useSelector(state => state.profile) useEffect(() => { // 确认profile数据已经更新后再跳转 if(profile.identifiant) { props.history.push('/cart') } }, [profile])
注意事项
不要使用setTimeout延迟跳转的方案,延迟时间不可控,稳定性极差,不推荐使用。
内容的提问来源于stack exchange,提问作者Guillaume Ayad
相关产品推荐
相关产品推荐

