ChatGPT解决这个技术问题 Extra ChatGPT

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

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
React 版本呢?请注意:您需要使用 React >= 16.8 才能使用 useHistory 钩子!
React 版本已经是 16.8.4。感谢您指出“react-router-dom”版本。 @norbitrial

K
Kostas Minaidis

react-router-dom v6 中,useHistory()useNavigate() 替换。

您可以使用:

import { useNavigate } from 'react-router-dom';
const navigate = useNavigate();
navigate('/home');

在这里,您正在对要打开的页面进行硬编码。如何在此处获取历史记录以便我可以将用户导航到上一页?
我花了足够多的时间在 react-routers Github 配置文件上四处挖掘,但找不到任何注意到“useHistory”替换的东西……也许它毕竟在那里,但并不明显。感谢您使这一点显而易见!
@ShashankAC 同意,这不是那么明显。请参阅下面的答案:stackoverflow.com/a/71394655/842238
@SammyPayne 同意,这不是那么明显。请参阅下面的答案:stackoverflow.com/a/71394655/842238
他们绝对不需要改变这一点。现在我的雇主必须付钱让我花时间与 react-router 团队玩追赶游戏,就好像他们是我的竞争对手一样。组件维护者不应该让使用他们组件的人的生活变得更加困难。标准工程礼貌。
S
Sultan Aslam

然后用 useNavigate 替换 useHistory

const navigate = useNavigate();

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

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

想要在 push/navigate 中使用 state,请执行 navigate('/path', { state: { name:'Xyz' }})


您的意思是 useNavigate(),因为 useNavigation() 没有给出导出成员错误。
l
lee_mcmullen

没有一个答案实际上提到如何复制以前可从 v5 useHistory 挂钩但在 v6 中不再可用的方法,例如 goBackgoForwardgo。以下示例取自 migration guide

使用 useHistory 钩子中的方法 React Router v5 应用程序:

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

这是使用来自 useNavigate 挂钩的导航方法的 v6 等效应用程序:

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

V
Vinit Dabhi

在 v6 中,useHistory 被 useNavigate 取代。

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

从 'react-router-dom' 导入 { useNavigate } ;在文件的顶部。常量导航 = useNavigate();在你的函数中定义。导航(“/路径名”);重定向到您的路径。


N
Nafeo Joy

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

5.2.0

它现在正在工作。


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

const navigate = useNavigate();

const confirm = (e) => {
    navigate.push('/')
}

您的答案可以通过额外的支持信息得到改进。请edit添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。您可以找到有关如何写出好答案的更多信息in the help center
看起来这不再起作用了,例如。 “不是函数” - 在 v6 上
T
Tosin Akerele

如果你必须坚持使用最新的 react-router-dom v6.0.0,那么将 useHistory 替换为 useNavigate。否则,将您的 react-router-dom 降级到 v5.2.0 并且您的代码可以正常工作。


J
Jamal Ashraf

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

常量导航 = useNavigate();

导航(“/登录”)


M
MHAMMED TALHAOUY

react-router-dom v5 useHistory,但在 v6 中您应该使用 useNavigate 挂钩

用法:

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

function SignupForm() {
  let navigate = useNavigate();

  async function handleSubmit(event) {
    event.preventDefault();
    await submitForm(event.target);
    navigate("../success", { replace: true });
  }

  return <form onSubmit={handleSubmit}>{/* ... */}</form>;