【发布时间】:2022-01-20 23:29:46
【问题描述】:
我需要在登录后导航回原来请求的 URL。
例如用户输入www.eCart.com/Cart,因为用户没有通过身份验证,它会导航到登录页面www.eCart.com/login。
一旦通过身份验证,它应该会自动导航回www.eCart.com/Cart
我的 protectedRoute.js 看起来像这样
import React from 'react'
import { connect } from 'react-redux'
import { Navigate, Outlet, useLocation, useNavigate} from 'react-router-dom'
export const withRouter = (Component) => { //works only for react16-17 //hooks
const Wrapper = (props) => {
const location = useLocation()
const navigate = useNavigate();
return (
<Component
navigate = {navigate}
{...props}
location={location}
{...props}
/>
);
};
return Wrapper;
};
const ProtectedRoute = ({component:Component, auth,...rest}) => (
auth.isAuthenticated ? <Outlet /> : <Navigate to={`/login/${rest.location.search}`} replace />
)
const mapStateToProps = (state) => ({
auth: state.auth
})
export default connect(mapStateToProps)(withRouter(ProtectedRoute))
我的 app.js 是这样的
function App(props) {
useEffect(() => {
store.dispatch(setCurrentUser())
}, [])
const grabProductsFromStorage = () =>{
const userId = decodeUser().user.id
const cartProducts = JSON.parse(localStorage.getItem("products"))
const context = {products: cartProducts, userId}
store.dispatch(addToCart(context))
localStorage.removeItem("products")
}
if(localStorage.getItem("token") && localStorage.getItem("products")){
grabProductsFromStorage()
}
return (
<Provider store={store}>
<Router>
<Routes>
<Route exact path="/" element={<Landing/>} />
<Route exact path="/products/:id" element={<ProductDetails/>} />
<Route exact path="/" element={<ProtectedRoute/>}>
<Route exact
path="/dashboard/*"
element={<Dashboard {...props} nestedRoute={Home} />}
/>
<Route exact path="/cart" element={<Cart />} />
</Route>
<Route exact path="/register" element={<Register/>} />
<Route exact path="/login" element={<Login/>} />
</Routes>
</Router>
</Provider>
);
}
另外,我在某个地方看到了在导航中使用状态的位置,但是当我这样做时,它会抛出 Unexpected use of 'location' 的错误
【问题讨论】:
-
它的简单导航到不同的页面我想在认证后返回上一页或路由
-
如果你需要去上一页试试这个,让navigation = useNavigate();函数前一个(){导航(-1)}前一个()
标签: javascript reactjs