Ich erhalte diesen Fehler, wenn ich den useState
Haken benutze . Ich habe dies in seiner Grundform und schaue in den Reaktionsdokumenten nach einer Referenz, erhalte aber immer noch diesen Fehler. Ich bin bereit für den Moment mit der Gesichtspalme ...
export function Header() {
const [count, setCount] = useState(0)
return <span>header</span>
}
javascript
reactjs
react-hooks
loganfromlogan
quelle
quelle
Antworten:
Aktualisiert: 2018-Dez
Neue Version von
react-hot-loader
ist ab sofort erhältlich, Link . Hooks funktioniert jetzt sofort. Vielen Dank an den Autor, theKashey.Schauen Sie sich diese Boilerplate https://github.com/ReeganExE/react-hooks-boilerplate an
Vorherige Antwort:
Stellen Sie zunächst sicher, dass Sie
react@next
und installiert habenreact-dom@next
.Überprüfen Sie dann, ob Sie verwenden
react-hot-loader
oder nicht.In meinem Fall könnte das Deaktivieren von Hot Loader & HMR funktionieren.
Siehe https://github.com/gaearon/react-hot-loader/issues/1088 .
Zitiert:
Es gibt eine bessere Lösung, die funktionieren würde - Cold API
Sie können RHL für jeden benutzerdefinierten Typ deaktivieren.
import { cold } from 'react-hot-loader'; cold(MyComponent);
Suchen Sie nach
"useState/useEffect"
Quellcode innerhalb der Komponente und "kalt".Aktualisiert:
Gemäß der Aktualisierung des React-Hot-Loader-Betreuers können Sie versuchen
react-hot-loader@next
, die Konfiguration wie folgt festzulegen:import { setConfig } from 'react-hot-loader'; setConfig({ // set this flag to support SFC if patch is not landed pureSFC: true });
Vielen Dank an @loganfromlogan für das Update.
quelle
cold
. Also{MyComponent(props)}
wird nicht funktionieren, aber<MyComponent {...props} />
wird.Mein Problem war das Vergessen, das
react-dom
Modul zu aktualisieren . Siehe Ausgabe .quelle
Hatte das gleiche Problem. Mein Problem hing mit React Router zusammen. Ich hatte versehentlich benutzt
anstatt
quelle
Ich konnte dieses Problem lösen, indem ich die primitiven Hooks von React in die Komponentendatei importierte und sie dann an meine benutzerdefinierten Hooks übergab. Aus irgendeinem Grund tritt der Fehler nur auf, wenn ich den React-Hook (wie useState) in meine benutzerdefinierte Hook-Datei importiere.
Ich importiere useState in meine Komponentendatei:
import React, {useState} from 'react'; // import useState import {useCustomHook} from '../hooks/custom-hook'; // import custom hook const initialState = {items: []}; export default function MyComponent(props) { const [state, actions] = useCustomHook(initialState, {useState}); ... }
Dann in meiner Hook-Datei:
// do not import useState here export function useCustomHook(initialValue, {useState}) { const [state, setState] = useState(initialValue || {items: []}); const actions = { add: (item) => setState(currentState => { const newItems = currentState.items.concat([item]); return { ...currentState, items: newItems, }; }), }; return [state, actions]; }
Diese Methode hat die Testbarkeit meiner Hooks verbessert, da ich die Bibliothek von React nicht verspotten muss, um die primitiven Hooks bereitzustellen. Stattdessen können wir einen Mock-
useState
Hook direkt an die Funktion des benutzerdefinierten Hooks übergeben. Ich denke, dies verbessert die Codequalität, da Ihre benutzerdefinierten Hooks jetzt keine Kopplung mit der React-Bibliothek haben, was eine natürlichere funktionale Programmierung und Prüfung ermöglicht.quelle
Ich habe diesen Fehler bei der Verwendung von Parcel's Hot Module Replacement
react-dom
festgestellt und durch Aktualisierung auf die Alpha-Version behoben :yarn add react-dom@16.7.0-alpha.0
Siehe dieses Problem.
quelle
Ich hatte ein Problem in einem Monorepo, in dem ein Paket docz verwendet wurde
[email protected]
und das endgültige Ausgabepaket zwei Reaktionsversionen hatte.Ausgabe auf Github
Es wurde behoben, indem das Paket 😅 entfernt wurde
quelle
Das Problem für mich war in der Tat React-Hot-Loader .
Sie können den React-Hot-Loader für eine einzelne Komponente anstelle der gesamten App mithilfe der folgenden
cold
Methode deaktivieren :import { cold } from 'react-hot-loader' export const YourComponent = cold(() => { // ... hook code return ( // ... ) })
ODER
export default cold(YourComponent)
quelle
Nur um die Antwort von @ rista404 näher zu erläutern, einschließlich doppelter Versionen von
react
(und vielleichtreact-dom
), wird der gleiche Fehler ausgegeben, je nachdem, wo Sie Ihre Hooks verwenden. Hier sind zwei Beispiele ...react
in seinemdependencies
, wahrscheinlich durch einen Fehler wiereact
in der Regel eine Peer - Abhängigkeit sein sollte. Wennnpm
diese Version nicht automatisch mit Ihrer lokalen Version dedupliziert wird, wird dieser Fehler möglicherweise angezeigt. Darauf bezog sich @ rista404.npm link
ein Paket, dasreact
in seinemdevDependencies
oder enthältdependencies
. Bei Modulen in diesem Paket werden möglicherweise Fehler angezeigt, wenn sie eine andere Versionreact
aus dem lokalennode_modules
Verzeichnis als aus dem übergeordneten Projekt abrufen.Letzteres kann festgelegt werden , wenn sie mit der Bündelung
webpack
unter Verwendungresolve.alias
wie so ...resolve: { alias: { 'react': path.resolve(__dirname, 'node_modules/react'), 'react-dom': path.resolve(__dirname, 'node_modules/react-dom') } }
Dadurch wird sichergestellt, dass
react
immer aus demnode_modules
Verzeichnis des übergeordneten Projekts gezogen wird .quelle
Stellen Sie für diejenigen, die auf dieses Problem stoßen, wenn Sie MobX verwenden und eine Komponente mit einem umschließen
observer
, sicher, dass Siemobx-react-lite
anstelle von verwendenmobx-react
.29. MAI UPDATE
Von
mobx-react
6.0.0
weiter, sind Haken basierte Komponenten nun unterstützt mobx reagieren , so gibt es für keine Notwendigkeitmobx-react-lite
Nutzung mehr (wenn das Ihr Problem war).quelle
fand diese Problemumgehung für
react-hot-loader
während der PR, um das Problem zu beheben, eingehend ist.Schließen Sie die Funktion, die Hooks aufruft, in a ein
React.memo
und verhindern Sie ein erneutes Laden im laufenden Betrieb, wenn sie unverändert bleibt.const MyFunc = React.memo(({props}) => {...
Gutschrift für die Lösung: https://github.com/gatsbyjs/gatsby/issues/9489
quelle
Mein Problem war das folgende:
Ich habe getan:
ReactDOM.render(Example(), app);
Während ich hätte tun sollen:
ReactDOM.render(<Example />, app);
quelle
Für Mitbenutzer von Garnarbeitsbereichen ist hier meine Situation und wie ich es herausgefunden habe.
Die Facebook-Dokumente zu Invalid Hook Call Warning sagen nichts über Garnarbeitsbereiche aus, daher nahm ich an, dass meine Konfiguration korrekt war. Aber es war nicht so. Sie können den Fehler nur beheben, indem Sie für alle Pakete dieselbe Version verwenden .
Im obigen Beispiel müssen Sie die Version von react von "foo" auf 16.10.1 erhöhen, damit sie mit der React-Version von "bar" übereinstimmt.
Bonus: In dieser Diskussion auf GitHub finden Sie eine schöne Sammlung von emotionalem Gepäck, das im Internet abgeladen wurde.
quelle
Eine andere Lösung, wenn Sie bei Verwendung von npm link darauf stoßen:
Sie können
npm link
in Ihrer Bibliothek wie hier beschrieben reagieren: https://reactjs.org/warnings/invalid-hook-call-warning.html#duplicate-reactoder setzen Sie in Ihrer Bibliothek als peerDependency reagieren und verwenden Sie dann
npm link --only=production
quelle
Wenn Sie die Create React App verwenden, müssen Sie die
"react-scripts"
Version auch mit der React- und React -Dom-Version aktualisieren ."react-scripts": "2.1.5", "react": "^16.8.1", "react-dom": "^16.8.1",
Diese Kombination funktioniert gut.
quelle
Für mich geschah dies, weil ich eine neue Version von react (16.8.6) und eine alte Version von react-dom (16.6.1) hatte.
https://reactjs.org/warnings/invalid-hook-call-warning.html#mismatching-versions-of-react-and-react-dom
Durch ein Upgrade auf @latest (16.8.6) wurde der Fehler behoben.
quelle
Nun, in meinem Fall habe ich useSelector in useEffect aufgerufen !!
quelle
Aktualisieren Sie die React-Dom-Version von package.json als React
quelle