Я создаю какое-то приложение для чата. У меня есть контейнер «Чат», который отображает компонент «Сообщение» для каждого элемента, полученного от проповеди Redux. Казалось бы, очень просто.
Это JSX, который отображает компонент сообщения:
<div className="messages" >
<ul >
{this.props.items.length > 0 && <i style={{ float: 'right' }} onClick={this.clearItems} data-toggle="tooltip" title="Clear history" className="fa fa-trash hover"></i>}
{this.props.items.map((message) => {
return <Message
showCheckBox={this.state.bulkOperationActive}
onBulkOperationOn={this.bulkOperationOn}
onDelete={this.deleteItems}
onItemCheck={this.onItemCheck}
checked={this.state.selectedItems.hasOwnProperty(message.itemId)}
key={message.itemId}
displayName={this.getDisplayName(message)}
time={this.getTime(message.moment)}
message={message}
/>
})}
</ul>
</div>
Как видите, я предоставляю уникальный ключ (message.itemId). Несмотря на это, каждый раз, когда элемент добавляется в массив (отправляя новое сообщение или получая сообщение), все компоненты сообщения перерисовываются (я вижу это, помещая console.log в рендер метод) .
Это становится очень медленным, после примерно скажем 100-150 пунктов. Я не React Pro, но, насколько я понимаю, вся идея уникального ключа состоит в том, чтобы предотвратить React от рендеринга элементов, которые не изменились.
Может ли кто-нибудь дать мне указание относительно того, что может быть не так? Я упомяну, что компонент Message на самом деле является оберткой для других простых функциональных компонентов.