Vue列表页渲染优化详解


Posted in Javascript onJuly 24, 2017

vue列表页渲染优化,具体内容如下

想法

初始化时,vue会对data做getter、setter改造,在现代浏览器里,虽然JS已经足够快,但仍然有优化空间。

列表页的数据结构为:

list: [
    // 每一项有不同的来源,不同来源的数据都不同,因此放到一个数组里
    [{
      sourceId: 'xmla', // 来源的唯一标识
      id: 3001, // 资源的唯一标识
      source: '喜马拉雅', // 来源
      title: '昆曲之牡丹亭',
      imageUrl: 'http://x.baidu.com/x.gif',
      album: 0, // 是否是专辑
      hot: 1345,
      anchor: '青雪'
    }, {
      sourceId: 'xmla', // 来源的唯一标识
      id: 3005, // 资源的唯一标识
      source: '手机百度', // 来源
      title: '昆曲之牡丹亭',
      imageUrl: 'http://x.baidu.com/x.gif',
      album: 0, // 是否是专辑
      hot: 1345,
      anchor: '青雪'
    }],
    [{
      sourceId: 'xmla',
      id: 3002, // 资源的唯一标识
      source: '喜马拉雅', // 来源
      title: '昆曲之春江花月夜',
      imageUrl: 'http://x.baidu.com/x.gif',
      album: 0, // 是否是专辑
      hot: 1345,
      anchor: '青雪'
    }],
  ]
}

Vue会给数组中的每个值设置getter和setter来监听它们的变动

但其实列表数据是不会发生变化的,这些操作是多余的。

方法一:使用Object.freeze()

Object.freeze()是ES5新增的API,用来冻结一个对象,禁止对象被修改。vue 1.0.18+以后,不会对已冻结的data做getter、setter转换。

如果确保某个data不需要跟踪依赖,可以使用Object.freeze将其冻结。需要注意的是,被冻结的是对象的值,仍然可以将引用整个替换调。看下面例子:

<p v-for="item in list">{{ item.value }}</p>
new Vue({
  data: {
    // vue不会对list里的object做getter、setter绑定
    list: Object.freeze([
      { value: 1 },
      { value: 2 }
    ])
  },
  created () {
    // 界面不会有响应
    this.list[0].value = 100;

    // 下面两种做法,界面都会响应
    this.list = [
      { value: 100 },
      { value: 200 }
    ];
    this.list = Object.freeze([
      { value: 100 },
      { value: 200 }
    ]);
  }
})

当使用Vuex进行状态管理时,应当在给state.xxx赋值前使用Object.freeze():

[LIST_INIT](state, {list}) {
  Object.freeze(list);
  state.list = list;
},

getter和setter没有了。

方法二:传string方法

由于从后端取回的数据本身为字符串,不进行JSON.parse()直接存在state中,即可阻止Vue的改造。
使用时,在页面组件中引入字符串,JSON.parse()后可以直接赋值给this.XXX,如有需要还可以进一步子组件。

this.test = {
  a:{
    c:1,
    d:2
  },
  b:2
}
<list-item :test="test.a"></list-item>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript判断微信浏览器实例代码
Jun 13 Javascript
BooStrap对导航条的改造实践小结
Sep 21 Javascript
AngularJS实现ajax请求的方法
Nov 22 Javascript
jQuery Easy UI中根据第一个下拉框选中的值设置第二个下拉框是否可以编辑
Nov 29 Javascript
JS利用cookies设置每隔24小时弹出框
Apr 20 Javascript
JS中type=&quot;button&quot;和type=&quot;submit&quot;的区别
Jul 04 Javascript
使用Node.js搭建静态资源服务详细教程
Aug 02 Javascript
AngularJS select设置默认值的实现方法
Aug 25 Javascript
JS实现获取汉字首字母拼音、全拼音及混拼音的方法
Nov 14 Javascript
Promise.all中对于reject的处理方法
Aug 01 Javascript
vue环形进度条组件实例应用
Oct 10 Javascript
JavaScript 正则应用详解【模式、欲查、反向引用等】
May 13 Javascript
javascript cookie的基本操作(添加和删除)
Jul 24 #Javascript
JavaScript取得gridview中获取checkbox选中的值
Jul 24 #Javascript
Javascript之图片的延迟加载的实例详解
Jul 24 #Javascript
在React中如何优雅的处理事件响应详解
Jul 24 #Javascript
使用AngularJS编写多选按钮选中时触发指定方法的指令代码详解
Jul 24 #Javascript
想用好React的你必须要知道的一些事情
Jul 24 #Javascript
利用node.js实现反向代理的方法详解
Jul 24 #Javascript
You might like
php二分法在IP地址查询中的应用
2008/08/12 PHP
探讨如何使用SimpleXML函数来加载和解析XML文档
2013/06/07 PHP
深入extjs与php参数交互的详解
2013/06/25 PHP
php二维码生成
2015/10/19 PHP
微信支付开发维权通知实例
2016/07/12 PHP
php实现的redis缓存类定义与使用方法示例
2017/08/09 PHP
浅析PHP中的闭包和匿名函数
2017/12/25 PHP
ASP.NET jQuery 实例10 动态修改hyperlink的URL值
2012/02/03 Javascript
JavaScript截取、切割字符串的技巧
2016/01/07 Javascript
关于网页中的无缝滚动的js代码
2016/06/09 Javascript
CSS3 3D 技术手把手教你玩转
2016/09/02 Javascript
纯JS单页面赛车游戏制作代码分享
2017/03/03 Javascript
node.js操作mysql简单实例
2017/05/25 Javascript
在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解
2017/09/19 NodeJs
详解plotly.js 绘图库入门使用教程
2018/02/23 Javascript
深入浅析Vue中的 computed 和 watch
2018/06/06 Javascript
vue实现简单loading进度条
2018/06/06 Javascript
使用vue根据状态添加列表数据和删除列表数据的实例
2018/09/29 Javascript
详解Bootstrap 学习(一)入门
2019/04/12 Javascript
微信小程序前端promise封装代码实例
2019/08/24 Javascript
layui的layedit富文本赋值方法
2019/09/18 Javascript
vue项目中js-cookie的使用存储token操作
2020/11/13 Javascript
Python解析json文件相关知识学习
2016/03/01 Python
Python使用Redis实现作业调度系统(超简单)
2016/03/22 Python
Python之多线程爬虫抓取网页图片的示例代码
2018/01/10 Python
Python3数据库操作包pymysql的操作方法
2018/07/16 Python
浅谈关于Python3中venv虚拟环境
2018/08/01 Python
JSON文件及Python对JSON文件的读写操作
2018/10/07 Python
python生成n个元素的全组合方法
2018/11/13 Python
python 控制Asterisk AMI接口外呼电话的例子
2019/08/08 Python
python 使用cx-freeze打包程序的实现
2020/03/14 Python
在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern "C"
2014/08/09 面试题
会计专业应届生自荐信
2014/06/28 职场文书
2016新党章学习心得体会
2016/01/15 职场文书
frg-100简单操作(设置)说明
2022/04/05 无线电
Django框架中模型的用法
2022/06/10 Python