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

React Redux首次渲染时useEffect异步请求致页面跳转异常问题

问题原因

首次渲染触发跳转是因为组件初始化时carArray处于初始空状态,而你没区分「正在加载数据」和「加载完成后确实无数据」两种情况——接口请求是异步的,首次渲染时请求还没返回结果,就直接判定carArray为空跳转到首页了,等请求完成后组件二次渲染才有数据,但这时候已经跳转走了。

解决方案

给状态增加加载中标记,只有当请求完成且确实没有数据时才跳转,加载过程中保持页面不跳转,可显示加载提示。

1. 修改Slice,添加加载状态和错误处理

在carStore slice里,补充isLoading和error状态,同时处理异步请求的pending和rejected阶段:

// slice代码修改后
const initialState = {
  carArray: [], // 初始化为空数组,避免undefined判断问题
  isLoading: false,
  error: null
};

builder.addCase(getCar.pending, (state) => {
  state.isLoading = true;
  state.error = null;
});
builder.addCase(getCar.fulfilled, (state, action) => {
  state.isLoading = false;
  state.carArray = action.payload || []; // 确保返回值为空时也有默认空数组
});
builder.addCase(getCar.rejected, (state, action) => {
  state.isLoading = false;
  state.error = action.error.message;
  state.carArray = []; // 请求失败时设为空数组
});

2. 修改组件逻辑,区分加载状态和空数据状态

在组件中引入isLoading状态,调整渲染逻辑:

const { car } = useParams();
const { carArray, isLoading } = useSelector(state => state.carStore);

useEffect(() => {
  dispatch(getCar(JSON.stringify(car)));
}, [car, dispatch]); // 把dispatch加入依赖数组(React Redux v7+可自动识别,加了更稳妥)

// 加载中时显示加载提示,不跳转
if (isLoading) {
  return <div>加载中...</div>;
}

// 加载完成后,判断carArray是否为空,为空才跳转
return (
  <div>
    {carArray.length === 0 ? <Navigate to="/" /> : carArray.map(item => (
      // 你的渲染逻辑,比如<div key={item.id}>{item.name}</div>
    ))}
  </div>
);

3. 优化API请求代码

简化axios请求写法,避免await和.then/.catch混合使用:

export const getCar = createAsyncThunk(
  'get/car',
  async (str) => {
    try {
      const response = await axios.post("", str);
      return response.data;
    } catch (err) {
      console.log(err);
      throw err; // 抛出错误让rejected捕获
    }
  }
);

这样修改后,首次渲染时会显示加载状态,等请求完成后再判断是否有数据,不会再出现首次误跳转的问题。

内容的提问来源于stack exchange,提问作者Andrey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 03:40:19