尝试导入错误:“useHistory”未从“react-router-dom”导出

Naf*_*Joy 5 reactjs react-hooks

useHistory 给出此错误:

无法编译 ./src/pages/UserForm/_UserForm.js 尝试导入错误:“useHistory”未从“react-router-dom”导出。此错误发生在构建期间,无法消除。

react-router-dom 版本:

4.3.1

代码:

import React, { useState, Fragment } from 'react';
import FormUserDetails from './FormUserDetails';
import FormPersonalDetails from './FormPersonalDetails';
import Confirm from './Confirm';
import Success from './Success';
import Button from '@material-ui/core/Button';
import { Grid, makeStyles } from '@material-ui/core';
import { useHistory } from 'react-router-dom';


function UserForm() {
    const [step, setStep] = useState(1);
    const history = useHistory();


    const StepButtons = (props) => (
        <React.Fragment>
            <Grid item xs={4}>
                {props.value !== 'initial' ?
                    <Button variant="outlined" className={classes.button} onClick={(e) => previousStep(e)}>Back</Button> :
                    <Button variant="outlined" className={classes.button} onClick={(e) => reGenerate(e)}>Re-generate</Button>
                }
            </Grid>
            <Grid item xs={4} />
            <Grid item xs={4}>
                {
                    props.value === 'confirm' ?
                        <Button variant="outlined" className={classes.button} style={{ float: "right" }} onClick={(e) => confirm(e)}>Confirm</Button> :
                        props.value !== 'final' ?
                            <Button variant="outlined" className={classes.button} style={{ float: "right" }} onClick={(e) => nextStep(e)}>Continue</Button> :
                            null
                }
            </Grid>
        </React.Fragment>

    );
    const nextStep = (e) => {
        e.preventDefault();
        setStep(prevState => prevState + 1)
    }
    const previousStep = (e) => {
        e.preventDefault();
        setStep(prevState => prevState - 1)
    }
    const reGenerate = (e) => {
        e.preventDefault();
    }
    const confirm = (e) => {
        history.push('/')
    }
    return (
         <div>
            <h1>Hello</h1>
         </div>
    )
}
export default UserForm
Run Code Online (Sandbox Code Playgroud)

sul*_*lam 126

然后将useHistory替换为useNavigate

const navigate = useNavigate();
Run Code Online (Sandbox Code Playgroud)

然后替换history.push('/path')navigate('/path')

更改history.replace('/path')navigate('/path', { replace: true })

想要state推送/导航中使用navigate('/path', { state: { name:'Xyz' }})

  • 您的意思是 useNavigate() 吗,因为 useNavigation() 没有给出导出成员错误。 (2认同)

lee*_*len 45

没有一个答案实际上提到如何复制过去在 v5 挂钩中可用useHistory但在 v6 中不再可用的方法,例如goBack, goForward, go。以下示例取自迁移指南

使用 hook 中的方法来 React Router v5 应用程序useHistory

// This is a React Router v5 app
import { useHistory } from "react-router-dom";

function App() {
  const { go, goBack, goForward } = useHistory();

  return (
    <>
      <button onClick={() => go(-2)}>
        Go 2 pages back
      </button>
      <button onClick={goBack}>Go back</button>
      <button onClick={goForward}>Go forward</button>
      <button onClick={() => go(2)}>
        Go 2 pages forward
      </button>
    </>
  );
}
Run Code Online (Sandbox Code Playgroud)

navigate这是使用 hook中的方法与 v6 等效的应用程序useNavigate

// This is a React Router v6 app
import { useNavigate } from "react-router-dom";

function App() {
  const navigate = useNavigate();

  return (
    <>
      <button onClick={() => navigate(-2)}>
        Go 2 pages back
      </button>
      <button onClick={() => navigate(-1)}>Go back</button>
      <button onClick={() => navigate(1)}>
        Go forward
      </button>
      <button onClick={() => navigate(2)}>
        Go 2 pages forward
      </button>
    </>
  );
}
Run Code Online (Sandbox Code Playgroud)


