vue开发心得和技巧分享


Posted in Javascript onOctober 27, 2016

这个系列记录我在一年vue开发中总结的一些经验和技巧。

利用Object.freeze()提升性能

Object.freeze()是ES5新增的特性,可以冻结一个对象,防止对象被修改。

vue 1.0.18+对其提供了支持,对于data或vuex里使用freeze冻结了的对象,vue不会做getter和setter的转换。

如果你有一个巨大的数组或Object,并且确信数据不会修改,使用Object.freeze()可以让性能大幅提升。在我的实际开发中,这种提升大约有5~10倍,倍数随着数据量递增。

并且,Object.freeze()冻结的是值,你仍然可以将变量的引用替换掉。举个例子:

<p v-for="item in list">{{ item.value }}</p>

new Vue({
 data: {
 // vue不会对list里的object做getter、setter绑定
 list: Object.freeze([
  { value: 1 },
  { value: 2 }
 ])
 },
 created () {
 // 界面不会有响应
 this.list[0].value = 100;

 // 下面两种做法,界面都会响应
 this.list = [
  { value: 100 },
  { value: 200 }
 ];
 this.list = Object.freeze([
  { value: 100 },
  { value: 200 }
 ]);
 }
})

vue的文档没有写上这个特性,但这是个非常实用的做法,对于纯展示的大数据,都可以使用Object.freeze提升性能。

使用 vm.$compile 编译dom

$compile函数可以用来手动调用vue的方式来编译dom。在你需要处理某个jQuery插件生成的html或者服务端返回的html的时候,这个函数可以派上用场。但注意这是个私有api,随时都有可能变动,并且这种做法有违vue的理念。仅在不得已的时候使用。

new Vue({
 data: {
 value: 'demo'
 },
 created () {
 let dom = document.createElement('div');
 dom.innerHTML = '{{ value }}';
 this.$compile(dom);
 }
})

合理使用track-by="$index"

track-by是vue为循环提供的优化方法,可以复用多次v-for中id相同的dom。如果你的数据没有一个唯一的id,也可以选择使用track-by="$index",但必须注意一些副作用。

举个例子:

new Vue({
 data: {
 list: [1, 2, 3]
 }
})
<div id="demo-1">
 <p v-for="item in list">{{ item }}</p>
</div>
<div id="demo-2">
 <p v-for="item in list" track-by="$index">{{ item }}</p>
</div>

这时候执行this.list = [4, 5, 6],可以通过F12观察到,demo-1里的dom被全部删除,然后重新循环list生成dom,而demo-2不会删除dom,只是把他们的text格子修改为4,5,6。这就是track-by="$index"的效果,复用了两次v-for中$index相同的dom。

这是一个很好的优化方法,但不是所有场景都适用,比如循环中包含表单控件或子组件时,由于dom并不会被删除重新生成,会导致第二次执行的v-for,原有表单控件的值不会改变,可以看这个例子:https://jsfiddle.net/jysboza9/1/

不要滥用Directive

网上有一种说法,认为dom操作都应该封装在指令中。实际开发中,我认为并不应该遵循这种教条。是否使用指令应该看你实现的是什么功能,而不是看是否操作了dom。比如说你想用vue封装一个jQuery插件,来看看下面哪种封装方法比较好:

<!-- component -->
<datepicker></datepicker>
<!-- directive -->
<div v-datepicker="{options}"></div>

个人认为无疑是第一种方法更好,datepicker是一个独立的组件,你并不需要关心他的内部是否操作了dom,是否封装了jQuery插件。

那么什么时候使用指令呢?来看一下浏览器原生提供的指令:

<a title="这是一个指令"></a>
<p title="这是一个指令"></p>
<div title="这是一个指令"></div>

title属性为不同的标签提供tooltip功能,这就是一个指令。一个指令应该表示一个独立的功能,可以为不同的标签和组件提供相同的功能。

未完待续……

