【发布时间】:2022-01-05 00:58:20
【问题描述】:
我有私人路线
app-routes.js 文件
const routes = [
{ path: '/', component: HomePage },
{ path: '/articles/:id', component: Article },
{ path: '/expert', component: Experts },
...
{ path: '/requests', component: ComRequest },
{ path: '/admin', component: AdminHomePage },]
export default routes.map(route => {
return {
...route,
component: route.component
}
})
content.js 文件将 app-routes 迭代为数组 如果不匹配任何路由重定向到 /
import routes from 'app-routes'
return(
<Switch>
{routes.map(({ path, component }) => (
<PrivateRoute
exact
key={path}
path={path}
component={component}
/>
))}
<Redirect to={'/'} />
</Switch>)
PrivateRoute.js 组件文件检查用户是否重定向到 /login
function PrivateRoute({ component, ...rest }) {
return (
<Switch>
<Route
{...rest}
render={(matchProps) => getUser()
?
<WithLayout
{...matchProps}
component={component}
layout={MainLayout}
/>
:
<Redirect to={{ pathname: '/login', state: { from: matchProps.location } }} />}
/>
</Switch>
)
}
export default PrivateRoute
getUser() 函数返回对象字符串 {userdata}
getUser.js
export function getUser() {
return localStorage.getItem('user')
}
在浏览器中,一些 /articles、/expert 路由呈现视图,但随机或逻辑无法弄清楚其他一些 /requests 的路由如何, /admin 路由不匹配并重定向到 /
有时每条路线都会重定向到 /
如果我评论 <Redirect to={'/'}/> 某些路由会呈现白屏
还有一件更烦人的事情是 刷新时总是重定向作品转到 / 网址不停留在匹配的路线上
在app.js 中检查用户,如果找到则返回Content,如果没有,则用户返回NotAuthenticatedContent 路由
const { user } = useAuth()
if (user && user.id) {
return <Content />
} else
return <NotAuthenticatedContent />
};
user 从 AuthContext 导入
function AuthProvider(props) {
const [user, setUser] = useState()
const { user: currentUser } = useSelector((state) => state.account)
useEffect(() => {
(async function () {
if (currentUser && currentUser.jwt)
setUser(currentUser.user)
})();
}, []);
return (<AuthContext.Provider value={{user}} {...props}/>)
}
const AuthContext = createContext({})
const useAuth = () => useContext(AuthContext)
export {AuthProvider,useAuth}
我注意到history.push('/requests') 可以转到 /requests 页面
但是当我输入 url 部分时重定向到 /
【问题讨论】:
-
什么是“顶级路线”和“底部路线”?您能否澄清并提供示例说明哪些有效,哪些无效?
getUser是什么?请包含所有相关代码。 -
似乎我们仍然需要很多上下文,或者一个可重现的例子。我将您的代码复制/粘贴到codesandbox 中,但我无法重现您描述的问题。另外,当没有任何过时的答案或根本没有任何答案时,您为什么将此赏金标记为想要一个最新的答案?您能否更新您的问题以包含更完整和全面的代码示例?您能否尝试创建一个 running 代码框来重现我们可以实时检查和调试的问题?
-
您对
key=的使用很奇怪。首先只导出没有映射的路由数组export default routes,然后告诉我们结果。 -
你使用的是什么版本的 React?最新的 v6 有一些向后不兼容的变化。
-
确保您使用
BrowserRouter作为 switch 的父级并且仅在一个位置。以及在switch中使用switch的原因是什么,请将Switch从PrivateRoute中删除,然后重试。附言问题的另一个原因可能是react-router-dom的版本,因为更高版本的包的使用已经改变。
标签: reactjs react-router react-router-dom