Vue 開發必須知道的 36 個技巧

前言

Vue 3.x 的Pre-Alpha 版本。後面應該還會有 Alpha、Beta 等版本,預計至少要等到 2020 年第一季度才有可能發佈 3.0 正式版; 所以應該趁還沒出來加緊打好 Vue2.x 的基礎; Vue基本用法很容易上手,但是有很多優化的寫法你就不一定知道了,本文從列舉了 36 個 vue 開發技巧; 後續 Vue 3.x 出來後持續更新.

1.require.context()

1.場景:如頁面需要導入多個組件,原始寫法:

Vue 開發必須知道的 36 個技巧

2.這樣就寫了大量重複的代碼,利用 require.context 可以寫成

Vue 開發必須知道的 36 個技巧

這樣不管頁面引入多少組件,都可以使用這個方法

3.API 方法

Vue 開發必須知道的 36 個技巧

2.watch

2.1 常用用法

1.場景:表格初始進來需要調查詢接口 getList(),然後input 改變會重新查詢

Vue 開發必須知道的 36 個技巧

2.2 立即執行

2.可以直接利用 watch 的immediate和handler屬性簡寫

Vue 開發必須知道的 36 個技巧

2.3 深度監聽

3.watch 的 deep 屬性,深度監聽,也就是監聽複雜數據類型

Vue 開發必須知道的 36 個技巧

此時發現oldVal和 newVal 值一樣; 因為它們索引同一個對象/數組,Vue 不會保留修改之前值的副本; 所以深度監聽雖然可以監聽到對象的變化,但是無法監聽到具體對象裡面那個屬性的變化

3. 14種組件通訊

3.1 props

這個應該非常屬性,就是父傳子的屬性; props 值可以是一個數組或對象;

Vue 開發必須知道的 36 個技巧

3.2 $emit

這個也應該非常常見,觸發子組件觸發父組件給自己綁定的事件,其實就是子傳父的方法

Vue 開發必須知道的 36 個技巧

3.3 vuex

  1. 這個也是很常用的,vuex 是一個狀態管理器
  2. 是一個獨立的插件,適合數據共享多的項目裡面,因為如果只是簡單的通訊,使用起來會比較重
  3. API
Vue 開發必須知道的 36 個技巧

3.4 attrs和listeners

2.4.0 新增 這兩個是不常用屬性,但是高級用法很常見;

Vue 開發必須知道的 36 個技巧

相對應的如果子組件定義了 props,打印的值就是剔除定義的屬性

Vue 開發必須知道的 36 個技巧

2.

Vue 開發必須知道的 36 個技巧

如果是孫組件要訪問父組件的屬性和調用方法,直接一級一級傳下去就可以

3.inheritAttrs

Vue 開發必須知道的 36 個技巧

3.5 provide和inject

2.2.0 新增 描述: provide 和 inject 主要為高階插件/組件庫提供用例。並不推薦直接用於應用程序代碼中; 並且這對選項需要一起使用; 以允許一個祖先組件向其所有子孫後代注入一個依賴,不論組件層次有多深,並在起上下游關係成立的時間裡始終生效。

Vue 開發必須知道的 36 個技巧

provide 和 inject 綁定並不是可響應的。這是官方刻意為之的。 然而,如果你傳入了一個可監聽的對象,那麼其對象的屬性還是可響應的,對象是因為是引用類型

Vue 開發必須知道的 36 個技巧

3.6 children


Vue 開發必須知道的 36 個技巧

3.7 $refs

Vue 開發必須知道的 36 個技巧

3.8 $root

Vue 開發必須知道的 36 個技巧

3.9 .sync

Vue 開發必須知道的 36 個技巧

3.10 v-slot

Vue 開發必須知道的 36 個技巧


Vue 開發必須知道的 36 個技巧

3.11 EventBus

Vue 開發必須知道的 36 個技巧

4.可以實現平級,嵌套組件傳值,但是對應的事件名eventTarget必須是全局唯一的

3.12 broadcast和dispatch

