• React报错之React Hook 'useEffect' is called in function


    正文从这开始~

    总览

    为了解决错误"React Hook 'useEffect' is called in function that is neither a React function component nor a custom React Hook function",可以将函数名的第一个字母大写,或者使用use作为函数名的前缀。比如说,useCounter使其成为一个组件或一个自定义钩子。

    react-hook-useeffect-called-in-function.png

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

    // App.js
    
    import React, {useEffect, useState} from 'react';
    
    // 👇️ Not a component (lowercase first letter)
    // not a custom hook (doesn't start with use)
    function counter() {
      const [count, setCount] = useState(0);
    
      // ⛔️ React Hook "useEffect" is called in function "counter" that
      // is neither a React function component nor a custom React Hook function.
      // React component names must start with an uppercase letter.
      // React Hook names must start with the word "use".
      useEffect(() => {
        console.log(count);
      }, [count]);
    
      return (
        <div>
          <h2>Count: {count}h2>
          <button onClick={() => setCount(count + 1)}>Incrementbutton>
        div>
      );
    }
    

    上述代码片段的问题在于,我们在一个函数中使用了useEffect钩子,而这个函数不是一个组件,因为它以小写字母开头,也不是一个自定义钩子,因为它的名字不是以use开头。

    声明组件

    如果你想声明一个组件,请将你的函数的第一个字母大写。

    // App.js
    
    import React, {useEffect, useState} from 'react';
    
    // 👇️ is now a component (can use hooks)
    function Counter() {
      const [count, setCount] = useState(0);
    
      useEffect(() => {
        console.log(count);
      }, [count]);
    
      return (
        <div>
          <h2>Count: {count}h2>
          <button onClick={() => setCount(count + 1)}>Incrementbutton>
        div>
      );
    }
    
    export default function App() {
      return (
        <div>
          <Counter />
        div>
      );
    }
    

    函数名必须以大写字母开头,因为这有助于React区分诸如pdivspan等内置元素和我们定义的组件。

    就像文档中所说的:

    • 只从React函数组件或自定义钩子中调用Hook
    • 只在最顶层使用 Hook
    • 不要在循环,条件或嵌套函数中调用 Hook
    • 确保总是在你的 React 函数的最顶层以及任何 return 之前使用 Hook

    声明自定义钩子

    如果你想声明一个自定义钩子,自定义钩子的名称必须以use开头,比如说useCounter

    import React, {useEffect, useState} from 'react';
    
    // 👇️ is a custom hook (name starts with use)
    function useCounter() {
      const [count, setCount] = useState(0);
    
      useEffect(() => {
        console.log(count);
      }, [count]);
    
      return [count, setCount];
    }
    
    export default function App() {
      const [count, setCount] = useCounter();
    
      return (
        <div>
          <h2>Count: {count}h2>
          <button onClick={() => setCount(count + 1)}>Incrementbutton>
        div>
      );
    }
    

    自定义钩子的名字必须以use开头,这样React才能识别你的函数是一个自定义钩子。

    总结

    为了解决"React Hook 'useEffect' is called in function that is neither a React function component nor a custom React Hook function"的错误,确保只从React函数组件或自定义钩子中调用钩子。

  • 相关阅读:
    docker安装jellyfin家庭多媒体中心
    软考 系统架构设计师系列知识点之基于架构的软件开发方法ABSD(5)
    AI产业沙龙【语音之家】—京东在AI语音方向的技术探索与实践
    二进制搭建及高可用 Kubernetes v1.20
    NI USRP RIO软件无线电
    3-D HANet:一种用于目标检测的柔性三维 HeatMap 辅助网络
    【毕业设计】医学大数据分析 - 心血管疾病分析
    esbuild中文文档-基础配置项(General options - Rebuild)
    在 Substance Painter中自定义Shader
    (附源码)ssm驾校考试车预约管理系统 毕业设计 271506
  • 原文地址:https://www.cnblogs.com/chuckQu/p/16614513.html