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

React+Redux Toolkit中API请求失败时如何隐藏加载动画

问题分析与解决方案

你的核心问题是API请求失败后,Error组件内的spinner图片没有隐藏,并非Loading组件的isLoading状态异常——因为当请求失败时,Redux状态中isLoading已变为false,TopMenu组件会切换到渲染Error组件,Loading组件此时已经被卸载,你看到的spinner来自Error组件,而非Loading组件。

问题根源

Error组件中的spinner图片是硬编码的src属性,没有根据isLoading状态控制显示与否:

// Error.jsx 原代码
<img
  className="spinner"
  src="https://static.wixstatic.com/media/2c0034_280b36bae7e24fdf9132a5d010c02061~mv2.png"
  alt=""
/>

解决方案

你需要让Error组件根据isLoading状态控制spinner的显示,有两种实现方式:

方式一:通过props传递isLoading状态

  1. 修改TopMenu组件,在渲染Error时传入isLoading:
// TopMenu.jsx
if (isError) {
  return <Error isError={isError} isLoading={isLoading} />;
}
  1. 修改Error组件,根据isLoading判断是否渲染spinner:
// Error.jsx
const Error = ({ isError, isLoading }) => {
  return (
    <>
      <div className="dvError my-3 text-center">
        <div className="container-fluid">
          <div className="row">
            <div className="col-12 py-3">
              {isLoading && (
                <img
                  className="spinner"
                  src="https://static.wixstatic.com/media/2c0034_280b36bae7e24fdf9132a5d010c02061~mv2.png"
                  alt=""
                />
              )}
              <p className="text-capitalize">
                Whoops, We apologize for the inconvenience.
                <b className="d-block text-uppercase">{isError}</b>
              </p>
            </div>
          </div>
        </div>
      </div>
    </>
  );
};

方式二:在Error组件中直接读取Redux状态

如果不想通过props传递,可以直接在Error组件中使用useSelector获取isLoading状态:

// Error.jsx
import React from "react";
import { useSelector } from "react-redux";

const Error = ({ isError }) => {
  const { isLoading } = useSelector(state => state.topmenuReducer);
  return (
    <>
      <div className="dvError my-3 text-center">
        <div className="container-fluid">
          <div className="row">
            <div className="col-12 py-3">
              {isLoading && (
                <img
                  className="spinner"
                  src="https://static.wixstatic.com/media/2c0034_280b36bae7e24fdf9132a5d010c02061~mv2.png"
                  alt=""
                />
              )}
              <p className="text-capitalize">
                Whoops, We apologize for the inconvenience.
                <b className="d-block text-uppercase">{isError}</b>
              </p>
            </div>
          </div>
        </div>
      </div>
    </>
  );
};

额外说明

你之前误以为Loading组件的isLoading状态异常,是因为请求失败时TopMenu组件已经切换到渲染Error组件,Loading组件会被卸载,你看到的console.log日志是组件卸载前的旧输出,并非当前状态。

内容的提问来源于stack exchange,提问作者me at stackoverflow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 11:07:35