Impossible de lire la propriété «historique» de non défini (hook useHistory de React Router 5)

18

J'utilise le nouveau crochet useHistory de React Router, qui est sorti il ​​y a quelques semaines. Ma version de React-router est 5.1.2. My React est à la version 16.10.1. Vous pouvez trouver mon code en bas.

Pourtant, lorsque j'importe le nouveau useHistory de react-router, j'obtiens cette erreur:

Uncaught TypeError: Cannot read property 'history' of undefined

qui est causé par cette ligne dans React-router

function useHistory() {
  if (process.env.NODE_ENV !== "production") {
    !(typeof useContext === "function") ? process.env.NODE_ENV !== "production" ? invariant(false, "You must use React >= 16.8 in order to use useHistory()") : invariant(false) : void 0;
  }

  return useContext(context).history; <---------------- ERROR IS ON THIS LINE !!!!!!!!!!!!!!!!!
}

Puisqu'il est lié à useContext et qu'un conflit avec le contexte est peut-être en cause, j'ai essayé de supprimer complètement tous les appels à useContext, de créer le fournisseur, etc. Cependant, cela n'a rien fait. Testé avec React v16.8; même chose. Je n'ai aucune idée de ce qui pourrait être à l'origine de cela, car toutes les autres fonctionnalités du routeur React fonctionnent correctement.

*** Notez que la même chose se produit lors de l'appel des autres crochets du routeur React, tels que useLocation ou useParams.

Quelqu'un d'autre a-t-il rencontré cela? Des idées sur ce qui peut provoquer cela? Toute aide serait grandement appréciée, car je n'ai rien trouvé sur le Web concernant ce problème.

import React, {useEffect, useContext} from 'react';
import { BrowserRouter as Router, Route, Link } from "react-router-dom";
import { Switch, useHistory } from 'react-router'
import { useTranslation } from 'react-i18next';

import lazyLoader from 'CommonApp/components/misc/lazyLoader';
import {AppContext} from 'CommonApp/context/context';

export default function App(props) {
    const { i18n } = useTranslation();
    const { language } = useContext(AppContext);
    let history = useHistory();

    useEffect(() => {
        i18n.changeLanguage(language);
    }, []);

    return(
        <Router>
            <Route path="/">
                <div className={testClass}>HEADER</div>
            </Route>
        </Router>
    )
}
Radu Sturzu
la source

Réponses:

31

C'est parce que le contexte du routeur de réaction n'est pas défini dans ce composant. Étant donné que c'est le <Router>composant qui définit le contexte, vous pouvez l'utiliser useHistorydans un sous-composant, mais pas dans celui-ci.

Brian Thompson
la source
Merci Brian. C'était en effet la cause du problème. :)
Radu Sturzu
1
Doh, si évident quand vous l'avez signalé, merci
Jason Rogers
6

Remarque pour les autres personnes qui rencontrent ce problème et ont déjà encapsulé le composant avec le composant Router. Assurez-vous que le routeur et le crochet useHistory sont importés du même package. La même erreur peut être levée lorsque l'un d'eux est importé de react-router et l'autre de react-router-dom et que les versions de package de ces packages ne correspondent pas. N'utilisez pas les deux, lisez la différence ici .

Rire de Lenny
la source
2

J'ai mis à jour mon react-router-dom5.0.0 vers ^ 5.1.2 et il a été résolu. Vous pouvez remarquer que le useHistoryest dans un sous-composant.

Ati Barzideh
la source