首頁 > php教程 > PHP开发 > vue開發心得和技巧分享

vue開發心得和技巧分享

高洛峰
發布: 2016-12-08 15:43:39
原創
1636 人瀏覽過

這個系列記錄我在一年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>
登入後複製

   

這時候執行this.list = [4, 5, 6],可以透過F12觀察到,demo-1裡的dom被全部刪除,然後重新循環中產生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插件,來看看下面哪種封裝方法比較好:

<a title="这是一个指令"></a>
<p title="这是一个指令"></p>
<div title="这是一个指令"></div>
登入後複製
   

個人認為無疑是第一種方法更好,datepicker是一個獨立的組件,你並不需要關心他的內部是否操作了dom,是否封裝了jQuery插件。

那麼什麼時候使用指令呢?來看看瀏覽器原生提供的指令:

rrreee

   


title屬性為不同的標籤提供tooltip功能,這就是一個指令。一個指令應該表示一個獨立的功能,可以為不同的標籤和元件提供相同的功能。

🎜🎜🎜
相關標籤:
vue
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門推薦
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板