使用 $.html() 时如何提高渲染性能

2024-04-15

我正在研究骨干demo app https://jsfiddle.net/o75r7fu9/8/显示推文列表。当我用不同的数据替换所有“推文”时,我使用以下命令清除列表$.html()

render: function() {
    $("#item-table").html('');
    this.collection.each(this.addItem);
}

我想知道是否有人可以给我一个提示,我可以用什么来代替这个$.html()为了更好的性能,因为通过使用$.html()我导致回流,这导致布局处理时间很差。

代码中还有另外两个地方我使用了$.html()如果有人能给我关于如何改变这些的建议,如果其他地方也可能的话,那就太好了。


Create https://developer.mozilla.org/en-US/docs/Web/API/Document/createDocumentFragment a new 文档片段 https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment预渲染所有项目,然后更新 DOM 一次。

还有,赞成this.$(...) http://backbonejs.org/#View-dollar全局 jQuery 选择器$(...).

this.$是一个代理this.$el.find(...)这样效率更高,并且不太容易选择视图之外的内容。

使用 jQuery 的核心功能($()如果视图尚未呈现,则视图内的 ) 可能会失败。所以最好总是通过this.$el因此您甚至可以在视图实际放入 DOM 之前进行更改。

将创建的所有子视图保留在一个数组中,以便稍后干净地删除它们。

initialize: function() {
    this.childViews = [];
},
render: function() {
    // cache the list jQuery object
    this.$list = this.$("#item-table");

    // Make sure to destroy every child view explicitely 
    // to avoid memory leaks
    this.cleanup();

    this.renderCollection();
    return this;
},

真正的优化从这里开始,使用临时容器。

renderCollection: function() {
    var container = document.createDocumentFragment();

    this.collection.each(function(model) {
        // this appends to a in memory document
        container.appendChild(this.renderItem(model, false).el);
    }, this);

    // Update the DOM only once every child view was rendered.
    this.$list.html(container);
    return this;
},

Our renderItem函数仍然可以用于渲染单个项目视图并立即将其放入 DOM 中。但它还提供了推迟 DOM 操作的选项,并且只返回视图。

renderItem: function(model, render) {
    var view = new Item({ model: model });

    this.childViews.push(view);
    view.render();
    if (render !== false) this.$list.append(view.el);
    return view;
},

为了避免悬空侦听器造成内存泄漏,请务必调用remove在忘记每个视图之前。

我通过推迟实际调用来使用额外的优化remove所以我们现在不会在用户等待时浪费时间。

