UseEffect中Dispatch无法即时更新状态,地图标记不消失求助
问题解决:Google Maps标记确认配送后不即时消失
问题分析
提交订单ID确认配送后,对应地图标记需刷新页面才会消失,核心原因:
- 订单配送成功后,
orderList状态未同步更新,仍保留旧的isDelivered值 - 依赖
confirmOrder触发的listOrders未正确获取最新数据,或数据更新逻辑缺失
解决方案
方案1:直接更新订单列表中的对应订单(性能更优)
修改orderListReducer,监听ORDER_DELIVER_SUCCESS动作,实时更新目标订单的配送状态:
export const orderListReducer = (state = { loading: true, orders: [] }, action) => { switch (action.type) { case ORDER_LIST_REQUEST: return { loading: true }; case ORDER_LIST_SUCCESS: return { loading: false, orders: action.payload }; case ORDER_LIST_FAIL: return { loading: false, error: action.payload }; // 新增:处理订单配送成功的状态更新 case ORDER_DELIVER_SUCCESS: return { ...state, orders: state.orders.map(order => order._id === action.payload._id ? { ...order, isDelivered: true, deliveredAt: action.payload.deliveredAt } : order ) }; default: return state; } };
需确保后端处理配送请求时,返回更新后的完整订单对象,让前端拿到最新的isDelivered状态。
方案2:配送成功后重新拉取订单列表
若不想修改orderListReducer,可在deliverOrder动作成功后直接调用listOrders刷新数据:
export const deliverOrder = (orderId) => async(dispatch, getState) => { dispatch({ type: ORDER_DELIVER_REQUEST, payload: orderId }); const { userSignin: { userInfo } } = getState(); try { const { data } = Axios.put(`/api/orders/${orderId}/deliver`, {}, { headers: { Authorization: `Bearer ${userInfo.token}` }, }); dispatch({ type: ORDER_DELIVER_SUCCESS, payload: data }); // 配送成功后立即重新获取全部订单 dispatch(listOrders()); } catch (error) { const message = error.response && error.response.data.message ? error.response.data.message : error.message; dispatch({ type: ORDER_DELIVER_FAIL, payload: message }); } };
补充优化:修复Marker的key值
当前用order.shippingAddress.lat作为key,若多个订单纬度相同会导致React渲染异常,改为唯一的订单ID:
{orders.map((order) => ( order.isDelivered === false ? ( <Marker key={order._id} position={{ lat: order.shippingAddress.lat, lng: order.shippingAddress.lng }} /> ) : null ))}
完善confirmOrderHandler逻辑
确保配送成功后更新confirmOrder状态(若仍依赖useEffect触发刷新):
const confirmOrderHandler = async (orderId) => { try { await dispatch(deliverOrder(orderId)); setConfirmOrder(prev => prev + 1); setOrderId(''); // 清空输入框 } catch (err) { // 可添加错误提示逻辑 } };
内容的提问来源于stack exchange,提问作者Foreastbtch
相关产品推荐
相关产品推荐

