加速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 相关文章推荐
黑帽seo劫持程序,js劫持搜索引擎代码
Sep 15 Javascript
jQuery实现简单的tab标签页效果
Sep 12 Javascript
微信小程序 五星评价功能的实现
Mar 09 Javascript
Express + Node.js实现登录拦截器的实例代码
Jul 01 Javascript
关于js中的鼠标事件总结
Jul 11 Javascript
Angular实现类似博客评论的递归显示及获取回复评论的数据
Nov 06 Javascript
Vue 过滤器filters及基本用法
Dec 26 Javascript
node 使用 async 控制并发的方法
May 07 Javascript
JS实现获取word文档内容并输出显示到html页面示例
Jun 23 Javascript
使用ng-packagr打包Angular的方法示例
Sep 21 Javascript
详解mpvue实现对苹果X安全区域的适配
Jul 31 Javascript
jQuery实现每日秒杀商品倒计时功能
Sep 06 jQuery
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采集相关教程之一 CURL函数库
2010/02/15 PHP
php实现的一个很好用HTML解析器类可用于采集数据
2013/09/23 PHP
php smarty模板引擎的6个小技巧
2014/04/24 PHP
PHP常用技巧汇总
2016/03/04 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
2018/04/04 PHP
AJAX 网页保留浏览器前进后退等功能
2011/02/12 Javascript
关于event.cancelBubble和event.stopPropagation()的区别介绍
2011/12/11 Javascript
js从10种颜色中随机取色实现每次取出不同的颜色
2013/10/23 Javascript
JS 获取浏览器和屏幕宽高等信息代码
2014/03/31 Javascript
IE浏览器不支持getElementsByClassName的解决方法
2014/08/27 Javascript
JavaScript合并两个数组并去除重复项的方法
2015/06/13 Javascript
JavaScript代码性能优化总结(推荐)
2016/05/16 Javascript
JavaScript闭包实例详解
2016/06/03 Javascript
深入浅析knockout源码分析之订阅
2016/07/12 Javascript
详解Angular开发中的登陆与身份验证
2016/07/27 Javascript
JS计算两个时间相差分钟数的方法示例
2018/01/10 Javascript
谈谈为什么你的 JavaScript 代码如此冗长
2019/01/30 Javascript
node 标准输入流和输出流代码实例
2019/09/19 Javascript
vue 使用 vue-pdf 实现pdf在线预览的示例代码
2020/04/26 Javascript
[01:07:15]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第二场 1月25日
2021/03/11 DOTA
Python向Excel中插入图片的简单实现方法
2018/04/24 Python
Python3.5 Pandas模块之DataFrame用法实例分析
2019/04/23 Python
opencv3/C++图像像素操作详解
2019/12/10 Python
vscode+PyQt5安装详解步骤
2020/08/12 Python
python 自定义异常和主动抛出异常(raise)的操作
2020/12/11 Python
Python创建简单的神经网络实例讲解
2021/01/04 Python
python自动化办公操作PPT的实现
2021/02/05 Python
彻底弄明白CSS3的Media Queries(跨平台设计)
2010/07/27 HTML / CSS
你的自行车健身专家:FaFit24
2016/11/16 全球购物
世界上最大的餐具公司:Oneida
2016/12/17 全球购物
印度在线内衣和时尚目的地:Zivame
2017/09/28 全球购物
积极贯彻学习两会精神总结
2014/03/17 职场文书
《记金华的双龙洞》教学反思
2014/04/19 职场文书
css3实现背景图片半透明内容不透明的方法示例
2021/04/13 HTML / CSS
前端与RabbitMQ实时消息推送未读消息小红点实现示例
2022/07/23 Java/Android