vue 1.x 有這兩個方法,事件廣播和派發,但是 vue 2.x 刪除了 下面是對兩個方法進行的封裝

Vue 開發必須知道的 36 個技巧

3.13 路由傳參

1.方案一

Vue 開發必須知道的 36 個技巧

2.方案二

Vue 開發必須知道的 36 個技巧

3.方案三

Vue 開發必須知道的 36 個技巧

4.三種方案對比 方案二參數不會拼接在路由後面,頁面刷新參數會丟失 方案一和三參數拼接在後面,醜,而且暴露了信息

3.14 Vue.observable

2.6.0 新增 用法:讓一個對象可響應。Vue 內部會用它來處理 data 函數返回的對象; 返回的對象可以直接用於渲染函數和計算屬性內,並且會在發生改變時觸發相應的更新; 也可以作為最小化的跨組件狀態存儲器,用於簡單的場景。 通訊原理實質上是利用Vue.observable實現一個簡易的 vuex

Vue 開發必須知道的 36 個技巧

4.render 函數

1.場景:有些代碼在 template 裡面寫會重複很多,所以這個時候 render 函數就有作用啦

Vue 開發必須知道的 36 個技巧

2.render 和 template 的對比 前者適合複雜邏輯,後者適合邏輯簡單; 後者屬於聲明是渲染,前者屬於自定Render函數; 前者的性能較高,後者性能較低。

5.異步組件

場景:項目過大就會導致加載緩慢,所以異步組件實現按需加載就是必須要做的事啦 1.異步註冊組件 3種方法

Vue 開發必須知道的 36 個技巧


異步組件的渲染本質上其實就是執行2次或者2次以上的渲染, 先把當前組件渲染為註釋節點, 當組件加載成功後, 通過 forceRender 執行重新渲染。或者是渲染為註釋節點, 然後再渲染為loading節點, 在渲染為請求完成的組件

2.路由的按需加載

Vue 開發必須知道的 36 個技巧

6.動態組件

場景:做一個 tab 切換時就會涉及到組件動態加載

<code><component>/<code>

但是這樣每次組件都會重新加載,會消耗大量性能,所以 就起到了作用

Vue 開發必須知道的 36 個技巧


這樣切換效果沒有動畫效果,這個也不用著急,可以利用內置的

Vue 開發必須知道的 36 個技巧


7.遞歸組件

場景:如果開發一個 tree 組件,裡面層級是根據後臺數據決定的,這個時候就需要用到動態組件

Vue 開發必須知道的 36 個技巧

遞歸組件必須設置name 和結束的閥值

8.函數式組件

定義:無狀態,無法實例化,內部沒有任何生命週期處理方法 規則:在 2.3.0 之前的版本中,如果一個函數式組件想要接收 prop,則 props 選項是必須的。 在 2.3.0 或以上的版本中,你可以省略 props 選項,所有組件上的特性都會被自動隱式解析為 prop 在 2.5.0 及以上版本中,如果你使用了單文件組件(就是普通的.vue 文件),可以直接在 template 上聲明functional 組件需要的一切都是通過 context 參數傳遞

context 屬性有: 1.props:提供所有 prop 的對象 2.children: VNode 子節點的數組 3.slots: 一個函數,返回了包含所有插槽的對象 4.scopedSlots: (2.6.0+) 一個暴露傳入的作用域插槽的對象。也以函數形式暴露普通插槽。 5.data:傳遞給組件的整個數據對象,作為 createElement 的第二個參數傳入組件 6.parent:對父組件的引用 7.listeners: (2.3.0+) 一個包含了所有父組件為當前組件註冊的事件監聽器的對象。這是 data.on 的一個別名。 8.injections: (2.3.0+) 如果使用了 inject 選項,則該對象包含了應當被注入的屬性

Vue 開發必須知道的 36 個技巧


9.components和 Vue.component

components:局部註冊組件

<code>export default{
components:{home}
}/<code>

Vue.component:全局註冊組件

<code>Vue.component('home',home)/<code>

10.Vue.extend

