Slide 1

Slide 1 text

初探 Vue 3.0 Function API Kuro Hsu @ LINE TW v-tw meetup #003 2019/08/06

Slide 2

Slide 2 text

Kuro Hsu - Organizers of Vue.js Taiwan - https://kuro.tw - kurotanshi@gmail.com - @kurotanshi

Slide 3

Slide 3 text

社群現況

Slide 4

Slide 4 text

Vue.js Taiwan https://vue.tw

Slide 5

Slide 5 text

超過九成的報名者在⼗十秒內 完成報名

Slide 6

Slide 6 text

下次的活動... 規劃中 敬請期待

Slide 7

Slide 7 text

關於 Vue 3.0 的進展

Slide 8

Slide 8 text

好消息

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

壞消息

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

3.0 多了了哪些新特性

Slide 14

Slide 14 text

Vue 3.0 RFC https://github.com/vuejs/rfcs

Slide 15

Slide 15 text

• ⽬目標是更更⼩小、更更快 • 加強對 TypeScript 的⽀支援 • 加強 API 設計⼀一致性 • 提⾼高可維護性 • 開放更更多底層功能

Slide 16

Slide 16 text

• Object.defineProperty -> Proxy API • Virtual DOM 重構 • 增強編譯時的優化 • 更更多細節請參參閱尤⼤大在 VueConf 2019 的演講:
 https://docs.google.com/presentation/d/ 1giA0aF6b5kljg42NUYVTB5bMxxgAc2iRVPVDo2s TirI/edit

Slide 17

Slide 17 text

Class API • 為了了增強與 TypeScript 的⽀支援 • 與現有 API 的相容性差異異太⼤大 • 瀏覽器對原⽣生 Class API 的⽀支援還不夠完整 • 標準對 class fields, decorators 等提案還不穩定

Slide 18

Slide 18 text

Class API • 為了了增強與 TypeScript 的⽀支援 • 與現有 API 的相容性差異異太⼤大 • 瀏覽器對原⽣生 Class API 的⽀支援還不夠完整 • 標準對 class fields, decorators 等提案還不穩定 CANCELED

Slide 19

Slide 19 text

Vue 3.0 Function-based API

Slide 20

Slide 20 text

• ⼜又稱 composition functions • 以「組合代替繼承」來來實作元件的複⽤用 • 更更靈活的程式邏輯複⽤用 • 對 TypeScript 的類型推導⽀支援更更好 • Tree-shaking friendly、編譯後程式碼更更容易易被壓縮 Vue 3.0 Function-based API

Slide 21

Slide 21 text

對比過去其他做法

Slide 22

Slide 22 text

Mixins

Slide 23

Slide 23 text

Mixins • ❌ 可能造成 Namespace 的衝突 • ❌ 從 Mixins 引入的屬性難以追蹤來來源

Slide 24

Slide 24 text

HOC: Higher-order Components

Slide 25

Slide 25 text

HOC: Higher-order Components • ❌ Props 來來源不清晰 • ❌ Props namespace 衝突問題 • ❌ 多餘的元件實體造成性能浪費

Slide 26

Slide 26 text

Renderless Components

Slide 27

Slide 27 text

Renderless Components • ✅ 資料來來源清晰 • ✅ 無 namespace 衝突問題 • ❌ 多餘的元件實體造成性能浪費

Slide 28

Slide 28 text

Vue 3.0 Function- based API

Slide 29

Slide 29 text

• ✅ 資料來來源清晰 • ✅ 無 namespace 衝突問題 • ✅ 不會產⽣生多餘的元件實體 Vue 3.0 Function-based API

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

https://github.com/vuejs/vue-function-api

Slide 32

Slide 32 text

Install

Slide 33

Slide 33 text

setup ( ) • 將共⽤用邏輯放在 setup 函式 • 第⼀一個參參數是 props • setup( ) 內無法透過 this 存取⽬目前元件, 但可以透過第⼆二個 context 參參數取得對應 的屬性 • 最後透過 return 的物件來來與元件實體溝通

Slide 34

Slide 34 text

value( ) • value( ) 會為元件⽣生成⼀一個響應式 的屬性 (如同原本的 data) • 存取時透過 value( ) 的回傳 的 .value 屬性即可

Slide 35

Slide 35 text

state( ) • 未透過 value( ) 包裝的響應式物 件 • 意義上等同於 v2.x 的 Vue.observable( )

Slide 36

Slide 36 text

computed( ) • 與 v2.x computed 屬性的⾏行行爲、 作⽤用完全⼀一樣

Slide 37

Slide 37 text

watch( ) • 透過 watch 追蹤某個狀狀態的變化, 同時呼叫 callback function • 第⼀一個參參數是狀狀態來來源,第⼆二個則 是對應的 callback function

Slide 38

Slide 38 text

Lifecycle hooks • 除了了 beforeCreated 之外的 Lifecycle hook 都可以透過 onXXX 的形式來來對應 • 另外新增了了 onUnmounted

Slide 39

Slide 39 text

Provide / Inject • 與 v2.x 的 provide、 inject 作⽤用 完全⼀一樣。

Slide 40

Slide 40 text

Let’s Demo: Todo List

Slide 41

Slide 41 text

https://github.com/kurotanshi/vue-function-api-demo

Slide 42

Slide 42 text

⼤大家關⼼心的事...

Slide 43

Slide 43 text

轉換成本

Slide 44

Slide 44 text

No content

Slide 45

Slide 45 text

在社群 激戰 討論後, 更更新後的 RFC 已取消此策略略 來源: https://github.com/vuejs/rfcs/commit/6fe6f7be06dd5982be3c57e248fcd66cd55748e0

Slide 46

Slide 46 text

https://suspicious-mclean-0e54c3.netlify.com/

Slide 47

Slide 47 text

轉換成本 === 0

Slide 48

Slide 48 text

• 已知 2.x -> 3.x 不會有 Breaking Change,完全相容現有 API • 新版本更更多的是底層的改寫,對多數開發者來來說沒有明顯差距 • 就是需要回饋才設有 RFC,有意⾒見見歡迎⾄至 RFC 反應

Slide 49

Slide 49 text

⚠ 投資⼀一定有風險,開發前應詳閱公開說明書 ⚠

Slide 50

Slide 50 text

Thanks