【发布时间】:2017-04-10 17:46:07
【问题描述】:
我一直没能找到明确的答案,希望这不是重复。
我正在将 React + Redux 用于一个简单的聊天应用程序。该应用程序由 InputBar、MessageList 和 Container 组件组成。 Container(正如你想象的那样)包装了其他两个组件并连接到 store。我的消息状态以及当前消息(用户当前正在输入的消息)保存在 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>
);
}
}
我在更新当前消息时遇到的问题。更新当前消息会触发更新 store 的操作,该操作会更新通过容器并返回到 InputBar 组件的 props。
这可行,但副作用是每次发生这种情况时我的 MessageList 组件都会重新渲染。 MessageList 没有收到当前消息,也没有任何理由更新。这是一个大问题,因为一旦 MessageList 变大,每次当前消息更新时,应用程序都会明显变慢。
我尝试直接在 InputBar 组件中设置和更新当前消息状态(因此完全忽略了 Redux 架构)并且“修复”了问题,但是如果可能的话,我想坚持使用 Redux 设计模式。
我的问题是:
如果父组件被更新,React 是否总是更新该组件中的所有直接子组件?
这里的正确方法是什么?
【问题讨论】:
-
即使运行了 render(),它也应该很快——除非有实际的变化,否则它根本不会更新 DOM。所以重新渲染孩子对我来说是最安全的行为。但是我实际上不知道 react 是否应该这样做,所以这不是答案