【问题标题】:React - Invalid hook call & class ComponentReact - 无效的钩子调用和类组件
【发布时间】:2020-11-29 09:16:15
【问题描述】:

我知道钩子是类组件的对立面——不要误会我的意思,我只是不知道一行简单的代码如何使这个错误出现,以及我必须在该行中做出什么改变它在类组件中工作。我得到了以下示例,它非常适用于 .jsx 类型的文件和功能组件。

Codesandbox example one

此代码只是在组件之间共享状态的一种简单方式。所以我们得到了文件extendDiv,其中我们有我们的状态和一个简单的函数来改变那个状态;然后我们有一个global 文件,用于获取该状态并将其分发给我们所有的组件:son (filho) 和father (pai)。 在codesandbox example one 中它工作得很好,但是当我做完全相同的事情但使用App.jsx 中的类组件和一些打字稿文件时,它在以下代码中给了我以下错误:

global.isDivExtended = extendDiv();
//Invalid hook call. Hooks can only be called inside of the body of a function component.

您可以在这里查看所有代码并尝试一下:Codesandbox example two

我应该在这里做什么才能使它在类组件中工作?我已经尝试过bind 全局并使用this...非常感谢。

【问题讨论】:

  • 你不能像错误所说的那样在类中使用钩子,你需要重写没有钩子的逻辑。
  • 嗨。我知道,但是没有办法改变那条线以使其在类组件中工作?这就是我在这里的使命。谢谢。 @DennisVash
  • 不,你不能。你需要重写。
  • 好的先生,谢谢。但是那条简单的行中的什么类型的东西说这是一个钩子?我找不到任何区别。 @DennisVash

标签: reactjs typescript class react-hooks state


【解决方案1】:

不能从类组件中调用 React 钩子。

您可以将所述类组件转换为函数组件,或者将其保留为类组件并以良好的类组件方式管理状态。最好转换成函数。

沙盒似乎没有所有文件,所以我不能确定,但​​我相信这可能有效:

import * as React from "react";
import "./styles.css";
import Father from "../src/components/father";
import global from "./global";
import extendDiv from "./extendDiv";

function App(props) {
  let [dateVar, setDateVar] = React.useState({ date: new Date() })
  global.isDivExtended = extendDiv();

  return (
      <>
        <Father></Father>
      </>
  )
}

export default App;

或者,您可以为您的钩子编写一个高阶组件包装器,以便您可以将钩子的逻辑作为道具传递给您的类组件as explained here。但是,如果可能的话,我建议避免它;它很混乱,更难测试。函数组件的编写(和阅读)更有趣,而且它们似乎是 React 的未来。

【讨论】:

  • 嗨。谢谢你的回答。这里的问题是我必须在一个具有类组件的旧项目中使用这个逻辑,如果它适合我​​,我会以正确的方式将它更改为钩子:D。我只是想知道是否没有办法改变这一行“global.isDivExtended = extendDiv();”让它在类组件上工作的其他东西。老实说,我不知道这条简单的线路中有什么“尖叫”。再次感谢@pitamer
  • 问题出在 extendDiv.tsx 的第 4 行:const [isDivExtended, setIsDivExtended] = useState(false)。变量isDivExtended 是一个钩子声明的状态,它有一个匹配函数将其设置为一个新值。因此,您不能在类组件中使用它。如果您必须为此项目仅使用类组件,我建议将 isDivExtended 初始化为 App.tsxthis.state 内的状态。
  • 另一个问题是自定义钩子确实应该保持useXyz 命名模式以避免混淆(因为它似乎已经造成了)。如果可以的话,你真的应该重命名钩子。
猜你喜欢
  • 1970-01-01
  • 2023-02-11
  • 2020-12-21
  • 2021-05-08
  • 2020-02-08
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多