You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:24:27