【问题标题】:TypeError dispatcher.useState is not a function when using React Hooks使用 React Hooks 时 TypeError dispatcher.useState 不是函数
【发布时间】:2019-04-01 03:12:54
【问题描述】:

我有这个组件:

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

function App() {
  const [count, setCount] = useState(0);
  useEffect(() => {
    document.title = `You clicked ${count} times`;
  });

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>Click me</button>
    </div>
  );
}

export default App;

因为我想通过在我的 package.json 中安装 react@16.8.1 来尝试新的 React hooks 提案,但我收到了一个错误:

TypeError: dispatcher.useState is not a function

  2 | import ReactDOM from "react-dom";
  3 | 
  4 | function App() {
> 5 |   const [count, setCount] = useState(0);
    |                                     ^
  6 |   useEffect(() => {
  7 |     document.title = `You clicked ${count} times`;
  8 |   });

我做错了什么?

【问题讨论】:

    标签: javascript reactjs react-hooks


    【解决方案1】:

    可能有很多原因,大多数是由于版本不兼容或在package.json 中使用^

    1。确保reactreact-dom 是同一版本

    确保您还更新了react-dom 包,它react 的版本相同。一般来说,reactreact-dom 应该始终是 package.json 中的相同版本,因为 React 团队会一起更新它们。

    如果您想安装 React 16.7.0-alpha.2,请检查您没有使用 ^,因为您将安装 16.7,它没有钩子。

    例如package.json:

    {
      ...
      "dependencies": {
        "react": "16.8.4", // Make sure version is same as react-dom
        "react-dom": "16.8.4",
        ...
      }
    }
    

    2。 react-test-rendererreactreact-dom 的版本相同

    如果您使用的是 Jest,请确保 react-test-rendererreactreact-dom 的版本相同:

    例如package.json:

    {
      ...
      "dependencies": {
        "react": "16.8.4",
        "react-dom": "16.8.4",
        "react-test-renderer": "16.8.4",
        ...
      }
    }
    

    【讨论】:

    • +1 Also check that you are not using the ^ as you will install 16.7 instead, which doesn't have hooks. 非常感谢,谢谢。
    • 即使使用 16.8.1 和 NPM 强制安装,我也会得到这个。
    • 不,还是没用!你能给我们提琴手,你做了同样的事情并且对你有用吗?
    • 谢谢。我为反应版本添加了"^"。删除它可以解决这个问题。
    【解决方案2】:

    您在使用 jest 时可能会遇到同样的错误。所以要修复这个错误,我必须更新 react-test-renderer 以具有与 react 和 react-dom 相同的版本

    yarn add -D react-test-renderer@next
    

    或者

    npm i react-test-renderer@next
    

    所有 react、react-dom 和 react-test-renderer 都应该包含相同的版本

    "react": "^16.7.0-alpha.0",
    "react-dom": "^16.7.0-alpha.0",
    "react-test-renderer": "^16.7.0-alpha.0"
    

    【讨论】:

      【解决方案3】:

      现在 react 16.7(一个包含钩子的)已经发布,如果你在package.json 中输入^16.7.0-alpha.0 和前导^ 可能会出错。

      对于带有钩子的版本,您必须省略 ^

      【讨论】:

        【解决方案4】:

        我刚刚更新到最新版本的 react 和 react DOM,它对我有用。 Check React versions here

        【讨论】:

          【解决方案5】:

          通过调用React.useState(0)修复我的问题。

          如果 React 版本足够新,它只需要使用 React.useState

          【讨论】:

          • 谢谢!由于您的回答,我重新检查了我调用 { useEffect, useState } 的行。很奇怪,但模块“react”已更新为“react-redux”。
          【解决方案6】:

          使用 React 和 {useState}:

          import React,{useState} from 'react';
          
          const Renu = () => {
              const[heart,heartSet]= useState('renu'); 
              return(
                  <h1>vikas love {heart}</h1>
              )
          }
          
          export default Renu;
          

          【讨论】:

            【解决方案7】:

            确保您正确使用挂钩。当您使用错误但错误描述还不够时,它也对我有用。

             import React,{useState} from 'react';
            
             const ComponentName= () => {
               const[stateOne, setStateOne]= useState(initial); // right usage - []
               const{stateTwo, setStateTwo}= useState(initial); // wrong usage - {}
                                                                                 
               useEffect(() => {
                   setStateOne(value1);
                   setStateTwo(value2);
               }, []);
            }
            
            export default ComponentName;
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-11-30
              • 2021-04-07
              • 2019-04-16
              • 1970-01-01
              • 2020-01-27
              • 2020-08-18
              • 2020-08-25
              • 1970-01-01
              相关资源
              最近更新 更多