cleanup: function() {
    var _childViewsDump = [].concat(this.childViews);
    this.childViews = [];

    while (_childViewsDump.length > 0) {
        var currentView = _childViewsDump.shift();
        // defer the removal as it's less important for now than rendering.
        _.defer(currentView.remove.bind(currentView), options);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 $.html() 时如何提高渲染性能 的相关文章

随机推荐

  • 这个符号在 php 中的对象或空值中意味着什么[重复]

    这个问题在这里已经有答案了 您能解释一下运营商做什么吗 gt 在 PHP 中做 因为我有这段代码 drive objDrive gt func gt getDriver gt value 目前只是一个提案 你可以去找找在此输入链接描述 ht
  • 在 Docker 容器中运行数据库的性能问题

    有没有人注意到在 docker 容器中运行数据库 MySQL 或 Postgres 有任何性能问题 我被告知会发生严重的性能下降 请指教 Docker 本身带来的开销非常小 它只是将进程与主机上的其他进程隔离 但是 您可以采取多种措施来降低
  • Dask“没有名为 xxxx 的模块”错误

    使用dask分布式我尝试提交一个位于另一个名为worker py的文件中的函数 在工人中我有以下错误 没有名为 worker 的模块 但是我无法弄清楚我在这里做错了什么 这是我的代码示例 import worker def run self
  • StaleDataException:尝试在关闭游标后访问它

    FATAL EXCEPTION main Process com example lenovo phone PID 4885 android database StaleDataException Attempted to access a
  • 如何访问具有相同名称的不同表的多个mysql行

    我认为我已经接近解决方案 但还没有完全明白 我想做的是从两个不同的表中获取product naam和categorie naam 下面的代码为我提供了两者的 naam 我可以访问它们 但现在我想要产品中的所有内容 而不仅仅是名称 然后我不知
  • 使用 sinon 断言使用所需参数进行了特定的存根调用

    假设您正在测试一个函数 该函数将使用不同的参数多次调用依赖项 var sut ImportantFunction function dependency dependency a 1 dependency b 2 使用QUnit Sinon
  • 如何在MAC上用python打开Excel实例?

    我认为这个问题之前已经被问过 但还不清楚 在最初的问题中 用户提供了 excel exe 它是 Windows 可执行扩展 不适用于 mac 我需要在 MAC 上用 Python 打开新的 Excel 实例 我应该导入哪个模块 我是一个新手
  • 如何将 perforce 用户更改为超级用户

    如何将标准 perforce 用户更改为超级用户 看到很多关于如果超级用户密码丢失该怎么办的问题 但没有看到关于如何创建另一个超级用户或授予当前用户超级用户权限的问题 您将需要更新该用户的 Perforce Protections 表 例如
  • 从 React Native 应用程序中删除 console.log

    如果您删除console log 在将 React Native 应用程序部署到商店之前调用 是否存在一些性能或其他问题 如果console log 调用保留在代码中 有没有办法使用某些任务运行程序删除日志 类似于 Grunt 或 Gulp
  • 将数据从两个 UItextfield 传递到新的视图控制器

    我有点坚持尝试将数据从一个视图控制器上的两个 UITextfield 传递到另一个视图控制器 基本上我得到了以下物品 视图控制器 h import
  • TDD 在机器学习中的好处

    据我所知 TDD 的典型工作流程是基于黑盒测试的 首先我们定义接口 然后编写一个或一组测试 然后我们实现通过所有测试的代码 那么请看下面的例子 from abc import ABCMeta class InterfaceCalculato
  • 如何使用 Volley 获取并解析 JSON 对象

    我一直无法找到这个问题的详细答案 或者至少没有一个我能理解的答案 我正在尝试设置 Volley 以从 iTunes 中提取 JSON 对象 然后我想解析这些对象 获取它们的图像 URL 例如 这里是 iTunes JSON 对象 URL S
  • python使用ssh时找不到模块

    我在服务器上使用 python 当我运行需要 numpy 模块的 python 命令时 如果我这样做 ssh
  • 连接 Hibernate 的查询生成

    我想实施虚拟视图与预处理器 一个简单的例子 之前的HQL FROM PublishedArticle a 生效后的 HQL FROM Article a WHERE a published true 本质上 我需要一种在执行查询之前处理查询
  • Angular 4 和 ng-template

    我收到此警告 The
  • 使用python(谷歌应用程序引擎)获取上传文件的名称和扩展名

    我正在使用表单将文件上传到谷歌应用程序引擎并将它们存储在数据存储中 我还想存储原始文件名和扩展名以供演示之用 有没有办法从发布服务器端检索此数据 或者只能在客户端收集并作为单独的字段发送 例如http www tinyurl com 5jy
  • 使用已填充的模型添加非空且唯一的字段

    我的应用程序中有一个模型在带有一些条目的服务器中运行 我需要添加一个SlugField 对于该模型来说是唯一且非空的 这SlugField将根据trading name 我更改了模型以添加这个新字段并修改了保存方法 class Suppli
  • jqGrid treeGrid 捕获展开折叠事件

    我使用 jqGrid 来构建一些大树 现在我想记住cookie中展开和折叠的节点 所以我想捕捉展开和折叠事件 我在手册中找不到它 所以我用这种方式解决了 grid find div treeclick bind click function
  • PRY 或 IRB - 重新加载类并忘记已删除的功能

    如果您更改文件然后在 pry 或 irb 中重新加载它 它似乎会拾取您添加到该类中的任何新功能 但不会忘记您从该类中删除的旧功能 重现步骤 使用单一方法创建一个类 例如 say hello 打开 PRY 或 IRB 并且load my cl
  • 使用 $.html() 时如何提高渲染性能

    我正在研究骨干demo app https jsfiddle net o75r7fu9 8 显示推文列表 当我用不同的数据替换所有 推文 时 我使用以下命令清除列表 html render function item table html