在旧的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))
}
2条答案
按热度按时间6jygbczu1#
将
LoginScreen
中useEffect
内部的navigateLog(redirect)
行更改为以下行:在你的例子中,它重定向到
/login/shipping
而不是/shipping
,因为它就像你在调用navigateLog("shipping")
,前面没有/
,它被用作一个相对路径,这意味着它会考虑你的当前路径,在你的例子中,它碰巧是/login
。zsohkypk2#
问题
重定向目标路径是
"shipping"
而不是"/shipping"
。在react-router-dom@6
中,有相对路径和绝对路径。区别很简单,绝对路径以前导"/"
字符开头,而相对路径则不是。navigate("shipping")
会将"shipping"
附加到当前pathname
的末尾并导航到那里。溶液
导航时,请预先添加前导
"/"
:或在最初导航时包含它:
您可能还希望使用
useSearchParams
钩子来访问redirect
查询参数,而不是依赖于它位于特定的字符串位置。注意,在发出命令式重定向(我已经包含了一个选项对象)到指定
replace: true
的navigate
函数时,这是为了发出REPLACE操作而不是PUSH操作。