TypeError dispatcher.useState не является функцией при использовании React Hooks

У меня есть этот компонент:

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;

поскольку я хочу опробовать новое предложение React-хуков, установив [email protected] в моем package.json, но я получаю ошибку:

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 |   });

Что я сделал не так?

Ответ 1

Причин может быть много, и большинство из них из-за несовместимости версий или использования ^ в package.json:

  1. Убедитесь, что вы также обновили пакет react-dom и он имеет ту же версию, что и react. В целом, react и react-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",
    ...
  }
}

  1. Если вы используете шутя, убедитесь, что react-test-renderer имеет ту же версию, как react и react-dom:

Пример package.json:

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

Ответ 2

Вы можете получить ту же ошибку при использовании шутки. Поэтому, чтобы исправить ошибку, мне пришлось обновить реагировать на тестирование, чтобы иметь ту же версию, что и реагировать и реагировать

   yarn add -D [email protected]

Или же

     npm i [email protected]

Все реагировать, реагировать-дом и реагировать-тест-рендерер должен содержать одну и ту же версию

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

Ответ 3

Теперь, когда реакция 16.7 (та, которая не содержит хуков) выпущена, вы можете получить ошибку, если ^16.7.0-alpha.0 с ведущим ^ в вашем package.json.

Для версии с хуками вы должны опустить ^.

Ответ 5

React.useState(0) мой, вызвав React.useState(0).

Если реагирующая версия достаточно новая, ей просто нужно использовать React.useState.