2016-02-10 2 views
2

Как и в демонстрации React, и в других примерах, я вижу людей, которые перезагружают данные состояния, если одна запись добавлена ​​или удалена. Это приводит к повторному отображению всего списка, а не просто добавлению последней записи или удалению выбранного из текущего дерева DOM.Как избежать повторного рендеринга всего списка вместо добавления нового элемента в список DOM в реакции JS?

Как это полезно? Или как я могу избежать этого случая.

enter image description here

UPDATE Ситуация: Facebook корм, вы продолжаете прокрутку корма, достигают около 5000 подающих статусов и многих других типов карт. Не только это, каждый фид состояния имеет свой собственный «список комментариев».

Каждую секунду 5-10 статусных карточек предварительно прикреплены к стене или добавляются в случае ленивой загрузки. то есть. каждую секунду вы повторно обрабатываете n + n * 0.5, где n может идти выше 5000 карт.

Кроме того, рассмотрите стоимость «перекраски», рендеринга петель.

+0

Разве «виртуальный DOM» не должен ловить это (так что реальный DOM не делает * не * получает повторную визуализацию, за исключением изменений)? – Thilo

+0

@Thilo Да, но даже с VDOM, почему бы вам обновить все дерево, если вы можете просто узлом? Он стоит для «перекрашивания» –

ответ

7

Если вы дадите каждому элементу в списке уникальный (и детерминированный) key=uniqueValue prop, тогда React сохранит элементы списка, в которых ключ не изменился, что позволит избежать повторной обработки всего списка.

render() { 
    var comments = comments.map(function(comment){ 
    return (
     <Comment 
     key={comment.id} // This should be a unique, deterministic value 
     ... 
     /> 
    ); 
    }); 

    return(
    <div> 
     {comments} 
    </div> 
); 
} 

Подробнее в React Dynamic Children-х DOC раздел.

+0

Предоставляется ключ. Но подумайте, что это фейсбук, как лента новостей. Вы держите ленивую загрузку, корма увеличивается только до конца эры. Если для каждого нового элемента фида вы повторно отрисовываете ЦВЕТОВОЕ ПОДАЧЕ, то насколько экспансивным является рендеринг DOM + покраска. –

+0

Весь смысл подсказки 'key' заключается в том, что это означает, что вы не перерисовываете весь фид, а только новый элемент (плюс удаление любых элементов, которые больше не существуют). Уверен, что вы должны делать for-loop каждый раз, когда отображается ваш комментарий CommentList, но это не так. –

+0

точно мой пункт. Если это плотный список из 5000 строк (например, fb), и каждую секунду я должен получать по меньшей мере 10 новых записей. Если рендеринг (который не что иное - создание нового VDOM> рендеринга 5000 + увеличивается каждый раз) –

Смежные вопросы