Uncaught Error: Rendered fewer hooks than expected. This may be caused by an accidental early return

const {useState} = React;

function App() {
  const [name, setName] = useState('Mary');
  const [age, setAge] = useState(16);

  if (age < 16) {
    return (
      <div>
        Name:{' '}
        <input
          value={name}
          onChange={e => {
            setName(e.target.value);
          }}
        />
        <br />
        Age:{' '}
        <input
          value={age}
          type="number"
          onChange={e => {
            setAge(+e.target.value);
          }}
        />
      </div>
    );
  }

  const [license, setLicense] = useState('A123456');

  return (
    <div>
      Name:{' '}
      <input
        value={name}
        onChange={e => {
          setName(e.target.value);
        }}
      />
      <br />
      Age:{' '}
      <input
        value={age}
        type="number"
        onChange={e => {
          setAge(+e.target.value);
        }}
      />
      <br />
      Driver License:{' '}
      <input
        value={license}
        onChange={e => {
          setLicense(e.target.value);
        }}
      />
    </div>
  );
}

ReactDOM.render(<App />, document.querySelector('#app'));

以上代码在执行之后,会报以下错误:

Uncaught Error: Rendered fewer hooks than expected. This may be caused by an accidental early return statement.
    at invariant (react-dom.development.js:55)
    at finishHooks (react-dom.development.js:11581)
    at updateFunctionComponent (react-dom.development.js:14262)
    at beginWork (react-dom.development.js:15103)
    at performUnitOfWork (react-dom.development.js:17817)
    at workLoop (react-dom.development.js:17857)
    at HTMLUnknownElement.callCallback (react-dom.development.js:149)
    at Object.invokeGuardedCallbackDev (react-dom.development.js:199)
    at invokeGuardedCallback (react-dom.development.js:256)
    at replayUnitOfWork (react-dom.development.js:17113)
    at renderRoot (react-dom.development.js:17957)
    at performWorkOnRoot (react-dom.development.js:18808)
    at performWork (react-dom.development.js:18716)
    at flushInteractiveUpdates$1 (react-dom.development.js:18987)
    at batchedUpdates (react-dom.development.js:2210)
    at dispatchEvent (react-dom.development.js:4946)
    at interactiveUpdates$1 (react-dom.development.js:18974)
    at interactiveUpdates (react-dom.development.js:2217)
    at dispatchInteractiveEvent (react-dom.development.js:4923)

问题在于,第一次渲染时,useState调用了 3 个钩子 - name,age但是license将age修改为低于16后,不再调用useState ,导致只调用了前2个钩子。license此举正如React 文档所述:

不要在循环、条件或嵌套函数内调用 Hook。相反,请始终在 React 函数的顶层使用 Hooks通过遵循此规则,您可以确保每次渲染组件时都以相同的顺序调用 Hook。useState就是允许 React 在多个和调用之间正确保留 Hooks 状态的原因。

调用钩子的顺序很重要,如果我们编写的代码导致钩子不被调用,React 将无法将钩子调用与其值匹配。

解决方案是将license挂钩移动到函数的顶部,以便无论是否需要它都会被调用。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Uncaught Error: Initialize failed: invalid dom 这个错误表示在初始化过程中出现了无效的 DOM 元素。通常情况下,这可能是由于以下原因之一导致的: 1. 错误的 DOM 元素:在初始化过程中,你可能指定了一个无效的 DOM 元素作为 Vue 实例的根元素。这可能是由于 DOM 元素的 id 或 class 错误或不存在,或者在指定 DOM 元素之前没有将其添加到文档中。你需要确保指定的 DOM 元素是有效的并且存在于文档中。 2. 修改 el 选项:Vue 实例的 el 选项在初始化后被修改为无效的 DOM 元素。这可能是因为在初始化后尝试更改 Vue 实例的 el 选项时,指定了一个无效的 DOM 元素。你需要确保新指定的 DOM 元素是有效的,并且它存在于文档中。 对于解决这个问题,你可以按照以下步骤进行操作: 1. 检查 DOM 元素:确保在初始化 Vue 实例时指定的 DOM 元素是有效的,并且它存在于文档中。你可以检查 DOM 元素的 id 或 class 是否正确,并且确认元素已经添加到文档中。 2. 避免修改 el 选项:如果你需要在初始化后更改 Vue 实例的 el 选项,确保新指定的 DOM 元素是有效的。你可以在更改 el 选项之前,先检查一下新指定的 DOM 元素是否存在于文档中。 通过以上步骤,你应该能够解决 Uncaught Error: Initialize failed: invalid dom 错误。如果问题仍然存在,请检查其他可能的错误或尝试提供更多的上下文信息以便进一步分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hzxOnlineOk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值