加速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 相关文章推荐
Display SQL Server Login Mode
Jun 21 Javascript
jquery easyui滚动条部分设置介绍
Sep 12 Javascript
你未必知道的JavaScript和CSS交互的5种方法
Apr 02 Javascript
js获取窗口相对于屏幕左边和上边的位置坐标
May 15 Javascript
jquery实现触发时更新下拉列表内容的方法
Dec 02 Javascript
JQuery异步加载PartialView的方法
Jun 07 Javascript
JavaScript_object基础入门(必看篇)
Jun 13 Javascript
jQuery与js实现颜色渐变的方法
Dec 30 Javascript
Bootstrap导航条学习使用(一)
Feb 08 Javascript
使用MUI框架模拟手机端的下拉刷新和上拉加载功能
Sep 04 Javascript
vue-cli2.x项目优化之引入本地静态库文件的方法
Jun 19 Javascript
vue-cli 打包后提交到线上出现 "Uncaught SyntaxError:Unexpected token" 报错
Nov 06 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
深入for,while,foreach遍历时间比较的详解
2013/06/08 PHP
PHP实现的购物车类实例
2015/06/17 PHP
php 删除一维数组中某一个值元素的操作方法
2018/02/01 PHP
Laravel 模型关联基础教程详解
2019/09/17 PHP
JavaScript原型链示例分享
2014/01/26 Javascript
纯jquery实现模仿淘宝购物车结算
2015/08/20 Javascript
简单纯js实现点击切换TAB标签实例
2015/08/23 Javascript
js格式化输入框内金额、银行卡号
2016/02/01 Javascript
jQuery表格插件datatables用法汇总
2016/03/29 Javascript
javascript中数组和字符串的方法对比
2016/07/20 Javascript
AngularJs Forms详解及简单示例
2016/09/01 Javascript
浅谈layer的iframe弹窗给里面的标签赋值的问题
2016/11/10 Javascript
jQuery用noConflict代替$的实现方法
2017/04/12 jQuery
JS实现多物体运动的方法详解
2018/01/23 Javascript
node 使用 async 控制并发的方法
2018/05/07 Javascript
npm 下载指定版本的组件方法
2018/05/17 Javascript
js动态设置select下拉菜单的默认选中项实例
2018/08/21 Javascript
微信小程序实现的一键拨号功能示例
2019/04/24 Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
2019/07/24 Javascript
[02:59]2014DOTA2西雅图国际邀请赛 圆满落幕中国夺冠
2014/07/23 DOTA
Python爬取商家联系电话以及各种数据的方法
2018/11/10 Python
Python2与Python3的区别实例总结
2019/04/17 Python
简单分析python的类变量、实例变量
2019/08/23 Python
使用Python为中秋节绘制一块美味的月饼
2019/09/11 Python
Python pip 安装与使用(安装、更新、删除)
2019/10/06 Python
浅析PEP572: 海象运算符
2019/10/15 Python
使用python+poco+夜神模拟器进行自动化测试实例
2020/04/23 Python
预订从美国飞往印度的机票:MyTicketsToIndia
2017/05/19 全球购物
Nisbets爱尔兰:英国最大的厨房和餐饮设备供应商
2019/01/26 全球购物
瑞典的玛丽小姐:Miss Mary of Sweden
2019/02/13 全球购物
合同专员岗位职责
2013/12/18 职场文书
就业协议书盖章的注意事项
2014/09/28 职场文书
会计求职简历自我评价
2015/03/10 职场文书
开票证明
2015/06/23 职场文书
Python insert() / append() 用法 Leetcode实战演示
2021/03/31 Python
goland 恢复已更改文件的操作
2021/04/28 Golang