reactjs 在React中,为什么一个子组件的render函数会被调用两次?

ff29svar  于 2023-06-29  发布在  React
关注(0)|答案(3)|浏览(341)

我有最简单的APP。有一个父<App>组件和一个子<MyChildOne>组件。两者都是基于类的。
有没有人能解释一下为什么React调用了child <MyChildOne>的render函数两次?
下面是我的<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,此.counter具有值:1*
  • 代码已调用MyChildOne,此.counter具有值:3 *
    很明显,React调用了<MyChildOne>的render函数两次--但我不明白为什么!!!!

这对我没有好处,因为我想传递一个从<App><MyChildOne>的东西数组作为props,我想让<MyChildOne>为数组的每个'thing'成员呈现一个<h1>。我不希望<h1> s被渲染两次!

t1rydlwq

t1rydlwq1#

你不应该太担心渲染函数被多次调用。如果您创建的逻辑依赖于多次调用的render函数,那么您很可能做错了什么。我的最佳建议是,您正在执行一些其他逻辑,这些逻辑会导致渲染函数被多次调用。
您应该注意,如果父组件重新呈现,则子组件也会重新呈现。我创建了您提供的代码的一个最小示例,它清楚地表明您的问题在其他地方。https://codesandbox.io/s/react-example-6ud9d

xmakbtuz

xmakbtuz2#

我不知道为什么,但这只发生在严格模式。我用你展示的相同代码创建了一个example project。尝试删除index.js文件中的React.StrictMode标签。您将看到MyChildOne组件只渲染一次。
另外,如果你要在类中设置一个属性,并在render方法中使用它,你应该使用state。像这样

state = {
     counter: 0
  }

.并像这样更改状态

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

它会正确地重新渲染你的组件。但never改变render方法内部的状态;它会破解你的密码
如果你不想使用状态和生命周期方法,就不要使用类组件。使用功能组件代替。

dsf9zpds

dsf9zpds3#

1.您的函数只调用子渲染函数一次。
1.这不是在类组件中创建状态的方法,您可以使用。

constructor(props) {
    super(props);
    this.state = {
        count: 0,
    };
}

1.状态的更新应该使用

this.setState:
{()=>{this.setState({ count:this.state.count+1 })}}

1.组件呈现两次可能是因为您可能触发的事件,就像我使用鼠标悬停事件一样。

相关问题