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">
<TimeoutTransitionGroup
enterTimeout={500}
leaveTimeout={500}
transitionName="postTransition">
{posts}
</TimeoutTransitionGroup>
</div>
);
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!
Call the slice() method on the array to create a shallow copy. Call the reverse() method on the copy. Store the result in a variable.
The Child React elements are first created and then passed to the creation function of Parent.
JavaScript Array reverse()The reverse() method reverses the order of the elements in an array. The reverse() method overwrites the original array.
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.
I had a similar issue but it seemed the op had an initial issue of how to properly utilize key in react. With that said this worked for reversing the ordering from ascending to descending.
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>
);
}
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With