我试图在App.js中为经过身份验证的用户添加受保护的路由,但react元素被渲染了多次。下面是我的App.js代码
class App extends Component {
constructor(props) {
super(props);
this.state = {
currentUser: null,
isAuthenticated: false,
isLoading: false
}
}
async loadCurrentUser() {
this.setState({
isLoading: true
});
await getCurrentUser()
.then(response => {
this.setState({
currentUser: response,
isAuthenticated: true,
isLoading: false
});
}).catch(error => {
this.setState({
isLoading: false
});
});
}
async componentDidMount() { await this.loadCurrentUser(); } render() {
return (
<BrowserRouter>
<React.Suspense fallback={loading}>
<Switch>
<Route exact path="/login" component={Login} />
<Route exact path="/register" component={Register} />
<ProtectedRoute path="/" name="Home" authenticated={this.state.isAuthenticated}
component={TheLayout} handleLogout={this.handleLogout}></ProtectedRoute>
</Switch>
</React.Suspense>
</BrowserRouter>
);
}
}
2条答案
按热度按时间6g8kf2rb1#
在React中,当满足以下两个条件之一时,会发生组件重新渲染:当组件的props改变时(即,当父组件传递新props时),或者当状态被更新时。在您的示例中,当组件第一次挂载时,将调用loadCurrentUser,它首先设置state(isLoading = true),导致重新渲染,然后再次设置state,导致重新渲染,总共三次渲染,包括初始渲染。因此,如果您的日志显示相同数量的渲染,这是预期的行为,但如果它重新渲染超过3次,请检查您的父组件,看看它是否更改了传递给该组件的props(我怀疑这里的情况,因为App组件传统上是最顶层的组件,没有其他父组件。
hjzp0vay2#
只是让你知道,如果你在你的react应用程序中启用了严格模式,它总是会在第一次渲染时渲染两次。如果您使用create-react-app创建了应用,则默认情况下会启用严格模式,如下所示:
要禁用严格模式,可以注解掉
<React.StrictMode>
。您可以查看此页面了解更多信息