這個系列記錄我在一年vue開發中總結的一些經驗和技巧。
利用Object.freeze()提升效能
Object.freeze()是ES5新增的特性,可以凍結一個對象,防止物件被修改。
vue 1.0.18+對其提供了支持,對於data或vuex裡使用freeze凍結了的對象,vue不會做getter和setter的轉換。
如果你有一個巨大的陣列或Object,並且確信資料不會修改,使用Object.freeze()可以讓效能大幅提升。在我的實際開發中,這種提升大約有5~10倍,倍數隨著資料量增加。
並且,Object.freeze()凍結的是值,你仍然可以將變數的參考替換掉。舉個例子:
{{ item.value }}
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>
舉個例子:
<!-- component --> <datepicker></datepicker> <!-- directive --> <div v-datepicker="{options}"></div>
<a title="这是一个指令"></a> <p title="这是一个指令"></p> <div title="这是一个指令"></div>
rrreee
title屬性為不同的標籤提供tooltip功能,這就是一個指令。一個指令應該表示一個獨立的功能,可以為不同的標籤和元件提供相同的功能。