• React报错之React hook 'useState' cannot be called in a class component


    正文从这开始~

    总览

    当我们尝试在类组件中使用useState 钩子时,会产生"React hook 'useState' cannot be called in a class component"错误。为了解决该错误,请将类组件转换为函数组件。因为钩子不能在类组件中使用。

    react-hook-usestate-cannot-be-called-in-class.png

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

    // App.js
    import {useState, useEffect} from 'react';
    
    class Example {
      render() {
        // ⛔️ React Hook "useState" cannot be called in a class component.
        // React Hooks must be called in a React function component or a custom React Hook function.
        const [count, setCount] = useState(0);
    
        // ⛔️ React Hook "useEffect" cannot be called in a class component.
        // React Hooks must be called in a React function component or a custom React Hook function.
        useEffect(() => {
          console.log('hello world');
        }, []);
    
        return (
          <div>
            <button onClick={() => setCount(count + 1)}>Incrementbutton>
          div>
        );
      }
    }
    

    导致这个错误的原因是,钩子只能在函数组件或自定义钩子中使用,而我们正试图在一个类中使用钩子。

    函数组件

    解决该错误的一种方法是,将类组件转换为函数组件。

    // App.js
    import {useState, useEffect} from 'react';
    
    export default function App() {
      const [count, setCount] = useState(0);
    
      useEffect(() => {
        console.log('hello world');
      }, []);
    
      return (
        <div>
          <h2>Count {count}h2>
          <button onClick={() => setCount(count + 1)}>Incrementbutton>
        div>
      );
    }
    

    就像文档中所说的那样:

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

    类组件中使用setState()

    另外,我们可以使用一个类组件,用setState()方法更新状态。

    // App.js
    import React from 'react';
    
    export default class App extends React.Component {
      constructor(props) {
        super(props);
    
        this.state = {
          count: 0,
        };
      }
    
      render() {
        return (
          <div>
            <h2>Count: {this.state.count}h2>
            <button onClick={() => this.setState({count: this.state.count + 1})}>
              Increment
            button>
          div>
        );
      }
    }
    

    请注意,在较新的代码库中,函数组件比类更常被使用。

    它们也更方便,因为我们不必考虑this关键字,并使我们能够使用内置和自定义钩子。

  • 相关阅读:
    VCS工具学习笔记(7)
    人工神经网络的算法原理,人工神经网络算法优点
    【又来摸鱼】如何用Python + baidu-aip 实现人脸识别?
    Java工程师进阶知识完全扫盲, 太全了!!
    C语言入门Day_28 结语
    C++设计模式 - 创建型模式之工厂模式
    一篇文章学会【node.js安装以及Vue-Cli脚手架搭建】
    微信小程序入门2
    Civil service posts-
    MySQL源码解析之执行计划
  • 原文地址:https://www.cnblogs.com/chuckQu/p/16618101.html