加速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 相关文章推荐
js控制页面控件隐藏显示的两种方法介绍
Oct 09 Javascript
display和visibility的区别示例介绍
Feb 26 Javascript
JavaScript如何实现对数字保留两位小数一位自动补零
Dec 18 Javascript
有关suggest快速删除后仍然出现下拉列表的bug问题
Dec 02 Javascript
javascript正则表达式模糊匹配IP地址功能示例
Jan 06 Javascript
详解webpack打包vue时提取css
May 26 Javascript
使用jquery的jsonp如何发起跨域请求及其原理详解
Aug 17 jQuery
微信小程序实现联动选择器
Feb 15 Javascript
使用 node.js 模仿 Apache 小部分功能
Jul 07 Javascript
在Vue中使用this.$store或者是$route一直报错的解决
Nov 08 Javascript
vue print.js打印支持Echarts图表操作
Nov 13 Javascript
详解Vue 的异常处理机制
Nov 30 Vue.js
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访问查询mysql数据的三种方法
2006/10/09 PHP
mysql limit查询优化分析
2008/11/12 PHP
跟我学Laravel之视图 & Response
2014/10/15 PHP
PHP判断一个gif图片是否为动态图片的方法
2014/11/19 PHP
Symfony2框架学习笔记之表单用法详解
2016/03/18 PHP
Yii 框架使用数据库(databases)的方法示例
2020/05/19 PHP
JS location几个方法小姐
2008/07/09 Javascript
javascript call和apply方法
2008/11/24 Javascript
用jQuery与JSONP轻松解决跨域访问的问题
2014/02/04 Javascript
jquery动态加载js/css文件方法(自写小函数)
2014/10/11 Javascript
Jquery动态添加输入框的方法
2015/05/29 Javascript
图解js图片轮播效果
2015/12/20 Javascript
vue.js表格组件开发的实例详解
2016/10/12 Javascript
浅谈js对象属性 通过点(.) 和方括号([]) 的不同之处
2016/10/29 Javascript
JS作用域深度解析
2016/12/29 Javascript
ES6 Promise对象概念与用法分析
2017/04/01 Javascript
JS常见创建类的方法小结【工厂方式,构造器方式,原型方式,联合方式等】
2017/04/01 Javascript
webpack之devtool详解
2018/02/10 Javascript
Vue.js 踩坑记之双向绑定
2018/05/03 Javascript
vue.js+element-ui动态配置菜单的实例
2018/09/07 Javascript
详解node字体压缩插件font-spider的用法
2018/09/28 Javascript
如何利用node.js开发一个生成逐帧动画的小工具
2019/12/01 Javascript
Vue单文件组件开发实现过程详解
2020/07/30 Javascript
利用Python破解验证码实例详解
2016/12/08 Python
Python爬虫天气预报实例详解(小白入门)
2018/01/24 Python
python pandas修改列属性的方法详解
2018/06/09 Python
解决pycharm py文件运行后停止按钮变成了灰色的问题
2018/11/29 Python
关于Python 的简单栅格图像边界提取方法
2019/07/05 Python
django 将自带的数据库sqlite3改成mysql实例
2020/07/09 Python
美国棒球装备和用品商店:Baseball Savings
2018/06/09 全球购物
水上运动奥特莱斯:Wasterports Outlet
2018/08/08 全球购物
中专毕业生自荐信范文
2013/11/28 职场文书
旅游节目策划方案
2014/05/26 职场文书
球队口号
2014/06/18 职场文书
学生未请假就回家检讨书
2014/09/22 职场文书
老人节标语大全
2014/10/08 职场文书