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

React中removeChild报错:待移除节点非当前节点子节点问题

解决React中Fetch请求后渲染Font Awesome标签出现NotFoundError的问题

嘿,我完全懂你遇到的这个坑!这种情况大概率是组件在fetch请求完成前已经被卸载,导致React尝试更新一个已经不存在的组件状态/DOM节点,而渲染普通字符串时因为逻辑更简单没触发这个错误。下面给你几个靠谱的解决方案:

方案1:用AbortController取消未完成的请求

当组件卸载时,直接中断还在进行的fetch请求,从根源上避免请求完成后去更新已销毁的组件。

示例代码:

import { useEffect, useState } from 'react';

function YourWrapperComponent() {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    // 创建AbortController实例
    const controller = new AbortController();
    const signal = controller.signal;

    fetch('你的请求URL', { signal })
      .then(res => res.json())
      .then(responseData => {
        setData(responseData);
        setLoading(false);
      })
      .catch(err => {
        // 忽略取消请求的错误
        if (err.name !== 'AbortError') {
          console.error('请求出错:', err);
          setLoading(false);
        }
      });

    // 组件卸载时取消请求
    return () => controller.abort();
  }, []);

  if (loading) {
    // 现在可以放心渲染Font Awesome的加载图标了
    return <i className="fas fa-spinner fa-pulse"></i>;
  }

  return (
    <div>
      {/* 根据data渲染内容 */}
    </div>
  );
}

方案2:跟踪组件挂载状态,避免卸载后更新状态

如果不想取消请求,也可以用一个ref来记录组件是否还挂载着,只有当组件挂载时才更新状态。

示例代码:

import { useEffect, useState, useRef } from 'react';

function YourWrapperComponent() {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);
  // 用ref跟踪组件是否挂载
  const isMounted = useRef(true);

  useEffect(() => {
    fetch('你的请求URL')
      .then(res => res.json())
      .then(responseData => {
        // 先检查组件是否还挂载
        if (isMounted.current) {
          setData(responseData);
          setLoading(false);
        }
      })
      .catch(err => {
        if (isMounted.current) {
          console.error('请求出错:', err);
          setLoading(false);
        }
      });

    // 组件卸载时标记为未挂载
    return () => {
      isMounted.current = false;
    };
  }, []);

  if (loading) {
    return <i className="fas fa-spinner fa-pulse"></i>;
  }

  return (
    <div>
      {/* 渲染内容 */}
    </div>
  );
}

额外检查:确保Font Awesome正确引入

虽然这个可能性相对小,但也可以确认下:

  • 你是否在项目中正确引入了Font Awesome的CSS文件(比如通过CDN或者npm安装后导入)
  • 类名是否拼写正确(比如fas是免费图标库的前缀,有没有写成fab之类的错误)
  • 也可以考虑使用官方的React组件@fortawesome/react-fontawesome,这样更符合React的渲染逻辑,减少DOM层面的问题。

这几个方案应该能解决你的问题,优先试试方案1,它是React官方推荐的处理异步请求卸载的方式哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:51:39