【发布时间】:2019-11-29 15:35:59
【问题描述】:
问题:当我使用history.push() 时,我可以看到浏览器更改了 url,但它并没有呈现我的组件在路径上侦听。只有在我刷新页面时才会呈现。
App.js文件:
import React from "react";
import { BrowserRouter as Router, Route } from "react-router-dom";
import { Provider } from "react-redux";
import PropTypes from "prop-types";
//Components
import LoginForm from "../LoginForm/LoginForm";
import PrivateRoute from "../PrivateRoute/PrivateRoute";
import ServerList from "../ServerList/ServerList";
const App = ({ store }) => {
const isLoggedIn = localStorage.getItem("userToken");
return (
<Router>
<Provider store={store}>
<div className="App">
{isLoggedIn !== true && (
<Route exact path="/login" component={LoginForm} />
)}
<PrivateRoute
isLoggedIn={!!isLoggedIn}
path="/"
component={ServerList}
/>
</div>
</Provider>
</Router>
);
};
App.propTypes = {
store: PropTypes.object.isRequired
};
export default App;
在我的 LoginForm 中,我正在向 API 发出请求,在完成我的程序后,我使用 .then() 重定向我的用户:
.then(() => {
props.history.push("/");
})
会发生什么:浏览器将 url 从 /login 更改为 /,但不会呈现侦听 / 路由的组件,除非我重新加载页面。
在我的/ 组件中,我使用useEffect() 钩子向API 发出另一个请求,它获取数据并将其打印到return() 中。如果我在console.log 内useEffect() 它发生两次,我假设是第一次,当我使用useState() 钩子将来自API 的数据存储在组件的状态内时。
编辑:按要求添加PrivateRoute 组件:
import React from "react";
import { Route, Redirect } from "react-router-dom";
const PrivateRoute = ({ component: Component, isLoggedIn, ...rest }) => {
return (
<Route
{...rest}
render={props =>
isLoggedIn === true ? (
<Component {...props} />
) : (
<Redirect to={{ pathname: "/login" }} />
)
}
/>
);
};
export default PrivateRoute;
我已经尝试过的:
1)用withRouter()包裹我的default export:
export default withRouter(connect(mapStateToProps, mapDispatchToProps)(LoginForm));
2) 创建自定义history 并将其作为prop 传递给Router。
react-router-dom 版本是^5.0.1。 react-router同理,5.0.1
【问题讨论】:
-
看起来你的
PrivateRoute总是挂载的。你需要显示privateroute组件 -
@Panther,将原帖更新为
PrivateRoute。 -
这看起来也像它的渲染.. 你能检查一下 React 调试器面板,看看什么没有渲染.. 问题会在那里
标签: reactjs react-redux react-router react-router-dom