【问题标题】:Unable to use "useState" functional component in React无法在 React 中使用“useState”功能组件
【发布时间】:2019-12-03 08:23:37
【问题描述】:

我有一个带有 useState 钩子的 React 功能组件。

我将此函数组件用作index.html 内的脚本标记的src。 当我在这个功能组件的末尾添加一个render 方法时,它会抛出一个错误,指出无效的钩子。

我创建了一个index.html,并在其中将welcome.js 指定为脚本标签的源。当这个脚本执行时,它会调用函数welcome.js。 在Welcome 函数中,如果我使用状态挂钩,则会引发错误:

“无效的钩子调用。只能在函数组件的主体内部调用钩子”

<script src="./Welcome.js"> </script>

welcome.js:

import React, {useState} from "react";
import {render} from "react-dom";

const Welcome = () => {
    const [name, setName] = useState("name");

    return(
        <div>     
            <label htmlFor="name">Name</label>       
            <input
             id="name"
             value={name}
             onChange= {e=>setName(e.target.value)}
             >
            </input>
        </div>
    )
}

render(<Welcome/>, document.getElementById("root"));

我想知道为什么我不能在这里使用welcome.js 中的状态挂钩。我们不能将状态钩子与render 方法一起使用吗?

【问题讨论】:

  • @MeetZaveri render 是从 react-dom 导入的
  • 是的,这是个错误
  • @AyyappaGollu 这是什么版本的反应?你的捆绑器是什么? I can't reproduce it
  • @JohnRuddell 我正在使用 react@16.8.6。包裹打包机。
  • 您是否有可能使用两个或多个不同版本的 react?在这种情况下,这是一个known problem

标签: javascript reactjs react-hooks


【解决方案1】:

组件内的代码是有效的。问题在于依赖问题或构建工具配置。确定

  1. 你有更大的 react-dom 版本 16.8.0 (运行npm ls react-dom)
  2. 您只导入了一个版本的 react。 (运行npm ls react

这里是指向working example 的链接,其中包含您提供的代码。 注意 pakcage.json 文件。 更多详情react docs

【讨论】:

  • 为什么 你有更大的 react-dom 版本 16.8.0 ?从 16.3 或类似的版本开始,afaik 钩子运行良好
  • 查看文档链接
  • @MotiKorets 嗨 Moti korets 感谢您的帮助。我创建了新项目并再次使用相同的文件,令人惊讶的是它起作用了。我想我的代码是有效的。我还检查了没有运行的反应应用程序,它只有一个。
猜你喜欢
  • 2021-02-28
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
  • 2021-07-12
  • 2021-04-21
相关资源
最近更新 更多