在 React 中,为什么子组件的渲染函数会被调用两次?

IT技术 javascript reactjs components render
2021-05-24 06:22:11

我有最简单的应用程序。有一个父<App>组件和一个子<MyChildOne>组件。两者都是基于类的。

谁能解释一下为什么 React<MyChildOne> 两次调用 child 的渲染函数

这是我的<App>代码:

import React from "react";
import "./App.css";
import MyChildOne from "./MyChildOne.js";

class App extends React.Component {
  render() {
    return (
      <div>
        <MyChildOne />
      </div>
    );
  }
}
export default App;

这是我的<MyChildOne>代码:

import React from "react";

class MyChildOne extends React.Component {
  counter = 0;

  render() {
    this.counter = this.counter + 1;

    console.log(
      "Code has called MyChildOne and this.counter has value: " + this.counter
    );

    return <h1>Hello, {this.counter}</h1>;
  }
}

export default MyChildOne;

浏览器中的输出是这样的:

你好,1

这是在控制台中记录的内容:

代码调用了 MyChildOne 并且 this.counter 的值为:1

代码调用了 MyChildOne 并且 this.counter 的值为:2

很明显 React 调用了<MyChildOne>两次渲染函数——但我不明白为什么!!!!

这是没有好到我,因为我想通过props的东西数组从<App><MyChildOne> ,我想<MyChildOne>呈现,让我们说,一个<h1>该阵列的每一个“东西”成员。我不希望<h1>s 被渲染两次!

2个回答

您不必太担心渲染函数被多次调用。如果您正在创建依赖于多次调用渲染函数的逻辑,那么您很可能做错了什么。我最好的是你正在做一些其他的逻辑,导致渲染函数被多次调用。

您应该注意,如果您的父组件重新渲染,您的子组件也会重新渲染。我为您提供的代码创建了一个最小示例,这清楚地表明您的问题出在其他地方。 https://codesandbox.io/s/react-example-6ud9d

我不知道为什么,但这仅发生在严格模式下使用您展示的相同代码创建了一个示例项目尝试删除index.js 文件中React.StrictMode标记。您将看到 MyChildOne 组件仅呈现一次。

此外,如果您要在类中设置一个属性并在render方法中使用它,则应该使用state像这样,

 state = {
     counter: 0
  }

. 像这样改变状态

this.setState({counter: this.state.counter + 1});

它会正确地重新渲染你的组件。但是永远不要改变render方法内部的状态它会破坏你的代码。

如果您不想使用状态和生命周期方法,请不要使用类组件。改用功能组件。