好吧,事实证明,如果您实现一个自定义路由器,该路由器以与 RRDv6 路由器相同的方式实例化历史状态,则您可以复制该行为。
例如,检查BrowserRouter实现:
export function BrowserRouter({
basename,
children,
window
}: BrowserRouterProps) {
let historyRef = React.useRef<BrowserHistory>();
if (historyRef.current == null) {
historyRef.current = createBrowserHistory({ window });
}
let history = historyRef.current;
let [state, setState] = React.useState({
action: history.action,
location: history.location
});
React.useLayoutEffect(() => history.listen(setState), [history]);
return (
<Router
basename={basename}
children={children}
location={state.location}
navigationType={state.action}
navigator={history}
/>
);
}
创建一个CustomRouter
使用自定义history
对象并管理状态的对象:
const CustomRouter = ({ history, ...props }) => {
const [state, setState] = useState({
action: history.action,
location: history.location
});
useLayoutEffect(() => history.listen(setState), [history]);
return (
<Router
{...props}
location={state.location}
navigationType={state.action}
navigator={history}
/>
);
};
这有效地将自定义history
对象代理到Router
并管理导航状态。
从这里,你在换CustomRouter
用定制的history
对象为现有的Router
进口react-router-dom
。
export default function App() {
return (
<CustomRouter history={history}>
<div className="App">
<Routes>
<Route path="/" element={<Home />} />
<Route path="/profile" element={<Profile />} />
</Routes>
</div>
</CustomRouter>
);
}
分叉你的代码和盒子: