hedgeday hedgeday - 1 year ago 114
React JSX Question

React: Rendering a list in reverse order

I'm building an app with React and Reflux, and I am trying to render a list of items in a specific order.

The items are custom Post components that are rendered in reverse chronological order, so the newest post is at the top of the list.

I am using Khan Academy's TimeoutTransitionGroup to have the list items fade in and out.

The problem I'm seeing is that when I add a new post and the component gets the updated list via new props, the transition happens on the last element in the list rather than the first. I would like to have it so that the first element fades in, since that's the position of the new item that was added.

Post 2 <- This post was newly added

Post 1 <- This post fades in

Is there a way to specify the same order of items, but render them in the reverse order, or something similar?

This is my component's render function:

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">

This is the CSS transition:

.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;

Any help will be much appreciated!

Answer Source

You shouldn't use index as key, it defeats the purpose. For example, if you add an item to the beginning of the array, react will detect only one new key - the last one. All other components would be reconciled according to their keys. You should use unique id of a post as a key instead.