加速vue组件渲染之性能优化


Posted in Javascript onApril 09, 2020

背景

平时在用vue开发后台管理系统的时候,应该会用到大量的table这种组件,正常这种组件我们会在项目里做二次封装,然后针对表头title做参数化配置,如下:

export default {
  data(){
    return {
      tableTitle:[
        {
          label:'省份',
          prop:'prop'
        },
        {
          label:'城市',
          prop:'prop'
        },
        {
          label:'汇总',
          prop:'prop',
          colconfig:[
            {
              label:'下级',
              prop:'prop'
            }
          ]
        }
        ...
      ]
    }
  }
}

此时如果table字段比较多而且是多表头这种的话,数据结构就比较复杂,如果直接写在data里面的话,会在组件初始化时候,对此对象进行递归重写get set属性,源码如下:

function defineReactive(obj,key,val) {
 var dep = new Dep();
 var property = Object.getOwnPropertyDescriptor(obj, key);
 //如果对象被冻结,则直接跳出,不重写 get set方法
 if (property && property.configurable === false) {
  return
 }
 //observe会递归调用defineReactive,去重写对象内层的get set属性
 var childOb = !shallow && observe(val);
 Object.defineProperty(obj, key, {
  enumerable: true,
  configurable: true,
  get: function reactiveGetter () {
  },
  set: function reactiveSetter (newVal) {
  }
 });
}

然而这种静态数据是不需要动态响应的,这样势必会造浪性能浪费,于是我们想办法避免这种不必要的性能浪费。

方案1

此时我们可以用Object.freeze()这个方法对此数据进行冻结,vue组件在对data里的属性拦截时,会判断出被冻结的对象是不可被修改的【如上代码注释】,会直接跳过 get set的操作,这样便可以降低vue组件的render时间,提升页面性能

export default {

data(){
  return {
    tableTitle:Object.freeze(objConfig)
  }
}
}

方案2

把我们不需要动态响应的数据,在created的生命周期里面去定义,这样vue底层就不会拦截到这个属性了

export default {
  created(){
    this.tableTitle = [xxxxx]
  }
}

总结

其实这种场景在开发中经常遇到,比如查询条件有很多selectlist字段,我们也可以把它封装到一个大json里面,然后对其进行避免重写属性,可以降低不少性能开销

到此这篇关于加速vue组件渲染之性能优化的文章就介绍到这了,更多相关vue组件渲染性能优化内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
Javascript 面向对象(三)接口代码
May 23 Javascript
JS时间选择器 兼容IE6,7,8,9
Jun 26 Javascript
Javascript实现获取窗口的大小和位置代码分享
Dec 04 Javascript
Angularjs中$http以post请求通过消息体传递参数的实现方法
Aug 05 Javascript
jQuery zTree树插件简单使用教程
Jan 10 Javascript
js字符串与Unicode编码互相转换
May 17 Javascript
微信小程序实现图片上传、删除和预览功能的方法
Dec 18 Javascript
浅谈Angular7 项目开发总结
Dec 19 Javascript
微信小程序实现点击卡片 翻转效果
Sep 04 Javascript
关于vue组件事件属性穿透详解
Oct 28 Javascript
一篇文章带你浅入webpack的DLL优化打包
Feb 20 Javascript
如何阻止移动端浏览器点击图片浏览
Aug 29 Javascript
javascript设计模式 ? 抽象工厂模式原理与应用实例分析
Apr 09 #Javascript
javascript设计模式 ? 工厂模式原理与应用实例分析
Apr 09 #Javascript
javascript设计模式 ? 简单工厂模式原理与应用实例分析
Apr 09 #Javascript
javascript设计模式 ? 单例模式原理与应用实例分析
Apr 09 #Javascript
微信小程序纯文本实现@功能
Apr 08 #Javascript
JavaScript 俄罗斯方块游戏实现方法与代码解释
Apr 08 #Javascript
vue与iframe之间的信息交互的实现
Apr 08 #Javascript
You might like
不使用php api函数实现数组的交换排序示例
2014/04/13 PHP
php导入模块文件分享
2015/03/17 PHP
小议Function.apply()之二------利用Apply的参数数组化来提高 JavaScript程序性能
2006/11/30 Javascript
JavaScript 程序编码规范
2010/11/23 Javascript
使用JavaScript 实现对象 匀速/变速运动的方法
2013/05/08 Javascript
jquery实现页面关键词高亮显示的方法
2015/03/12 Javascript
ANGULARJS中使用JQUERY分页控件
2015/09/16 Javascript
js无法获取到html标签的属性的解决方法
2016/07/26 Javascript
自制微信公众号一键排版工具
2016/09/22 Javascript
使用Javascript判断浏览器终端设备(PC、IOS(iphone)、Android)
2017/01/04 Javascript
JS验证input输入框(字母,数字,符号,中文)
2017/03/23 Javascript
vue.js移动端tab组件的封装实践实例
2017/06/30 Javascript
深入理解angular2启动项目步骤
2017/07/15 Javascript
highcharts 在angular中的使用示例代码
2017/09/20 Javascript
ionic选择多张图片上传的示例代码
2017/10/10 Javascript
fetch 使用及如何接收JS传值
2017/11/11 Javascript
微信小程序如何获取用户手机号
2018/01/26 Javascript
详解nuxt sass全局变量(公共scss解决方案)
2018/06/27 Javascript
webpack css加载和图片加载的方法示例
2018/09/11 Javascript
VUE实现可随意拖动的弹窗组件
2018/09/25 Javascript
详解iview的checkbox多选框全选时校验问题
2019/06/10 Javascript
从CentOS安装完成到生成词云python的实例
2017/12/01 Python
使用python 和 lint 删除项目无用资源的方法
2017/12/20 Python
python+Splinter实现12306抢票功能
2018/09/25 Python
Python中的函数式编程:不可变的数据结构
2018/10/08 Python
python使用Turtle库绘制动态钟表
2018/11/19 Python
利用python在excel里面直接使用sql函数的方法
2019/02/08 Python
在python中使用nohup命令说明
2020/04/16 Python
Internet主要有哪些网络群组成
2015/12/24 面试题
项目计划书范文
2014/01/09 职场文书
2014迎新年晚会策划方案
2014/02/23 职场文书
个人委托书如何写
2014/09/25 职场文书
财务人员岗位职责
2015/02/03 职场文书
2015新学期家长寄语
2015/02/26 职场文书
民政局未婚证明
2015/06/15 职场文书
Linux在两个服务器直接传文件的操作方法
2022/08/05 Servers