【问题标题】:React Router Dom, useNavigate not redirecting to the right url pathReact Router Dom,useNavigate 不重定向到正确的 url 路径
【发布时间】:2023-02-19 07:08:38
【问题描述】:

在较旧的 React Router Dom 版本中,如果用户已登录,我可以使用此代码进行重定向:

history.push('/login?redirect=shipping')

现在在 v6 中,我正在使用 useNavigate 函数而不是 history.push,但它不起作用,因为它将我带到 /login/shipping 而不是 /shipping。目前这是我的导航代码:

let navigateCart = useNavigate() 
// some code here
navigateCart('/login?redirect=shipping') // the mistake is inside the parenthesis here but i dont know what it is!

这是我的路由器配置:

<BrowserRouter>
  <Container>
    <Routes>
      <Route path="/" element={<HomeScreen />} exact />
      <Route path="/login" element={<LoginScreen />} />
      <Route path="/profile" element={<ProfileScreen />} />
      <Route path="/shipping" element={<ShippingScreen />} />
    </Routes>
  </Container>
</BrowserRouter>

登录屏幕功能:

function LoginScreen() {

    let navigateLog = useNavigate()
    let location = useLocation()

    const [email, setEmail] = useState('')
    const [password, setPassword] = useState('')

    const dispatch = useDispatch()

    const redirect = location.search ? location.search.split('=')[1] : '/'
    

    const userLogin = useSelector(state => state.userLogin)
    const { error, loading, userInfo } = userLogin


    useEffect(() => {
        if (userInfo) {
            navigateLog(redirect)
        }
    }, [navigateLog, userInfo, redirect])

    const submitHandler = (e) => {
        e.preventDefault()
        dispatch(login(email, password))
    }

【问题讨论】:

  • 显示您的路由器配置
  • @KonradLinkowski 好了!它正在为其他路线工作!
  • @KonradLinkowski 如果您需要更多代码,请告诉我
  • @bysEcode 你声明了navigate然后使用了navigateCart,这正常吗?
  • 您在LoginScreen 组件内获取参数 redirect=shipping 并进行我假设的重定向,如果是这样,您可以通过 LoginScreen 的代码吗?

标签: javascript reactjs react-router react-router-dom


【解决方案1】:

将 LoginScreen 中 useEffect 中的这一行 navigateLog(redirect) 更改为这一行:

navigateLog(`/${redirect}`);

在你的情况下,它重定向到/login/shipping而不是/shipping,因为它就像你正在调用navigateLog("shipping")因为redirect等于"shipping",所以它被用作相对路径。这意味着它考虑了您当前的 url,在您的情况下为 /login。

【讨论】:

  • 谢谢,这完全有效。看来我在重定向中遗漏了“/”,所以它没有正确读取路径!祝你一切顺利 :)
  • 很高兴我能帮上忙。谢谢,你也一样 :)
【解决方案2】:

问题

重定向目标路径是"shipping"而不是"/shipping"。 react-router-dom@6中有相对路径和绝对路径。区别很简单,绝对路径以 "/" 字符开头,而相对路径则不是。 navigate("shipping") 会将"shipping" 附加到当前pathname 的末尾并导航到那里。

解决方案

导航时在前面加上前导"/":

navigate(`/${navigateLog}`, { replace: true });

或者在您最初导航时包括它:

navigateCart('/login?redirect=/shipping');

您可能还想使用 useSearchParams 挂钩来访问 redirect 查询参数,而不是依赖它位于特定的字符串位置。

function LoginScreen() {
  const navigateLog = useNavigate();
  const [searchParams] = useSearchParams();

  ...

  const redirect = searchParams.get("redirect") || '/';
    
  ...

  useEffect(() => {
    if (userInfo) {
      navigateLog(redirect, { redirect: true });
    }
  }, [navigateLog, userInfo, redirect])

  ...

请注意,在发出命令式重定向时,我已经将一个选项对象包含到指定replace: true 的navigate 函数,这是发出 REPLACE 操作而不是 PUSH 操作。

【讨论】:

  • 看起来我使用它的方式我在 url 中缺少 '/' 反斜杠它工作正常谢谢 :) 我尝试使用 searchParams 并且它也有效。另一个人也给了我一个很好的答案,所以我在第一次尝试时将他的问题标记为答案,但这是一个完美的答案,非常感谢:)
猜你喜欢
  • 2022-12-20
  • 2016-06-16
  • 2021-04-05
  • 1970-01-01
  • 2022-08-23
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
相关资源
最近更新 更多