javascript React Router Dom,use导航未重定向到正确的url路径

s8vozzvw  于 2023-02-21  发布在  Java
关注(0)|答案(2)|浏览(103)

在旧的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))
    }
6jygbczu

6jygbczu1#

LoginScreenuseEffect内部的navigateLog(redirect)行更改为以下行:

navigateLog(`/${redirect}`);

在你的例子中,它重定向到/login/shipping而不是/shipping,因为它就像你在调用navigateLog("shipping"),前面没有/,它被用作一个相对路径,这意味着它会考虑你的当前路径,在你的例子中,它碰巧是/login

zsohkypk

zsohkypk2#

问题

重定向目标路径是"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: truenavigate函数时,这是为了发出REPLACE操作而不是PUSH操作。

相关问题