6

我正在使用 React 和 Reflux 构建一个应用程序,并且我正在尝试以特定顺序呈现项目列表。

这些项目是按时间倒序呈现的自定义 Post 组件,因此最新的帖子位于列表的顶部。

我正在使用可汗学院的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;
}

任何帮助都感激不尽!

4

2 回答 2

18

你不应该使用 index as key,它违背了目的。例如,如果您在数组的开头添加一个项目,react 将只检测一个新键 - 最后一个。所有其他组件将根据它们的密钥进行协调。您应该使用帖子的唯一 ID 作为键。

于 2015-05-03T22:36:54.340 回答
4

我有一个类似的问题,但似乎操作人员最初遇到了如何正确利用 key in react 的问题。话虽如此,这有助于将顺序从升序反转为降序。

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>
    );
}
});
于 2016-08-09T20:55:49.417 回答