当前位置: 首页 > 知识库问答 >
问题:

ReactJS呈现列表的时间每增加一个新元素就增加一次

云胤
2023-03-14

我正试图用react JS呈现一个项目列表。由于我的列表项相对复杂,我创建了一个简单的小提琴来陈述我的问题。

我如何修复新添加项目的渲染时间?或者只是react js的工作方式。

这里是我的主要反应组分简化。

React.createClass({
    shouldComponentUpdate: function (nextProps, nextState) {
        return nextState.posts.length !== this.state.posts.length;
    },
    getInitialState: function () {
        return {
            posts: []
        };
    },
    // getStream is bound to a scroll event handler. Simply, this function is called when user gets close to the end of page.
    getStream: function () {
        var self = this;
        ... ajax call success: (jsonResult) ...
        self.setState({
            posts: React.addons.update(self.state.posts, { $push: jsonResult })
        });
        ... end ....
    },
    render: function () {
        var self = this;

        var postNode = this.state.posts.map(function (post, i) {
            if (post.isActivity) {
                return (<ReactActivity key={i}></ReactActivity>);
            }
            else {
                return (<ReactStreamPost key={i}></ReactStreamPost>);
            }
        });

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

并且ReactStreamPost和ReactStreamActivity在这一点上可以是无状态组件。像

var ReactStreamPost = React.createClass({
    shouldComponentUpdate: function () {
        return false;
    },
    render: function () {
        return (
            <div className="stream-post">
                <div className="post-topbar">
                    <a href="#" className="display-name">Test USER</a>
                </div>

                <div className="post-inner-wrapper">
                    <div className="post-owner-big">
                        <div className="post-owner">
                            <img className="profile-img" />
                        </div>
                    </div>
                    <div className="post-content">
                        <div className="post-header">
                            <div className="post-owner">
                                <img className="profile-img" />
                            </div>
                            <div className="post-agt">
                                <ReactAutoGenerateTitle></ReactAutoGenerateTitle>
                            </div>
                        </div>
                        <div className="post-title">
                            <div>
                                <a href="#" className="display-name">Test USER</a><span> Post title</span>
                            </div>
                        </div>
                        <div className="attachments">
                            attachments
                        </div>

                        <div className="post-actions">
                            <div className="left-actions">
                                <a href="#">
                                    <i className="icon icon-add-info"></i><span>Add info</span>
                                </a>
                            </div>
                            <div className="right-actions">
                                <a href="#" className="toggler">
                                    <i className="icon"></i>
                                    <span>x</span>
                                </a>
                                <a href="#" className="toggler">
                                    <i className="icon"></i>
                                    <span>x</span>
                                </a>
                                <a href="#" className="share icon icon-share"></a>
                            </div>
                        </div>

                        <div className="post-comments">
                            <div className="comment-block">
                                <div className="commentor">
                                    <img />
                                </div>
                                <div className="comment">
                                    <a href="#">Test USER</a><span>: </span><span>Comment test</span>
                                </div>
                                <div className="comment-date">
                                    <span>comment date</span>
                                </div>
                            </div>

                            <div className="comment-form">
                                <div className="commentor">
                                    <img />
                                </div>
                                <div className="text-area">
                                    <textarea rows="1" className="small"></textarea>
                                </div>
                                <div className="submit-comment">
                                    <a href="#" className="icon icon-send"></a>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
                <div className="post-date">
                    <span>post date</span>
                </div>
            </div>
        );
    }
});

共有1个答案

缪兴腾
2023-03-14

这是因为每次添加更多元素时,都会重新呈现整个列表,其中还包括以前已经呈现的列表项。

修复的一种方法是将列表项放在它自己的组件中,并使用shouldComponentUpdate来不重新呈现它。这仍然会增加时间,因为它仍然需要检查是否需要重新渲染,但inxcrease不会那么陡峭。在这里工作的小提琴。行组件如下所示:-

  var Row = React.createClass({
  shouldComponentUpdate: function() {
    return false;
  },

  render: function() {
    return ( < li > < span > some < /span><span>more</span > < span > elements < /span></li > )
  }
})
 类似资料:
  • 预备知识: 对 C++ 有一定了解. 已经下载 TensorFlow 源代码并有能力编译它. 如果现有的库没有涵盖你想要的操作, 你可以自己定制一个. 为了使定制的 Op 能够兼容原有的库 , 你必须做以下工作: 在一个 C++ 文件中注册新 Op. Op 的注册与实现是相互独立的. 在其注册时描述了 Op 该如何执行. 例如, 注册 Op 时定义了 Op 的名字, 并指定了它的输入和输出. 使用

  • 我正在尝试编写一个函数,它递归地复制给定的线性链表L,并以常量值x递增。当我在终端编译时,我得到了,这是一个内存位置,而不是实际的列表。我只想更改函数本身以提供正确的输出。

  • 本文向大家介绍一个统计表每天的新增行数及新增存储空间的功能,包括了一个统计表每天的新增行数及新增存储空间的功能的使用技巧和注意事项,需要的朋友参考一下 使用文中提供的代码做一个统计表每天的新增行数及新增存储空间的功能 实现步骤如下: 1. 创建表 创建表,存储每天的表空间占用情况 2. 新建作业 新建作业,作业计划每天凌晨运行一次,每天记录表占用的空间情况,存储到上一步建立的表中 作业中执行的T-

  • 问题内容: 我有一个字典列表,并且想为该列表的每个元素添加一个键。我试过了: 但是update方法返回None,所以我的结果列表中没有None。 返回语法错误。 问题答案: 您无需担心要构建新的词典列表,因为对更新后的词典的引用与对旧词典的引用相同:

  • 问题内容: 我有零片: 我在其中添加一个元素: 为什么在一个nil slice上附加一个元素会使容量增加2? 使用来打印切片显示以下内容: 我也很困惑为什么重新切片会显示一个零,该零既不在原始切片中也不附加在原始切片上: 问题答案: Go可以免费为您提供超出您要求的容量。通过减少所需的分配(可以复制)数量来提高性能。容量只是在需要另一分配之前保留的空间量。 如果至少在我的实验中将5个元素添加到此片

  • 给定一个列表{x_i},我想要找到从每个元素开始的最长的递增子序列,使得起始元素包含在子序列中。 最明显的方法是对每个元素执行通常的最长递增子序列算法,给出O(n^2logn)。这能打吗?