天天看點

vue3的新特性

不知不覺的VUE3.0釋出已經很久了。

在B站上看了教學視屏 瞬間勾起的我濃厚的學習興趣。

https://www.bilibili.com/video/BV1yK4y1M7Fz?p=8&spm_id_from=pageDriver

Vue 3全新的Web開發建構工具Vite

Vite是Vue的作者尤雨溪開發的Web開發建構工具,它是一個基于浏覽器原生ES子產品導入的開發伺服器,在開發環境下,利用浏覽器去解析import,在伺服器端按需編譯傳回,完全跳過了打包這個概念,伺服器随啟随用。同時不僅對Vue檔案提供了支援,還支援熱更新,而且熱更新的速度不會随着子產品增多而變慢。在生産環境下使用Rollup打包。

Vite具有以下特點:

快速的冷啟動即時熱子產品更新(HMR,Hot Module Replacement)真正按需編譯Vite是在推出Vue 3的時候開發的,目前僅支援Vue 3.x,這意味着與Vue 3不相容的庫也不能與Vite一起使用。

與Vue CLI類似,Vite也提供用npm或者yarn來生成項目結構的方式。選擇一個目錄,打開指令提示視窗,依次執行下面的指令建構腳手架項目,并啟動項目。

如果使用yarn,則依次執行下面的指令:

由于Vite使用了浏覽器原生的ES子產品導入功能,但IE 11并不支援ES的子產品導入,是以基于Vite開發項目,浏覽器不能使用IE11,其他主流的浏覽器均支援ES子產品的子產品功能。

我建立了一個項目 結構如下

vue3的新特性

可以發現,Vite生成的腳手架項目的目錄結構與Vue CLI生成的項目目錄結構很類似,确實是這樣的,而且開發方式也基本相同。不過Vite項目的預設配置檔案是vite.config.js,而不是vue.config.js。

package.json檔案的内容如下所示:

 這裡與Vue CLI不同地方在這裡:

"dev": "vite",

"build": "vite build"

體驗了一波非常棒,基本上都是秒啟動,改動代碼以後也是秒更新。

vue3的新特性

 Vue 3采用Proxy資料劫持

Vue 2.x 利用 Object.defineProperty(),并且把内部解耦為 Observer, Dep, 并使用 Watcher 相連

Vue 在 3.x 版本之後改用 Proxy 進行實作

那麼他們之前有什麼優缺點呢?

1、Object.defineProperty() 的問題主要有三個:

不能監聽數組的變化

必須周遊對象的每個屬性

必須深層周遊嵌套的對象

數組的這些方法是無法觸發set的:push, pop, shift, unshift,splice, sort, reverse.

Vue 把會修改原來數組的方法定義為變異方法 (mutation method)

非變異方法 (non-mutating method):例如 filter, concat, slice 等,它們都不會修改原始數組,而會傳回一個新的數組。

Vue 的做法是把這些方法重寫來實作數組的劫持。

使用 Object.defineProperty() 多數要配合 Object.keys() 和周遊,,于是多了一層嵌套

 必須深層周遊嵌套的對象

當一個對象為深層嵌套的時候,必須進行逐層周遊,直到把每個對象的每個屬性都調用 Object.defineProperty() 為止。 Vue 的源碼中這樣的邏輯----walk 方法.

2、Proxy:

Proxy 對象用于定義基本操作的自定義行為(如屬性查找,指派,枚舉,函數調用等)。

針對對象:針對整個對象,而不是對象的某個屬性

支援數組:不需要對數組的方法進行重載,省去了衆多 hack

嵌套支援: get 裡面遞歸調用 Proxy 并傳回

其他

針對對象

不需要對 keys 進行周遊。這解決Object.defineProperty() 的第二個問題.Proxy 是針對整個 obj 的。是以 obj 内部包含的所有的 key ,都可以走進 set。(省了一個 Object.keys() 的周遊)

另外 Reflect.get 和 Reflect.set 可以了解為類繼承裡的 super,即調用原來的方法

vue3的新特性

嵌套支援

Proxy 也是不支援嵌套的,這點和 Object.defineProperty() 是一樣的。是以也需要通過逐層周遊來解決。Proxy 的寫法是在 get 裡面遞歸調用 Proxy 并傳回

其它方面

    優勢:Proxy 的第二個參數可以有 13 種攔截方法,比 Object.defineProperty() 要更加豐富,Proxy 作為新标準受到浏覽器廠商的重點關注和性能優化,相比之下 Object.defineProperty() 是一個已有的老方法。

    劣勢:Proxy 的相容性不如 Object.defineProperty() (caniuse 的資料表明,QQ 浏覽器和百度浏覽器并不支援 Proxy,這對國内移動開發來說估計無法接受,但兩者都支援 Object.defineProperty()),不能使用 polyfill 來處理相容性

Vue3 的新特性(二) —— Composition-Api

Composition API : 一組低侵入式的、函數式的 API,它使我們能夠更靈活地「組合」元件的邏輯。

Composition API 的靈感來自于 React Hooks ,是比 mixin 更強大的存在。它可以提高代碼邏輯的可複用性,進而實作與模闆的無關性;同時函數式的程式設計使代碼的可壓縮性更強。另外,把 Reactivity 子產品獨立開來,意味着 Vue3.0 的響應式子產品可以與其他架構相組合。

vue3的新特性

 如上圖,在較大元件的編寫中, Composition-Api 可以把複雜元件的邏輯抽地更緊湊,而且可以将公共邏輯進行抽取。

reactive() 函數接收一個普通的對象,傳回出一個響應式對象。

在Vue2.x的版本中,我們隻需要在 data() 中定義一個資料就能将它變為響應式資料,在 Vue3.0 中,需要用 reactive 函數或者 ref 來建立響應式資料。

使用響應式對象

ref() 函數可以根據給定的值來建立一個響應式的資料對象,傳回值是一個對象,且隻包含一個 .value 屬性。

用 ref 建立響應式對象

ref 的注意事項

    在 setup() 函數内,由 ref() 建立的響應式資料傳回的是對象,是以需要用 .value 來通路;

    而在 setup() 函數外部則不需要 .value ,直接通路即可。

    可以在 reactive 對象中通路 ref() 函數建立的響應式資料。

    新的 ref() 會覆寫舊的 ref() 。

watchEffect() 會立即執行傳入的函數,并響應式偵聽其依賴,并在其依賴變更時重新運作該函數。

停止偵聽

watchEffect() 使用時傳回一個函數,當執行這個傳回的函數時,就停止偵聽

composition-api 中的 watch 和 Vue2.x 中是一樣的,watch 需要偵聽資料,并執行它的偵聽回調。預設情況下初次渲染不執行。

watch 與 watchEffect 的不同

watch 初次渲染不執行

watch 偵聽的更具體

watch 可以通路偵聽資料變化前後的值

watch 偵聽多個資料源

在偵聽多個資料源時,把參數以數組的形式給 watch

在學習 Composition-Api 之前,我們需要先了解一下 setup() 函數。 setup() 是 Vue3 中的新增内容。它為基于 Composition API 的新特性提供了統一的入口。

在Vue3中,定義 methods、watch、computed、data資料 等都放在了 setup() 函數中

注意:在 setup() 函數中通路不到Vue的 this 執行個體

setup()函數會在created()生命周期之前執行。

vue3的新特性

 setup() 函數的第一個參數是 props ,元件接收的 props 資料可以在 setup() 函數内通路到。

context 是 setup() 的第二個參數,它是一個上下文對象,可以通過 context 來通路Vue的執行個體 this 。