当前位置: 首页 > 面试题库 >

反应:父组件重新渲染所有子组件,即使状态更改未改变的子组件也是如此

柴晔
2023-03-14
问题内容

我还没有找到明确的答案,希望这不是重复的。

我正在使用React +
Redux作为一个简单的聊天应用程序。该应用程序由InputBar,MessageList和Container组件组成。容器(如您想象的那样)包装了其他两个组件,并连接到商店。我的消息状态以及当前消息(用户当前正在键入的消息)都保存在Redux存储中。简化结构:

class ContainerComponent extends Component {
  ...
  render() {
    return (
      <div id="message-container">
        <MessageList 
          messages={this.props.messages}
        />
        <InputBar 
          currentMessage={this.props.currentMessage}
          updateMessage={this.props.updateMessage}
          onSubmit={this.props.addMessage}
        />
      </div>
    );
  }
}

更新当前消息时出现我遇到的问题。更新当前消息会触发一个更新商店的操作,该操作将更新通过容器并返回到InputBar组件的道具。

这可行,但是副作用是每次发生这种情况时,我的MessageList组件都会重新呈现。MessageList没有收到当前消息,也没有任何更新的理由。这是一个大问题,因为一旦MessageList变大,每次更新当前消息时,应用程序的速度就会明显变慢。

我尝试直接在InputBar组件中设置和更新当前消息状态(因此完全忽略了Redux架构),并且“解决了”问题,但是,如果可能的话,我想坚持使用Redux设计模式。

我的问题是:

  • 如果父组件被更新,React会始终更新该组件中的所有直接子组件吗?

  • 这里正确的方法是什么?


问题答案:

如果父组件被更新,React会始终更新该组件中的所有直接子组件吗?

号作出反应只会重新渲染,如果一个组件shouldComponentUpdate()的回报true。默认情况下,该方法总是返回true以避免为新手带来任何细微的错误(并且正如William
B所指出的那样,除非有所更改,否则DOM不会真正更新,从而降低了影响)。

为了防止子组件不必要地重新呈现,您需要以shouldComponentUpdatetrue数据实际更改后才返回的方式实现该方法。如果this.props.messages总是相同的数组,则可以像这样简单:

shouldComponentUpdate(nextProps) {
    return (this.props.messages !== nextProps.messages);
}

您可能还需要进行某种深度比较或消息ID之类的比较,这取决于您的要求。



 类似资料:
  • 我是reactjs的新手,我不知道如何从父组件中更改子组件的状态。下面是代码 每当对父组件中的执行时,我希望子组件接收。 有什么建议吗?

  • 我正在学习如何应对,我整天都在试图找到解决问题的办法,但都没有成功。然后决定在这里提出我的第一个问题。 我有子组件,包括React-Datepicker组件和单独的“第二天”和“前一天”按钮来更改选定的日期。 SelectedDate存储在父组件的状态中。 我试图从子组件更新父组件的状态,当状态更新时,子组件应该重新呈现,因为该状态作为道具传递给同一个子组件。 我已设法从child更改父状态,但子

  • 这个问题在这里已经得到了回答,但事情总是在变化。 基本上,父组件获取一些数据,子组件需要这些数据。 这是子组件。

  • 我有两个组件:父组件,我想改变子组件的状态: 和子组件: 我需要从父组件更改子组件的打开状态,或者当单击父组件中的按钮时,从父组件调用子组件的toggleMenu()?

  • 问题内容: 我正在尝试制作一个不错的ApiWrapper组件,以填充各种子组件中的数据。从我阅读的所有内容来看,这应该可以正常工作:https : //jsfiddle.net/vinniejames/m1mesp6z/1/ 但是由于某种原因,当父状态更改时,子组件似乎没有更新。 我在这里想念什么吗? 问题答案: 您的代码有两个问题。 您的子组件的初始状态是通过props设置的。 引用此SO答案:

  • 我对react还比较陌生,我一直在分解一个web应用程序,并用react组件替换部分。我现在正在开发一个组件,其中包含我创建的几个不同组件。 在新组件中,我在componentDidMount函数中进行API调用,并创建子组件。乍一看,一切看起来都很完美,但当我们在其中一个子组件中进行状态更改,然后在父组件中进行更改时,子组件将其状态重置为更改之前的状态。 我知道发生了什么,州政府没有被传递给家长