加速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更改class和id的方法
Oct 10 Javascript
利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域
Dec 14 Javascript
详解JavaScript对象和数组
Dec 03 Javascript
JS中使用apply、bind实现为函数或者类传入动态个数的参数
Apr 26 Javascript
jQuery购物网页经典制作案例
Aug 19 Javascript
JS实现AES加密并与PHP互通的方法分析
Apr 19 Javascript
JS 组件系列之BootstrapTable的treegrid功能
Jun 16 Javascript
javascript+html5+css3自定义提示窗口
Jun 21 Javascript
浅谈ECMAScript6新特性之let、const
Aug 02 Javascript
微信小程序实现MUI数字输入框效果
Jan 31 Javascript
微信小程序实现3D轮播图效果(非swiper组件)
Sep 21 Javascript
JS中如何优雅的使用async await详解
Oct 05 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函数
2010/02/16 PHP
在smarty中调用php内置函数的方法
2013/02/07 PHP
PHP安全上传图片的方法
2015/03/21 PHP
PHP中cookie知识点学习
2018/05/06 PHP
jQuery Ajax文件上传(php)
2009/06/16 Javascript
EXTJS内使用ACTIVEX控件引起崩溃问题的解决方法
2010/03/31 Javascript
js Dialog 实践分享
2012/10/22 Javascript
js 高效去除数组重复元素示例代码
2013/12/19 Javascript
js实现键盘上下左右键选择文字并显示在文本框的方法
2015/05/07 Javascript
很不错的两款Bootstrap Icon图标选择组件
2016/01/28 Javascript
Jquery中map函数的用法
2016/06/03 Javascript
Google 地图API资料整理及详细介绍
2016/08/06 Javascript
bootstrap模态框消失问题的解决方法
2016/12/02 Javascript
微信小程序 在线支付功能的实现
2017/03/14 Javascript
HTML5实现微信拍摄上传照片功能
2017/04/21 Javascript
Bootstrap-table自定义可编辑每页显示记录数
2018/09/07 Javascript
微信小程序自定义底部导航带跳转功能
2018/11/27 Javascript
Vue从TodoList中学父子组件通信
2019/02/05 Javascript
JS实现容器模块左右拖动效果
2020/01/14 Javascript
记一次react前端项目打包优化的方法
2020/03/30 Javascript
ant design pro中可控的筛选和排序实例
2020/11/17 Javascript
[14:51]DOTA2 HEROS教学视频教你分分钟做大人-卓尔游侠
2014/06/13 DOTA
[01:03:50]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第二场 2月7日
2021/03/11 DOTA
简单谈谈Python流程控制语句
2016/12/04 Python
Django实现的自定义访问日志模块示例
2017/06/23 Python
PyQt5实现下载进度条效果
2018/04/19 Python
python3+PyQt5实现文档打印功能
2018/04/24 Python
关于Tensorflow中的tf.train.batch函数的使用
2018/04/24 Python
CSS3为背景图设置遮罩并解决遮罩样式继承问题
2020/06/22 HTML / CSS
Internal修饰符有什么含义
2013/07/10 面试题
保送生自荐信范文
2013/10/06 职场文书
后勤园长自我鉴定
2013/10/17 职场文书
《巨人的花园》教学反思
2014/02/12 职场文书
婚假请假条格式及范文
2014/04/10 职场文书
信用卡工资证明范本
2014/10/17 职场文书
离婚协议书的范本
2015/01/27 职场文书