場景:vue 組件中有些需要將一些元素掛載到元素上,這個時候 extend 就起到作用了 是構造一個組件的語法器 寫法:

Vue 開發必須知道的 36 個技巧


11.mixins

場景:有些組件有些重複的 js 邏輯,如校驗手機驗證碼,解析時間等,mixins 就可以實現這種混入 mixins 值是一個數組

Vue 開發必須知道的 36 個技巧


12.extends

extends用法和mixins很相似,只不過接收的參數是簡單的選項對象或構造函數,所以extends只能單次擴展一個組件

Vue 開發必須知道的 36 個技巧


13.Vue.use()

場景:我們使用 element時會先 import,再 Vue.use()一下,實際上就是註冊組件,觸發 install 方法; 這個在組件調用會經常使用到; 會自動組織多次註冊相同的插件.

14.install

場景:在 Vue.use()說到,執行該方法會觸發 install 是開發vue的插件,這個方法的第一個參數是 Vue 構造器,第二個參數是一個可選的選項對象(可選)

Vue 開發必須知道的 36 個技巧


Vue 開發必須知道的 36 個技巧

更多請戳 vue中extend,mixins,extends,components,install的幾個操作

15. Vue.nextTick

2.1.0 新增 場景:頁面加載時需要讓文本框獲取焦點 用法:在下次 DOM 更新循環結束之後執行延遲迴調。在修改數據之後立即使用這個方法,獲取更新後的 DOM

Vue 開發必須知道的 36 個技巧


16.Vue.directive

16.1 使用

場景:官方給我們提供了很多指令,但是我們如果想將文字變成指定的顏色定義成指令使用,這個時候就需要用到Vue.directive

Vue 開發必須知道的 36 個技巧


16.2 生命週期

1.bind 只調用一次,指令第一次綁定到元素時候調用,用這個鉤子可以定義一個綁定時執行一次的初始化動作。 2.inserted:被綁定的元素插入父節點的時候調用(父節點存在即可調用,不必存在document中) 3.update: 被綁定與元素所在模板更新時調用,而且無論綁定值是否有變化,通過比較更新前後的綁定值,忽略不必要的模板更新 4.componentUpdate :被綁定的元素所在模板完成一次更新更新週期的時候調用 5.unbind: 只調用一次,指令月元素解綁的時候調用

17. Vue.filter

場景:時間戳轉化成年月日這是一個公共方法,所以可以抽離成過濾器使用

Vue 開發必須知道的 36 個技巧


18.Vue.compile

場景:在 render 函數中編譯模板字符串。只在獨立構建時有效

Vue 開發必須知道的 36 個技巧


19.Vue.version

場景:有些開發插件需要針對不同 vue 版本做兼容,所以就會用到 Vue.version 用法:Vue.version()可以獲取 vue 版本

Vue 開發必須知道的 36 個技巧


20.Vue.set()

場景:當你利用索引直接設置一個數組項時或你修改數組的長度時,由於 Object.defineprototype()方法限制,數據不響應式更新 不過vue.3.x 將利用 proxy 這個問題將得到解決 解決方案:

Vue 開發必須知道的 36 個技巧


21.Vue.config.keyCodes

場景:自定義按鍵修飾符別名

Vue 開發必須知道的 36 個技巧


22.Vue.config.performance

場景:監聽性能

<code>Vue.config.performance = true/<code>

只適用於開發模式和支持 performance.mark API 的瀏覽器上

23.Vue.config.errorHandler

1.場景:指定組件的渲染和觀察期間未捕獲錯誤的處理函數 2.規則: 從 2.2.0 起,這個鉤子也會捕獲組件生命週期鉤子裡的錯誤。同樣的,當這個鉤子是 undefined 時,被捕獲的錯誤會通過 console.error 輸出而避免應用崩潰 從 2.4.0 起,這個鉤子也會捕獲 Vue 自定義事件處理函數內部的錯誤了 從 2.6.0 起,這個鉤子也會捕獲 v-on DOM 監聽器內部拋出的錯誤。另外,如果任何被覆蓋的鉤子或處理函數返回一個 Promise 鏈 (例如 async 函數),則來自其 Promise 鏈的錯誤也會被處理 3.使用