本文已被整理到了《Vue.js前端组件学习教程》,欢迎大家学习阅读。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
通过JS 获取Mouse Position(鼠标坐标)的代码
Sep 21 Javascript
jquery制作图片时钟特效
Mar 30 Javascript
微信小程序 http请求的session管理
Jun 07 Javascript
js解决软键盘遮挡输入框的问题分享
Dec 19 Javascript
微信小程序之swiper滑动面板用法示例
Dec 04 Javascript
vue中轮训器的使用
Jan 27 Javascript
javascript面向对象三大特征之多态实例详解
Jul 24 Javascript
在layui中select更改后生效的方法
Sep 05 Javascript
VUE子组件向父组件传值详解(含传多值及添加额外参数场景)
Sep 01 Javascript
JS中多层次排序算法的实现代码
Jan 06 Javascript
Vue中的nextTick作用和几个简单的使用场景
Jan 25 Vue.js
浅谈JavaScript浅拷贝和深拷贝
Nov 07 Javascript
js获取指定字符前/后的字符串简单实例
Oct 27 #Javascript
简单模拟node.js中require的加载机制
Oct 27 #Javascript
浅谈jquery中next与siblings的区别
Oct 27 #Javascript
vue多级多选菜单组件开发
Sep 08 #Javascript
使用Javascript监控前端相关数据的代码
Oct 27 #Javascript
js实现各种复制到剪贴板的方法(分享)
Oct 27 #Javascript
js复制内容到剪贴板代码,js复制代码的简单实例
Oct 27 #Javascript
You might like
用PHP和ACCESS写聊天室(七)
2006/10/09 PHP
cmd下运行php脚本
2008/11/25 PHP
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
2016/03/21 PHP
实例讲解php数据访问
2016/05/09 PHP
php+jQuery递归调用POST循环请求示例
2016/10/14 PHP
利用php + Laravel如何实现部署自动化详解
2017/10/11 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
laravel清除视图缓存的代码
2019/10/23 PHP
javascript简单实现滑动菜单效果的方法
2015/07/27 Javascript
JavaScript实现解析INI文件内容的方法
2016/11/17 Javascript
基于Two.js实现星球环绕动画效果的示例
2017/11/06 Javascript
解决vue的 v-for 循环中图片加载路径问题
2018/09/03 Javascript
聊聊鉴权那些事(推荐)
2019/08/22 Javascript
JavaScript 空间坐标的使用
2020/08/19 Javascript
OpenLayers3实现测量功能
2020/09/25 Javascript
[02:16]完美世界DOTA2联赛PWL S3 集锦第三期
2020/12/21 DOTA
Python去除字符串两端空格的方法
2015/05/21 Python
Python文本相似性计算之编辑距离详解
2016/11/28 Python
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
2017/12/14 Python
Python实现批量修改图片格式和大小的方法【opencv库与PIL库】
2018/12/03 Python
从运行效率与开发效率比较Python和C++
2018/12/14 Python
Python简单获取二维数组行列数的方法示例
2018/12/21 Python
Ubuntu18.04下python版本完美切换的解决方法
2019/06/14 Python
python批量爬取下载抖音视频
2019/06/17 Python
PyQt4编程之让状态栏显示信息的方法
2019/06/18 Python
利用python实现汉字转拼音的2种方法
2019/08/12 Python
python实现坦克大战
2020/04/24 Python
python爬取豆瓣电影排行榜(requests)的示例代码
2021/02/18 Python
CSS3属性box-sizing使用指南
2014/12/09 HTML / CSS
CSS 3.0 结合video视频实现的创意开幕效果
2020/06/01 HTML / CSS
军用级手机壳,专为冒险而建:Zizo Wireless
2019/08/07 全球购物
擅自离岗检讨书
2014/02/11 职场文书
机关党建工作汇报材料
2014/08/20 职场文书
乡镇四风对照检查材料
2014/08/31 职场文书
学习习近平主席讲话心得体会
2016/01/20 职场文书
React中的Context应用场景分析
2021/06/11 Javascript