如何在 React-Router 中用 History 替换 Link 组件行为
How to replace Link component behavior with History in React-Router
在我的应用程序中我有
<Switch>
<Route path="/" component={DashboardRoute} exact={true} />
<Route path="/patients/:id" component={PatientRoute} />
<Redirect to='/' />
</Switch>
然后在 PatientRoute 里面我有另一个带有动态路由的 Switch。
<Switch >
{panes.map(pane => {
return <Route path={`/patients/:id/${pane.to}`}>
{pane.render()}
</Route>
})}
</Switch>
我构建了一个名为 RouteTab 的类似选项卡的组件,它使用 Link 重定向到子患者路径。
<div className="TabButtons">
{panes.map((p, index) => <Link key={p.to} to={p.to} label={p.menuItem}/>)}
</div>
此时一切正常。但是,我的 RouteTab 组件具有响应行为,当移动时它使用 Select 来显示项目菜单。为了模拟 Link 行为,我正在使用 history.push,url 发生变化但页面没有重新渲染。
<Select
value={panes[activeTab].menuItem}
onChange={(e, data) => {
const value = data.value;
const newTabIndex = panes.findIndex(p => p.menuItem === value)
const newTab = panes[newTabIndex]
history.replace(newTab.to) //<--- Here
}}
options={panes.map(p => ({
key: p.menuItem,
value: p.menuItem,
text: p.menuItem,
}))}></Select>
您不需要在 routeTab 中添加另一个 <Router>
。这样做似乎会创建两个不同的路由器实例,这就是 history.push 不起作用的原因。
这是我从沙箱中分叉出来的一个工作示例:https://codesandbox.io/s/patient-care-router-2m3oh
我禁用了响应能力以测试同一视图中的下拉菜单。
我从此处文档中的这个示例中得到了灵感:https://reacttraining.com/react-router/web/example/modal-gallery
在我的应用程序中我有
<Switch>
<Route path="/" component={DashboardRoute} exact={true} />
<Route path="/patients/:id" component={PatientRoute} />
<Redirect to='/' />
</Switch>
然后在 PatientRoute 里面我有另一个带有动态路由的 Switch。
<Switch >
{panes.map(pane => {
return <Route path={`/patients/:id/${pane.to}`}>
{pane.render()}
</Route>
})}
</Switch>
我构建了一个名为 RouteTab 的类似选项卡的组件,它使用 Link 重定向到子患者路径。
<div className="TabButtons">
{panes.map((p, index) => <Link key={p.to} to={p.to} label={p.menuItem}/>)}
</div>
此时一切正常。但是,我的 RouteTab 组件具有响应行为,当移动时它使用 Select 来显示项目菜单。为了模拟 Link 行为,我正在使用 history.push,url 发生变化但页面没有重新渲染。
<Select
value={panes[activeTab].menuItem}
onChange={(e, data) => {
const value = data.value;
const newTabIndex = panes.findIndex(p => p.menuItem === value)
const newTab = panes[newTabIndex]
history.replace(newTab.to) //<--- Here
}}
options={panes.map(p => ({
key: p.menuItem,
value: p.menuItem,
text: p.menuItem,
}))}></Select>
您不需要在 routeTab 中添加另一个 <Router>
。这样做似乎会创建两个不同的路由器实例,这就是 history.push 不起作用的原因。
这是我从沙箱中分叉出来的一个工作示例:https://codesandbox.io/s/patient-care-router-2m3oh
我禁用了响应能力以测试同一视图中的下拉菜单。
我从此处文档中的这个示例中得到了灵感:https://reacttraining.com/react-router/web/example/modal-gallery