reactjs 为什么我的React组件渲染多次

pdtvr36n  于 2023-06-29  发布在  React
关注(0)|答案(2)|浏览(295)

我试图在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>
    );

  }
}
6g8kf2rb

6g8kf2rb1#

在React中,当满足以下两个条件之一时,会发生组件重新渲染:当组件的props改变时(即,当父组件传递新props时),或者当状态被更新时。在您的示例中,当组件第一次挂载时,将调用loadCurrentUser,它首先设置state(isLoading = true),导致重新渲染,然后再次设置state,导致重新渲染,总共三次渲染,包括初始渲染。因此,如果您的日志显示相同数量的渲染,这是预期的行为,但如果它重新渲染超过3次,请检查您的父组件,看看它是否更改了传递给该组件的props(我怀疑这里的情况,因为App组件传统上是最顶层的组件,没有其他父组件。

hjzp0vay

hjzp0vay2#

只是让你知道,如果你在你的react应用程序中启用了严格模式,它总是会在第一次渲染时渲染两次。如果您使用create-react-app创建了应用,则默认情况下会启用严格模式,如下所示:

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
 <React.StrictMode>
 <App />
 </React.StrictMode>
);

要禁用严格模式,可以注解掉<React.StrictMode>
您可以查看此页面了解更多信息

相关问题