这是我的App.tsx
文件的核心部分:
const App = () => {
return (
<div className={styles.app}>
<Store>
<Header />
<SessionMgr />
<Banner />
<Routing />
<Footer />
</Store>
</div>
);
};
<Routing />
包含我的应用程序中的所有路由。以下是它的节略版本:
const Routing = () => {
return (
<Routes>
<Route path='/' element={<Home />} />
<Route path='/about' element={<About />} />
<Route path='/signin' element={<SignIn />} />
<Route element={<ProtectedRoutes />}>
<Route path='/settings' element={<Settings />} />
</Route>
<Route path="*" element={<NotFound />} />
</Routes>
);
};
今天,在做了一些研究之后,我实现了ProtectedRoutes
:
const ProtectedRoutes = () => {
const sessionContainer = Session.useContainer();
const isAuthenticated = sessionContainer.isLoggedIn();
console.log(isAuthenticated, sessionContainer.state.user);
return (isAuthenticated ? <Outlet /> : <Navigate to='/signin' />);
};
我相信我已经正确地使用了<Outlet />
。但是,当用户登录,从而isAuthenticated = true
时,Outlet
会清除我的所有会话数据。换句话说,不是重定向到Settings
组件,而是清除会话数据并将用户重定向到SignIn
。如果我在浏览器中刷新应用程序,也会发生同样的情况。
在应用程序的其他地方,从一个页面导航到另一个页面,这样的会话数据清除不会发生。假设<Store>...</Store>
正在包装其他所有内容,那么使用Outlet
怎么可能清除全局存储的内容呢?
更重要的是,有人对如何修复它有什么想法吗?
@Drew Reese的评论让我以一种更开箱即用的方式思考,并最终解决了问题。正如德鲁指出的那样,Outlet
不是罪魁祸首。
以下是我如何测试这个新的ProtectedRoutes.tsx
包装器组件:
- 确保用户已注销。手动尝试转到
http://localhost:3000/settings
并确保不能;则发生到CCD_ 14的重定向。到目前为止很棒 - 登录。转到我用来测试这个的测试页面
- 我已经构建了一个自定义的
Button
组件。我使用以下代码进行测试:<Button type={ButtonType.Link} text="Go to Settings page" url='/settings' />
它最终呈现了以下代码:<a href={url} className={styles.link} onClick={onClick}>{text}</a>
- bug就在那里^^^。当我注意到在SPA中更改页面需要更长的延迟时,我意识到了这一点。这让我反思了这样一个事实:如果不包括
event?.preventDefault();
,许多事件处理程序都会导致同样的事情发生。加上它,一切都很好 - 所以我注释掉了Button代码,改为使用这个风格:
<Button type={ButtonType.Link} text="Go to Settings page" onClick={() => navigate('/settings')} />
。一切都很顺利
再次感谢您的帮助,@Drew Reese。它不仅解决了我发布的错误,而且我还意识到我的Button组件的a href={url}
版本不能正常工作!我将尝试修改它,但使用target='_blank'
属性,这应该允许它为外部链接工作。