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 相关文章推荐
javascript(jquery)利用函数修改全局变量的代码
Nov 02 Javascript
JS常用表单验证方法总结
May 22 Javascript
JavaScript基本的输出和嵌入式写法教程
Oct 20 Javascript
异步JS框架的作用以及实现方法
Oct 29 Javascript
深入理解Node.js中的进程管理
Mar 13 Javascript
vue router下的html5 history在iis服务器上的设置方法
Oct 18 Javascript
jQuery实现动态加载select下拉列表项功能示例
May 31 jQuery
微信小程序wx.uploadfile 本地文件转base64的实现代码
Jun 28 Javascript
vue实现图片预览组件封装与使用
Jul 13 Javascript
layui使用button按钮 点击出现弹层 弹层中加载表单的实例
Sep 04 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
Jul 20 Javascript
Vue3 实现双盒子定位Overlay的示例
Dec 22 Vue.js
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多个版本的分析解释
2011/07/21 PHP
PHP的curl实现get,post和cookie(实例介绍)
2013/06/17 PHP
jQuery+php实现ajax文件即时上传的详解
2013/06/17 PHP
PHP英文字母大小写转换函数小结
2014/05/03 PHP
php注册和登录界面的实现案例(推荐)
2016/10/24 PHP
PHP7新特性之抽象语法树(AST)带来的变化详解
2018/07/17 PHP
javascript与cookie 的问题详解
2013/11/11 Javascript
微信小程序 wxapp内容组件 text详细介绍
2016/10/31 Javascript
JQueryEasyUI之DataGrid数据显示
2016/11/23 Javascript
原生js实现手风琴功能(支持横纵向调用)
2017/01/13 Javascript
Vue.2.0.5过渡效果使用技巧
2017/03/16 Javascript
微信小程序实现简单表格
2019/02/14 Javascript
微信小程序实现图片选择并预览功能
2019/07/25 Javascript
Angular8引入百度Echarts进行图表分析的实现代码
2019/11/27 Javascript
详解vue修改elementUI的分页组件视图没更新问题
2020/11/13 Javascript
python实现将汉字转换成汉语拼音的库
2015/05/05 Python
Python sys.argv用法实例
2015/05/28 Python
django接入新浪微博OAuth的方法
2015/06/29 Python
Python聚类算法之DBSACN实例分析
2015/11/20 Python
python socket多线程通讯实例分析(聊天室)
2016/04/06 Python
Python 网页解析HTMLParse的实例详解
2017/08/10 Python
python方法生成txt标签文件的实例代码
2018/05/10 Python
Python中的单行、多行、中文注释方法
2018/07/19 Python
如何在Cloud Studio上执行Python代码?
2019/08/09 Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
2020/02/03 Python
python 制作python包,封装成可用模块教程
2020/07/13 Python
HTML5 通过Vedio标签实现视频循环播放的示例代码
2020/08/05 HTML / CSS
荷兰本土平价百货:HEMA
2017/10/23 全球购物
法国购买二手电子产品网站:Asgoodasnew
2020/03/27 全球购物
公司财务工作总结的自我评价
2013/11/23 职场文书
公司市场部岗位职责
2013/12/02 职场文书
犯错检讨书
2014/02/21 职场文书
团委竞选演讲稿
2014/04/24 职场文书
家长会欢迎标语
2014/06/24 职场文书
2015年公务员试用期工作总结
2015/05/28 职场文书
音乐研修感悟
2015/11/18 职场文书