加速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 相关文章推荐
javascrip客户端验证文件大小及文件类型并重置上传
Jan 12 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
Oct 17 Javascript
JavaScript DOM操作表格及样式
Apr 13 Javascript
jQuery的选择器中的通配符[id^='code']或[name^='code']及jquery选择器总结
Dec 24 Javascript
再谈JavaScript异步编程
Jan 27 Javascript
全屏js头像上传插件源码高清版
Mar 29 Javascript
js 判断登录界面的账号密码是否为空
Feb 08 Javascript
如何编写jquery插件
Mar 29 jQuery
Js判断H5上下滑动方向及滑动到顶部和底部判断的示例代码
Nov 15 Javascript
详解vue组件中使用路由方法
Feb 12 Javascript
JS数据类型(基本数据类型、引用数据类型)及堆和栈的区别分析
Mar 04 Javascript
vue组件开发之slider组件使用详解
Aug 21 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注入实例
2006/10/09 PHP
codeigniter框架批量插入数据
2014/01/09 PHP
PHP实现链式操作的核心思想
2015/06/23 PHP
php如何实现不借助IDE快速定位行数或者方法定义的文件和位置
2017/01/17 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
PHP实现PDO操作mysql存储过程示例
2019/02/13 PHP
Javascript 面向对象 对象(Object)
2010/05/13 Javascript
javascript 学习笔记(onchange等)
2010/11/14 Javascript
jquery操作对象数组元素方法详解
2014/11/26 Javascript
本人自用的global.js库源码分享
2015/02/28 Javascript
深入探讨JavaScript String对象
2015/03/09 Javascript
window.onerror()的用法与实例分析
2016/01/27 Javascript
Nodejs高扩展性的模板引擎 functmpl简介
2017/02/13 NodeJs
详解PHP后期静态绑定分析与应用
2018/03/21 Javascript
JS实现十分钟倒计时代码实例
2018/10/18 Javascript
js实现json数组分组合并操作示例
2019/02/12 Javascript
[02:41]DOTA2英雄基础教程 亚巴顿
2014/01/02 DOTA
python网络编程学习笔记(一)
2014/06/09 Python
详解Python的Django框架中manage命令的使用与扩展
2016/04/11 Python
Python3安装Pymongo详细步骤
2017/05/26 Python
Python3多线程爬虫实例讲解代码
2018/01/05 Python
python绘制直线的方法
2018/06/30 Python
jupyter notebook实现显示行号
2020/04/13 Python
Python基于DB-API操作MySQL数据库过程解析
2020/04/23 Python
用ldap作为django后端用户登录验证的实现
2020/12/07 Python
详解Python爬虫爬取博客园问题列表所有的问题
2021/01/18 Python
城市观光通行证:The Sightseeing Pass
2018/04/28 全球购物
猫咪家具:CatsPlay
2018/11/03 全球购物
几个Linux面试题笔试题
2016/08/01 面试题
应届行政管理专业个人自我评价
2013/12/28 职场文书
门诊手术室工作制度
2014/01/30 职场文书
2014迎国庆标语大全
2014/09/19 职场文书
分析MySQL抛出异常的几种常见解决方式
2021/05/18 MySQL
一次线上mongo慢查询问题排查处理记录
2022/03/18 MongoDB
vue自定义右键菜单之全局实现
2022/04/09 Vue.js
Meta增速拉垮,元宇宙难当重任
2022/04/29 数码科技