如何访问 BrowserRouter 之外的 BrowserRouter 历史记录?
How to access BrowserRouter history outside of BrowserRouter?
下面是我的简化代码片段。 (使用 react-router-v5)
我的问题是如何在 logout_Handler() 中访问 BrowserRouter 的历史记录,因为我在 BrowserRouter“外部”?
我看过这个回答
,但也有适用于我的情况的评论:
“当我尝试使用此处所示的“withRouter”时,出现错误
You should not use <Route> or withRouter() outside a <Router>
如果我尝试在 App.js 级别使用 withRouter,这正是我得到的结果。
// App.js
function App(props) {
const logout_Handler = (e) => {
localStorage.removeItem("app-tokenObj");
// how to get the history from BrowserRouter to redirect?!
//history.push("/login") ?? NO IDEA ??
}
return (
<BrowserRouter>
<nav>
<h3>My Supa Dupa App</h3>
<Link to="/">Home Page</Link>
<Link to="/admin">Admin Page</Link>
<button type="button" onClick={logout_Handler}>Logout</button>
</nav>
<hr/>
<Switch>
<Route exact path="/" component={Home} />
<Route path="/link1" component={Comp1} />
<Route path="/link2" component={Comp1} />
<Route path="/login" component={Login} />
<Route path="/signup" component={Signup} />
</Switch>
</BrowserRouter>
)
}
如果您尝试访问 App
组件中的部分路由上下文,那么提供上下文的路由器需要在 ReactTree 中更高。解决方法很简单。在您的应用代码中将 BrowserRouter
移至高于 App
的位置。将 App
包装在 BrowserRouter
中就足够了。
示例index.js
ReactDOM.render(
...
<BrowserRouter>
<App />
</BrowserRouter>
...,
root,
);
应用程序
App
组件现在有可用的路由上下文。虽然您 可以 使用 withRouter
高阶组件,但使用 useHistory
挂钩会更简单。
import { Link, Route, useHistory } from 'react-router-dom';
function App(props) {
const history = useHistory();
const logout_Handler = (e) => {
localStorage.removeItem("app-tokenObj");
history.push("/login");
}
return (
<>
<nav>
<h3>My Supa Dupa App</h3>
<Link to="/">Home Page</Link>
<Link to="/admin">Admin Page</Link>
<button type="button" onClick={logout_Handler}>Logout</button>
</nav>
<hr/>
<Switch>
<Route path="/link1" component={Comp1} />
<Route path="/link2" component={Comp1} />
<Route path="/login" component={Login} />
<Route path="/signup" component={Signup} />
<Route path="/" component={Home} />
</Switch>
</>
);
}
下面是我的简化代码片段。 (使用 react-router-v5) 我的问题是如何在 logout_Handler() 中访问 BrowserRouter 的历史记录,因为我在 BrowserRouter“外部”?
我看过这个回答
You should not use <Route> or withRouter() outside a <Router>
如果我尝试在 App.js 级别使用 withRouter,这正是我得到的结果。
// App.js
function App(props) {
const logout_Handler = (e) => {
localStorage.removeItem("app-tokenObj");
// how to get the history from BrowserRouter to redirect?!
//history.push("/login") ?? NO IDEA ??
}
return (
<BrowserRouter>
<nav>
<h3>My Supa Dupa App</h3>
<Link to="/">Home Page</Link>
<Link to="/admin">Admin Page</Link>
<button type="button" onClick={logout_Handler}>Logout</button>
</nav>
<hr/>
<Switch>
<Route exact path="/" component={Home} />
<Route path="/link1" component={Comp1} />
<Route path="/link2" component={Comp1} />
<Route path="/login" component={Login} />
<Route path="/signup" component={Signup} />
</Switch>
</BrowserRouter>
)
}
如果您尝试访问 App
组件中的部分路由上下文,那么提供上下文的路由器需要在 ReactTree 中更高。解决方法很简单。在您的应用代码中将 BrowserRouter
移至高于 App
的位置。将 App
包装在 BrowserRouter
中就足够了。
示例index.js
ReactDOM.render(
...
<BrowserRouter>
<App />
</BrowserRouter>
...,
root,
);
应用程序
App
组件现在有可用的路由上下文。虽然您 可以 使用 withRouter
高阶组件,但使用 useHistory
挂钩会更简单。
import { Link, Route, useHistory } from 'react-router-dom';
function App(props) {
const history = useHistory();
const logout_Handler = (e) => {
localStorage.removeItem("app-tokenObj");
history.push("/login");
}
return (
<>
<nav>
<h3>My Supa Dupa App</h3>
<Link to="/">Home Page</Link>
<Link to="/admin">Admin Page</Link>
<button type="button" onClick={logout_Handler}>Logout</button>
</nav>
<hr/>
<Switch>
<Route path="/link1" component={Comp1} />
<Route path="/link2" component={Comp1} />
<Route path="/login" component={Login} />
<Route path="/signup" component={Signup} />
<Route path="/" component={Home} />
</Switch>
</>
);
}