原文: https://github.com/Coffcer/Bl...javascript
这个系列记录我在一年vue开发中总结的一些经验和技巧。html
Object.freeze()是ES5新增的特性,能够冻结一个对象,防止对象被修改。vue
vue 1.0.18+对其提供了支持,对于data或vuex里使用freeze冻结了的对象,vue不会作getter和setter的转换。java
若是你有一个巨大的数组或Object,而且确信数据不会修改,使用Object.freeze()可让性能大幅提高。在个人实际开发中,这种提高大约有5~10倍,倍数随着数据量递增。git
而且,Object.freeze()冻结的是值,你仍然能够将变量的引用替换掉。举个例子:github
<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提高性能。vuex
$compile函数能够用来手动调用vue的方式来编译dom。在你须要处理某个jQuery插件生成的html或者服务端返回的html的时候,这个函数能够派上用场。但注意这是个私有api,随时都有可能变更,而且这种作法有违vue的理念。仅在不得已的时候使用。api
new Vue({ data: { value: 'demo' }, created () { let dom = document.createElement('div'); dom.innerHTML = '{{ value }}'; this.$compile(dom); } })
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/
网上有一种说法,认为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功能,这就是一个指令。一个指令应该表示一个独立的功能,能够为不一样的标签和组件提供相同的功能。
(待续...)