<code>Vue.config.errorHandler = function (err, vm, info) {
// handle error
// `info` 是 Vue 特定的錯誤信息,比如錯誤所在的生命週期鉤子
// 只在 2.2.0+ 可用
}/<code>

24.Vue.config.warnHandler

2.4.0 新增 1.場景:為 Vue 的運行時警告賦予一個自定義處理函數,只會在開發者環境下生效 2.用法:

<code>Vue.config.warnHandler = function (msg, vm, trace) {
// `trace` 是組件的繼承關係追蹤
}/<code>

25.v-pre

場景:vue 是響應式系統,但是有些靜態的標籤不需要多次編譯,這樣可以節省性能

Vue 開發必須知道的 36 個技巧


26.v-cloak

場景:在網速慢的情況下,在使用vue綁定數據的時候,渲染頁面時會出現變量閃爍 用法:這個指令保持在元素上直到關聯實例結束編譯。和 CSS 規則如 [v-cloak] { display: none } 一起用時,這個指令可以隱藏未編譯的 Mustache 標籤直到實例準備完畢

Vue 開發必須知道的 36 個技巧

這樣就可以解決閃爍,但是會出現白屏,這樣可以結合骨架屏使用

27.v-once

場景:有些 template 中的靜態 dom 沒有改變,這時就只需要渲染一次,可以降低性能開銷

<code> 這時只需要加載一次的標籤/<code>

v-once 和 v-pre 的區別: v-once只渲染一次;v-pre不編譯,原樣輸出

28.事件修飾符

<code>.stop:阻止冒泡
.prevent:阻止默認行為
.self:僅綁定元素自身觸發
.once: 2.1.4 新增,只觸發一次
.passive: 2.3.0 新增,滾動事件的默認行為 (即滾動行為) 將會立即觸發,不能和.prevent 一起使用/<code>

29.按鍵修飾符和按鍵碼

場景:有的時候需要監聽鍵盤的行為,如按下 enter 去查詢接口等

<code>// 對應鍵盤上的關鍵字
.enter
.tab
.delete (捕獲“刪除”和“退格”鍵)
.esc
.space
.up
.down
.left
.right/<code>

30.Vue-router

場景:Vue-router 是官方提供的路由插件

30.1 緩存和動畫

1.路由是使用官方組件 vue-router,使用方法相信大家非常熟悉; 2.這裡我就敘述下路由的緩存和動畫; 3.可以用exclude(除了)或者include(包括),2.1.0 新增來坐判斷

Vue 開發必須知道的 36 個技巧

注:匹配首先檢查組件自身的 name 選項,如果 name 選項不可用,則匹配它的局部註冊名稱 (父組件 components 選項的鍵值)。匿名組件不能被匹配 4.用 v-if 做判斷,組件會重新渲染,但是不用一一列舉組件 name

30.2 全局路由鉤子

1.router.beforeEach

Vue 開發必須知道的 36 個技巧


2.router.beforeResolve (v 2.5.0+) 和beforeEach類似,區別是在導航被確認之前,同時在所有組件內守衛和異步路由組件被解析之後,解析守衛就被調用 即在 beforeEach之後調用

3.router.afterEach 全局後置鉤子 在所有路由跳轉結束的時候調用 這些鉤子不會接受 next 函數也不會改變導航本身

30.3 組件路由鉤子

1.beforeRouteEnter 在渲染該組件的對應路由被確認前調用,用法和參數與router.beforeEach類似,next需要被主動調用 此時組件實例還未被創建,不能訪問this 可以通過傳一個回調給 next來訪問組件實例。在導航被確認的時候執行回調,並且把組件實例作為回調方法的參數

Vue 開發必須知道的 36 個技巧


2.beforeRouteUpdate (v 2.2+) 在當前路由改變,並且該組件被複用時調用,可以通過this訪問實例, next需要被主動調用,不能傳回調