小智 32

useHistory在 v6 中被替换useNavigate

只需将 useHistory 名称替换为 useNavigate,或按照以下 3 个简单步骤操作。

  1. import { useNavigate } from 'react-router-dom' ;在你的文件的顶部。

  2. const navigate = useNavigate();在你的函数中定义。

  3. navigate("/path_name");重定向到您的路径。


Moh*_*ADI 10

在 react-router-dom V6 useHistory() 被 useNavigate() 取代

您可以使用:

import {useNavigate} from 'react-router-dom';
const navigate = useNavigate();
navigate('/home')
Run Code Online (Sandbox Code Playgroud)

  • 他们绝对不需要改变这一点。现在我的雇主必须付钱给我花时间与react-router团队进行追赶游戏,就好像他们是我的竞争对手一样。组件维护者不应该让使用其组件的人的生活变得更加困难。标准工程礼貌。 (5认同)
  • 在这里,您对要打开的页面进行硬编码。如何获取此处的历史记录以便我可以将用户导航到上一页? (3认同)
  • 我花了足够多的时间在react-routers Github配置文件上进行挖掘,但找不到任何注意到“useHistory”替换的内容......也许它毕竟在那里,但并不明显。感谢您让这一点变得显而易见! (3认同)
  • https://reactrouter.com/docs/en/v6/hooks/use-navigate 导航函数有两个签名:要么传递一个 To 值(与 &lt;Link to&gt; 类型相同),并带有可选的第二个 { Replace, state } arg或者传递您想要进入历史堆栈的增量。例如,navigate(-1) 相当于点击后退按钮。 (2认同)

小智 9

只需将 useHistory 替换为 useNavigate 即可:

import { useNavigate } from "react-router-dom";
Run Code Online (Sandbox Code Playgroud)

然后

const navigate = useNavigate();
Run Code Online (Sandbox Code Playgroud)

最后的,

navigate("/home");
Run Code Online (Sandbox Code Playgroud)


小智 9

V6已废弃useHistory挂钩。现在使用useNavigate钩子。
用法

import {useNavigate} from 'react-router-dom';
Run Code Online (Sandbox Code Playgroud)

假设你有一个函数名称 sendData

function sendData(){
    let data = {name,email,password}
    let results = await fetch('http://localhost:8000/api/register',{
        method:'POST',
        headers:{
            'Content-Type': 'application/json',
            'Accept':'application/json'
        },
        body:JSON.stringify(data)
    });
    results = await results.json();
    console.warn("results",results);
    localStorage.setItem('user',JSON.stringify(results))
    navigate('../add',{replace:true})
}
Run Code Online (Sandbox Code Playgroud)

要返回,请使用navigate('../add',{replace:true})
要前进,请使用navigate('/add')


小智 7

import { useNavigate } from 'react-router-dom';

const navigate = useNavigate();

const confirm = (e) => {
    navigate.push('/')
}
Run Code Online (Sandbox Code Playgroud)

  • 通过额外的支持信息可以改进您的答案。请[编辑]添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以[在帮助中心](/help/how-to-answer)找到有关如何写出好的答案的更多信息。 (7认同)

Hid*_*man 7

根据上述答案,如果问题存在,我会添加额外的要点v5

如果你坚持使用react-router-dom v5,你必须升级到5.2.0,问题就会得到解决,因为它是在5.2.0


或者您可以升级并v6使用useNavigateuseHistory

import { useNavigate } from 'react-router-dom';

const navigate = useNavigate();

navigate('/home');
Run Code Online (Sandbox Code Playgroud)


Naf*_*Joy 6

我将 react-router-dom 的版本升级为

5.2.0

它现在正在工作。


小智 5

在react-router-dom v6中,useHistory()函数被useNavigate()取代。

常量导航 = useNavigate();

导航(“/登录”)