4

Я создаю приложение с React и Reflux, и я пытаюсь отобразить список элементов в определенном порядке.React: Оказание списка в обратном порядке

Элементы являются настраиваемыми компонентами Почты, которые отображаются в обратном хронологическом порядке, поэтому новая запись находится в верхней части списка.

Я использую Академию Хана TimeoutTransitionGroup, чтобы элементы списка затухали.

Проблема, которую я вижу, заключается в том, что когда я добавляю новое сообщение, и компонент получает обновленный список через новые реквизиты, переход происходит в элементе последнего в списке, а не в первом. Я хотел бы иметь его так, чтобы первый элемент затухал, так как это позиция нового элемента, который был добавлен.


Сообщение 2 < - Этот пост был недавно добавлен


Сообщение 1 < - Это сообщение исчезает в


Есть ли способ задать тот же порядок вещей, но сделать их в обратном порядке или что-то подобное?

Это делают функции моего компонента:

if (!(this.props.posts && this.props.ordering)) return false; 
    var posts = this.props.ordering.map(function(postId, index) { 
     return <Post key={index} post={this.props.posts[postId]}/>; 
    }, this); 
    return (
     <div className="post-collection"> 
      <TimeoutTransitionGroup 
       enterTimeout={500} 
       leaveTimeout={500} 
       transitionName="postTransition"> 
       {posts} 
      </TimeoutTransitionGroup> 
     </div> 
    ); 

Это CSS переход:

.postTransition-enter { 
    opacity: 0; 
    transition: opacity .25s ease-in; 
} 

.postTransition-enter.postTransition-enter-active { 
    opacity: 1; 
} 

.postTransition-leave { 
    opacity: 1; 
    transition: opacity .25s ease-in; 
} 

.postTransition-leave.postTransition-leave-active { 
    opacity: 0; 
} 

Любая помощь будет высоко ценится!

ответ

14

Вы не должны использовать индекс как key, он побеждает цель. Например, если вы добавите элемент в начало массива, реакция обнаружит только один новый ключ - последний. Все остальные компоненты будут согласованы в соответствии с их ключами. Вместо этого следует использовать уникальный идентификатор сообщения.

+1

Смена ключа работала отлично. Теперь это так очевидно, что вы указали на это. Благодаря! – hedgeday

+0

Это одна из самых сложных частей для начала работы с ReactCSSTransitionGroup, потому что React обычно только жалуется на атрибут 'key', когда его просто нет в элементах/компонентах, которые вы генерируете в цикле ... так как это не жалуются на случаи, когда предметы переизлучаются, но их «ключи» остаются неизменными, это намного сложнее выяснить, что происходит. Отличный ответ! –

+0

проклятье! это действительно решило мою проблему. Спасибо за отзыв о том, что вы не используете индекс в качестве компонента 'key' –

2

У меня была аналогичная проблема, но казалось, что у op был исходный вопрос о том, как правильно использовать ключ в реакции. С учетом сказанного это сработало для того, чтобы отменить порядок от восходящего к нисходящему.

var NotesList = React.createClass({ 
render: function() { 
    var notes = this.props.notepad.notes; 

    return (
     <div className="note-list"> 
      { 
       notes.reverse().map(function (note) { 
        return (
         <NoteSummary key={note.id} note={note}/> 
        ); 
       }) 
      } 
     </div> 
    ); 
} 
}); 
+7

это изменит исходный массив, который вы должны использовать [... notes] .reverse() –

+0

@fareednamrouti можете ли вы объяснить, что не так с изменением исходного массива? Каков полный синтаксис, и я его настрою. Благодарю. –

+0

Изменение исходных данных приведет к множеству проблем: 1- это предотвратит, чтобы компонент узнал, изменилось это свойство или нет, так что он не может повторно отображать себя снова. 2 каждый раз, когда ваш компонент визуализирует его, он снова изменит массив, Я предлагаю вам больше узнать о функциональном программировании и Redux –

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