【发布时间】:2021-02-18 13:06:07
【问题描述】:
考虑这是主要的 App 组件(为简洁起见省略了导入):
const App = () => {
const [orderRoutes, setOrderRoutes] = useState([])
const updateOrderRoutes = (newRoute) => {
orderRoutes.push(newRoute)
setOrderRoutes(orderRoutes)
}
const renderedOrderRoutes = orderRoutes.map(route => {
return (
<Route
path={`/${route.class}/${route.order}`}
exact
key={`/${route.class}/${route.order}`}
>
<CatalogPage />
</Route>
)
})
return (
<BrowserRouter>
<Header
updateOrderRoutes={updateOrderRoutes}
/>
<Route path="/" exact component={Home} />
<Route path="/aboutus" exact component={AboutUs} />
<Route path="/faq" exact component={Faq} />
<Route path="/register" exact component={Register} />
{renderedOrderRoutes}
<Footer />
</BrowserRouter>
)
}
export default App
挑战在于,在渲染初始 App 组件时,某些路由是未知的。当<Header> 组件中的 AJAX 请求得到响应时,它们将被知道。然后,标头会将新路由更新到 orderRoutes 状态属性,每次都重新渲染 App 组件。作为 AJAX 调用结果的路由(在 <Header> 中生成)然后被渲染到 <BrowserRouter>(在 {renderedOrderRoutes} 中)。在<Header> 中,由于相同的 AJAX 调用而呈现的每个路由都有一个<Link>,因此每个菜单条目(<Link>s)都会有一个对应的路由。
这很好用,但是当我访问此机制直接生成的 URL 之一(例如:刷新页面)时,<CatalogPage> 组件不会呈现。
因此,例如,假设 AJAX 调用产生了一堆路由,其中一个是 /t-shirts/tanktops。我将获得一个菜单条目,其中包含指向该路径的链接。当我单击该菜单项时,将呈现 <CatalogPage> 组件。但是当我直接访问/t-shirts/tanktops 时,<CatalogPage> 组件并没有呈现出来。
如何更改此代码以使作为 AJAX 调用结果的 URL 可直接访问?
编辑
好的,我通过在<Link>s 之一通过在App 组件上创建未使用的状态来单击时强制<App> 组件重新渲染来“解决”这个问题(不喜欢它)叫activeOrderRoute。我将 setter 作为 prop 传递给 Header,并将它作为回调连接到为响应 AJAX 请求而创建的每个 Link 的 onClick 处理程序。这实质上迫使App 重新渲染和渲染路线,这解决了我的问题。
不过,这似乎不是正确的方法,因此我们将不胜感激。
【问题讨论】:
-
我已经回答了如何处理渲染可访问路由的问题,但似乎您在
App和Header组件之间也有一个奇怪的解决方法,可以踢其中一个或两个重新渲染显示“新”路线的链接。您能否更新您的问题以包含路由获取逻辑以及App和Header的相关部分? -
这个问题可能与stackoverflow.com/q/27928372/470749重复