当前位置: 首页 > 知识库问答 >
问题:

React 检测到 Hook 的顺序发生了变化

莫英喆
2023-03-14

我试图根据从API获得的用户数据显示一些卡片。但是这个错误一直显示:`警告:React检测到PlanCard调用的钩子顺序发生了变化。如果不修复,这将导致错误和错误。更多信息,请阅读钩子的规则

>

  • 使用状态使用状态

    使用状态使用状态

    使用状态使用状态

    使用效果使用效果

    未定义的useContext

    ^^^^^^^^^^^^^^ `

    这是我所有的计划卡文件

      const [loading, setLoading] = useState(false),
        [showAlert, setShowAlert] = useState(false);
    
      let headless = typeof window !== 'undefined' &&
        window.location.search.includes('?headless'),
        platform =
          typeof window !== 'undefined' &&
            window.location.search.includes('platform=')
            ? new URL(window.location.href).searchParams.get('platform')
            : false,
        access_token =
          typeof window !== 'undefined' &&
            window.location.search.includes('access_token=')
            ? new URL(window.location.href).searchParams.get('access_token')
            : false,
        plans = [],
        payment_plan = null,
        plan_id = null,
        modal = null,
        purchased_from = null;
    
      if (headless && access_token) {
        payment_plan = useFetchData(access_token);
        plan_id = payment_plan.plan_id;
      } else { 
        // ToDo:
      }
      if (typeof plan_id === 'string') {
        plans = getPlanCards(plan_id, payment_plan.current_plan_status.toLowerCase());
        purchased_from = payment_plan.purchased_from;
        modal = getPlanCardsANAAlert(purchased_from);
      }
    }; 
    
    

    这也是我的提取计划代码:

    import axios from 'axios';
    
    const useFetchData = (access_token) => {
      const [plan, setPlan] = useState({});
      let componentMounted = true;
    
      useEffect(() => {
        const fetchData = async () => {
          try {
            const response = await axios.get(
              `${process.env.GATSBY_API_URL}user/plan/current_plan_detail?token=${access_token}`
            );
            if (componentMounted) {
              setPlan(response.data);
            }
          } catch (error) {
            console.error(error);
          }
        };
        fetchData();
        return () => {
          componentMounted = false;
        };
      }, []);
    
      return plan;
    };
    
    export default useFetchData;
    
  • 共有1个答案

    孙文康
    2023-03-14

    if 语句中有一个钩子

    if (headless && access_token) {
      payment_plan = useFetchData(access_token);
      plan_id = payment_plan.plan_id;
    }
    

    这使得组件渲染之间的钩子不稳定,React使用钩子来确定组件的状态,并跟踪组件在数组中定义的钩子,如果它们在渲染之间不同,这意味着它不能正确地比较状态。看看这里。

    要解决此问题,您可以使用如下所示的内容:

    const payment_plan = useFetchData(access_token);
    if(headless && payment_plan) {
    ...
    } else {
    ...
    }
    
     类似资料:
    • 问题内容: 我正在尝试从一些教程中学习Python。这是我遇到的一个简单例子,使我感到困惑。 正如您在定义字典的第一行中所看到的,该项是字典中的最后一个元素。但是,当我输出字典时,它成为第一个元素。字典的其余部分已重新排序。 我可以知道为什么会这样吗? 如果我使用dict.keys()从字典中提取密钥并按照我认为的顺序对其进行迭代,那会导致不匹配问题吗? 问题答案: 我可以知道为什么会这样吗? 这

    • 当使用带有目标检测API的matpltlib时,该图不会显示,但是在我导入一些测试方法之前,它可以正常工作。 我正在使用Anaconda虚拟环境,python 3.6和google对象检测API。 变化发生在最后一行 之前,我可以像plt一样显示图形。子图(2,2),我得到弹出的数字和以下内容: 如果您依赖于此处未列出的功能,请提交问题。 plt.get_backend()显示Qt5Agg。但是在

    • app/movie.component.ts 让我们再回顾一下它背后的逻辑。 当用户单击按钮时,调用方法并更新actor对象的属性。 当变化检测分析绑定到AppComponent模板的属性时,它将看到与之前相同的景象: Is slogan !== previousSlogan No, it’s the same. Is ? No, it’s the same. 让我们重新运行应用程序,但这次我们将

    • 由于双向数据绑定的本质,在Angular 1中不能保证父节点在子节点之前总是被检查。 有可能子节点可以改变父节点或兄弟节点或树中的任何其他节点,这又会在链中触发新的更新。 这使得变化检测机制难以遍历所有节点,并可能掉入具有臭名昭着的“震荡”循环中: 在Angular 2中,改变被保证单向传播。 更改检测器将遍历每个节点一次,始终从根开始。 这意味着父组件始终在其子组件之前检查。

    • Figure: Change Detector by Vovka is licensed under Public Domain () 变化检测在旧版本的Angular和新版本之间发生了很大的变化。在Angular 1中,框架保留了一长串观察者(每个属性绑定到我们的模板),需要在每次 digest 循环开始时检查。这被称为脏检查,它是唯一可用的变化检测机制。 在Angular 2中,信息流是单向的

    • 问题内容: 什么是的等同 ,和使用生命周期的钩子钩反应一样? 问题答案: 传递一个空数组作为第二个参数,以仅在安装时仅运行回调。 更新发生后立即调用。初始渲染不调用此方法。在每个渲染(包括第一个)上运行。因此,如果要使用严格等同于,则必须使用确定组件是否已安装一次。如果您想要更严格,请使用,但它会同步触发。在大多数情况下,应该足够了。 这个答案受到Tholle的启发,所有功劳归他所有。 在useE