• React报错之React hook 'useState' is called conditionally


    正文从这开始~

    总览

    当我们有条件地使用useState钩子时,或者在一个可能有返回值的条件之后,会产生"React hook 'useState' is called conditionally"错误。为了解决该错误,将所有React钩子移到任何可能油返回值的条件之上。

    react-hook-usestate-called-conditionally.png

    这里有个例子用来展示错误是如何发生的。

    import React, {useState} from 'react';
    
    export default function App() {
      const [count, setCount] = useState(0);
    
      if (count > 0) {
        return <h1>Count is greater than 0h1>;
      }
    
      // ⛔️ React Hook "useState" is called conditionally.
      //React Hooks must be called in the exact same order
      // in every component render. Did you accidentally call
      // a React Hook after an early return?
      const [message, setMessage] = useState('');
    
      return (
        <div>
          <h2>Count: {count}h2>
          <button onClick={() => setCount(count + 1)}>Incrementbutton>
        div>
      );
    }
    

    上述代码片段的问题在于,我们使用的第二个useState钩子,位于可能有返回值的条件之后。

    顶层调用

    为了解决该问题,我们必须在最顶层调用React钩子

    import React, {useState} from 'react';
    
    export default function App() {
      const [count, setCount] = useState(0);
    
      // 👇️ move hooks above condition that might return
      const [message, setMessage] = useState('');
    
      // 👇️ any conditions that might return must be below all hooks
      if (count > 0) {
        return <h1>Count is greater than 0h1>;
      }
    
      return (
        <div>
          <h2>Count: {count}h2>
          <button onClick={() => setCount(count + 1)}>Incrementbutton>
        div>
      );
    }
    

    我们把第二个useState钩子移到了可能返回值的条件之上。

    这样就解决了这个错误,因为我们必须确保每次组件渲染时,React钩子都以相同的顺序被调用。

    这意味着我们不允许在循环、条件或嵌套函数内使用钩子。

    我们绝不应该有条件地调用钩子。

    import React, {useState} from 'react';
    
    export default function App() {
      const [count, setCount] = useState(0);
    
      if (count === 0) {
        // ⛔️ React Hook "useState" is called conditionally.
        // React Hooks must be called in the exact same order in every component render.
        const [message, setMessage] = useState('');
      }
    
      return (
        <div>
          <h2>Count: {count}h2>
          <button onClick={() => setCount(count + 1)}>Incrementbutton>
        div>
      );
    }
    

    上面的代码片段导致了错误,因为我们有条件地调用第二个useState钩子。

    这是不允许的,因为钩子的数量和钩子调用的顺序,在我们的函数组件的重新渲染中必须是相同的。

    为了解决这个错误,我们必须把useState的调用移到顶层,而不是有条件地调用这个钩子。

    就像文档中所说的:

    • 只在最顶层使用 Hook
    • 不要在循环,条件或嵌套函数中调用 Hook
    • 确保总是在你的 React 函数的最顶层以及任何 return 之前使用 Hook
    • 在 React 的函数组件中调用 Hook
    • 在自定义 Hook 中调用其他 Hook
  • 相关阅读:
    java进阶1——JVM
    javaScript贪吃蛇
    脚本语言和编译语言的区别 什么是解释器? 什么是编译器 ?解释器和编译器有什么区别?
    你了解Spring Security安全管理框架吗?
    数学知识——高斯消元(初等行变换解方程组)代码实现
    Mysql中索引详解
    2023-09-08力扣每日一题
    IDataReader转成List<T>
    【C++】一文带你走入vector
    DPDK之什么是imissed、ierrors、rx_nombuf
  • 原文地址:https://www.cnblogs.com/chuckQu/p/16611276.html