3.beforeRouteLeave 導航離開該組件的對應路由時調用,可以訪問組件實例 this,next需要被主動調用,不能傳回調

30.4 路由模式

設置 mode 屬性:hash或 history

30.5 Vue.$router

<code>this.$router.push():跳轉到不同的url,但這個方法迴向history棧添加一個記錄,點擊後退會返回到上一個頁面
this.$router.replace():不會有記錄
this.$router.go(n):n可為正數可為負數。正數返回上一個頁面,類似 window.history.go(n)/<code>

30.6 Vue.$route

表示當前跳轉的路由對象,屬性有: name:路由名稱 path:路徑 query:傳參接收值 params:傳參接收值 fullPath:完成解析後的 URL,包含查詢參數和 hash 的完整路徑 matched:路由記錄副本 redirectedFrom:如果存在重定向,即為重定向來源的路由的名字

<code>this.$route.params.id:獲取通過 params 或/:id傳參的參數
this.$route.query.id:獲取通過 query 傳參的參數/<code>

30.7 router-view 的 key

場景:由於 Vue 會複用相同組件, 即 /page/1 => /page/2 或者 /page?id=1 => /page?id=2 這類鏈接跳轉時, 將不在執行created, mounted之類的鉤子

<code><router-view>/<code>

這樣組件的 created 和 mounted 就都會執行

31.Object.freeze

場景:一個長列表數據,一般不會更改,但是vue會做getter和setter的轉換 用法:是ES5新增的特性,可以凍結一個對象,防止對象被修改 支持:vue 1.0.18+對其提供了支持,對於data或vuex裡使用freeze凍結了的對象,vue不會做getter和setter的轉換 注意:凍結只是凍結裡面的單個屬性,引用地址還是可以更改

Vue 開發必須知道的 36 個技巧


32.調試 template

場景:在Vue開發過程中, 經常會遇到template模板渲染時JavaScript變量出錯的問題, 此時也許你會通過console.log來進行調試 這時可以在開發環境掛載一個 log 函數

Vue 開發必須知道的 36 個技巧


33.vue-loader 小技巧

33.1 preserveWhitespace

場景:開發 vue 代碼一般會有空格,這個時候打包壓縮如果不去掉空格會加大包的體積 配置preserveWhitespace可以減小包的體積

Vue 開發必須知道的 36 個技巧


33.2 transformToRequire

場景:以前在寫 Vue 的時候經常會寫到這樣的代碼:把圖片提前 require 傳給一個變量再傳給組件

Vue 開發必須知道的 36 個技巧


現在:通過配置 transformToRequire 後,就可以直接配置,這樣vue-loader會把對應的屬性自動 require 之後傳給組件

Vue 開發必須知道的 36 個技巧


Vue 開發必須知道的 36 個技巧

34.為路徑設置別名

1.場景:在開發過程中,我們經常需要引入各種文件,如圖片、CSS、JS等,為了避免寫很長的相對路徑(../),我們可以為不同的目錄配置一個別名

2.vue-cli 2.x 配置

Vue 開發必須知道的 36 個技巧


3.vue-cli 3.x 配置

Vue 開發必須知道的 36 個技巧


35.img 加載失敗

場景:有些時候後臺返回圖片地址不一定能打開,所以這個時候應該加一張默認圖片

Vue 開發必須知道的 36 個技巧


36.css

36.1 局部樣式

1.Vue中style標籤的scoped屬性表示它的樣式只作用於當前模塊,是樣式私有化.

2.渲染的規則/原理: 給HTML的DOM節點添加一個 不重複的data屬性 來表示 唯一性 在對應的 CSS選擇器 末尾添加一個當前組件的 data屬性選擇器來私有化樣式,如:.demo[data-v-2311c06a]{} 如果引入 less 或 sass 只會在最後一個元素上設置

Vue 開發必須知道的 36 個技巧

36.2 deep 屬性

Vue 開發必須知道的 36 個技巧


分享到:


相關文章: