最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

精讀《Vue3.0 Function API》

 更新時間:2020年05月20日 11:54:06   作者:黃子毅  
這篇文章主要介紹了精讀《Vue3.0 Function API》,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1. 引言

Vue 3.0 的發(fā)布引起了軒然大波,讓我們解讀下它的 function api RFC 詳細(xì)了解一下 Vue 團(tuán)隊(duì)是怎么想的吧!

首先官方回答了幾個最受關(guān)注的問題:

Vue 3.0 是否有 break change,就像 Python 3 / Angular 2 一樣?

不,100% 兼容 Vue 2.0,且暫未打算廢棄任何 API(未來也不)。之前有草案試圖這么做,但由于用戶反饋太猛,被撤回了。

Vue 3.0 的設(shè)計(jì)蓋棺定論了嗎?

沒有呀,這次精讀的稿子就是 RFC(Request For Comments),翻譯成中文就是 “意見征求稿”,還在征求大家意見中哦。

這 RFC 咋這么復(fù)雜?

RFC 是寫給貢獻(xiàn)者/維護(hù)者的,要考慮許多邊界情況與細(xì)節(jié),所以當(dāng)然會復(fù)雜很多嘍!當(dāng)然 Vue 本身使用起來還是很簡單的。

Vue 本身 Mutable + Template 就注定了是個用起來簡單(約定 + 自然),實(shí)現(xiàn)起來復(fù)雜(解析 + 雙綁)的框架。

這次改動很像在模仿 React,為啥不直接用 React?

首先 Template 機(jī)制還是沒變,其次模仿的是 Hooks 而不是 React 全部,如果你不喜歡這個改動,那你更不會喜歡用 React。
PS: 問這個問題的人,一定沒有同時理解 React 與 Vue,其實(shí)這兩個框架到現(xiàn)在差別蠻大的,后面精讀會詳細(xì)說明。
下面正式進(jìn)入 Vue 3.0 Function API 的介紹。

2. 概述

Vue 函數(shù)式基本 Demo:

<template>
 <div>
  <span>count is {{ count }}</span>
  <span>plusOne is {{ plusOne }}</span>
  <button @click="increment">count++</button>
 </div>
</template>

<script>
import { value, computed, watch, onMounted } from 'vue'

export default {
 setup() {
  // reactive state
  const count = value(0)
  // computed state
  const plusOne = computed(() => count.value + 1)
  // method
  const increment = () => { count.value++ }
  // watch
  watch(() => count.value * 2, val => {
   console.log(`count * 2 is ${val}`)
  })
  // lifecycle
  onMounted(() => {
   console.log(`mounted`)
  })
  // expose bindings on render context
  return {
   count,
   plusOne,
   increment
  }
 }
}
</script>

函數(shù)式風(fēng)格的入口是 setup 函數(shù),采用了函數(shù)式風(fēng)格后可以享受如下好處:類型自動推導(dǎo)、減少打包體積。

setup 函數(shù)返回值就是注入到頁面模版的變量。我們也可以返回一個函數(shù),通過使用 value 這個 API 產(chǎn)生屬性并修改:

import { value } from 'vue'

const MyComponent = {
 setup(props) {
  const msg = value('hello')
  const appendName = () => {
   msg.value = `hello ${props.name}`
  }
  return {
   msg,
   appendName
  }
 },
 template: `<div @click="appendName">{{ msg }}</div>`
}

要注意的是,value() 返回的是一個對象,通過 .value 才能訪問到其真實(shí)值。

為何 value() 返回的是 Wrappers 而非具體值呢?原因是 Vue 采用雙向綁定,只有對象形式訪問值才能保證訪問到的是最終值,這一點(diǎn)類似 React 的 useRef() API 的 .current 規(guī)則。

那既然所有 value() 返回的值都是 Wrapper,那直接給模版使用時要不要調(diào)用 .value 呢?答案是否定的,直接使用即可,模版會自動 Unwrapping:

const MyComponent = {
 setup() {
  return {
   count: value(0)
  }
 },
 template: `<button @click="count++">{{ count }}</button>`
}

接下來是 Hooks,下面是一個使用 Hooks 實(shí)現(xiàn)獲得鼠標(biāo)實(shí)時位置的例子:

function useMouse() {
 const x = value(0)
 const y = value(0)
 const update = e => {
  x.value = e.pageX
  y.value = e.pageY
 }
 onMounted(() => {
  window.addEventListener('mousemove', update)
 })
 onUnmounted(() => {
  window.removeEventListener('mousemove', update)
 })
 return { x, y }
}

// in consuming component
const Component = {
 setup() {
  const { x, y } = useMouse()
  const { z } = useOtherLogic()
  return { x, y, z }
 },
 template: `<div>{{ x }} {{ y }} {{ z }}</div>`
}

可以看到,useMouse 將所有與 “處理鼠標(biāo)位置” 相關(guān)的邏輯都封裝了進(jìn)去,乍一看與 React Hooks 很像,但是有兩個區(qū)別:

  1. useMouse 函數(shù)內(nèi)改變 x、y 后,不會重新觸發(fā) setup 執(zhí)行。
  2. x y 拿到的都是 Wrapper 而不是原始值,且這個值會動態(tài)變化。

另一個重要 API 就是 watch,它的作用類似 React Hooks 的 useEffect,但實(shí)現(xiàn)原理和調(diào)用時機(jī)其實(shí)完全不一樣。

watch 的目的是監(jiān)聽某些變量變化后執(zhí)行邏輯,比如當(dāng) id 變化后重新取數(shù):

const MyComponent = {
 props: {
  id: Number
 },
 setup(props) {
  const data = value(null)
  watch(() => props.id, async (id) => {
   data.value = await fetchData(id)
  })
 }
}

之所以要 watch,因?yàn)樵?Vue 中,setup 函數(shù)僅執(zhí)行一次,所以不像 React Function Component,每次組件 props 變化都會重新執(zhí)行,因此無論是在變量、props 變化時如果想做一些事情,都需要包裹在 watch 中。

后面還有 unwatching、生命周期函數(shù)、依賴注入,都是一些語法定義,感興趣可以繼續(xù)閱讀原文,筆者就不贅述了。

3. 精讀

對于 Vue 3.0 的 Function API + Hooks 與 React Function Component + Hooks,筆者做一些對比。

Vue 與 React 邏輯結(jié)構(gòu)

React Function Component 與 Hooks,雖然在實(shí)現(xiàn)原理上,與 Vue3.0 存在 Immutable 與 Mutable、JSX 與 Template 的區(qū)別,但邏輯理解上有著相通之處。

const MyComponent = {
 setup(props) {
  const x = value(0)

  const setXRandom = () => {
   x.value = Math.random()
  }

  return { x, setXRandom }
 },
 template: `
  <button @onClick="setXRandom"/>{{x}}</button>
 `
}

雖然在 Vue 中,setup 函數(shù)僅執(zhí)行一次,看上去與 React 函數(shù)完全不一樣(React 函數(shù)每次都執(zhí)行),但其實(shí) Vue 將渲染層(Template)與數(shù)據(jù)層(setup)分開了,而 React 合在了一起。

我們可以利用 React Hooks 將數(shù)據(jù)層與渲染層完全隔離:

// 類似 vue 的 setup 函數(shù)
function useMyComponentSetup(props) {
 const [x, setX] = useState(0)

 const setXRandom = useCallback(() => {
  setX(Math.random())
 }, [setX])

 return { x, setXRandom }
}

// 類似 vue 的 template 函數(shù)
function MyComponent(props: { name: String }) {
 const { x, setXRandom } = useMyComponentSetup(props)

 return (
  <button onClick={setXRandom}>{x}</button>
 )
}

這源于 JSX 與 Template 的根本區(qū)別。JSX 使模版與 JS 可以寫在一起,因此數(shù)據(jù)層與渲染層可以耦合在一起寫(也可以拆分),但 Vue 采取的 Template 思路使數(shù)據(jù)層強(qiáng)制分離了,這也使代碼分層更清晰了。
而實(shí)際上 Vue3.0 的 setup 函數(shù)也是可選的,再配合其支持的 TSX 功能,與 React 真的只有 Mutable 的區(qū)別了:

// 這是個 Vue 組件
const MyComponent = createComponent((props: { msg: string }) => {
 return () => h('div', props.msg)
})

我們很難評價 Template 與 JSX 的好壞,但為了更透徹的理解 Vue 與 React,需要拋開 JSX&Template,Mutable&Immutable 去看,其實(shí)去掉這兩個框架無關(guān)的技術(shù)選型,React@16 與 Vue@3 已經(jīng)非常像了。

Vue3.0 的精髓是學(xué)習(xí)了 React Hooks 概念,因此正好可以用 Hooks 在 React 中模擬 Vue 的 setup 函數(shù)。

關(guān)于這兩套技術(shù)選型,已經(jīng)是相對完美的組合,不建議在 JSX 中再實(shí)現(xiàn)類似 Mutable + JSX 的花樣來(因?yàn)橄矚g Mutable 可以用 Vue 呀):

  • Vue:Mutable + Template
  • React:Immutable + JSX

真正影響編碼習(xí)慣的就是 Mutable 與 Immutable,使用 Vue 就堅(jiān)定使用 Mutable,使用 React 就堅(jiān)定使用 Immutable,這樣能最大程度發(fā)揮兩套框架的價值。

Vue Hooks 與 React Hooks 的差異

先看 React Hooks 的簡單語法:

const [ count, setCount ] = useState(0)
const setToOne = () => setCount(1)

Vue Hooks 的簡單語法:

const count = value(0)
const setToOne = () => count.value = 1

之所以 React 返回的 count 是一個數(shù)字,是因?yàn)?Immutable 規(guī)則,而 Vue 返回的 count 是個對象,擁有 count.value 屬性,也是因?yàn)?Vue Mutable 規(guī)則導(dǎo)致,這使得 Vue 定義的所有變量都類似 React 中 useRef 定義變量,因此不存 React capture value 的特性。

關(guān)于 capture value 更多信息,可以閱讀精讀《Function VS Class 組件》 Capute Value 介紹

另外,對于 Hooks 的值變更機(jī)制也不同,我們看 Vue 的代碼:

const Component = {
 setup() {
  const { x, y } = useMouse()
  const { z } = useOtherLogic()
  return { x, y, z }
 },
 template: `<div>{{ x }} {{ y }} {{ z }}</div>`
}

由于 setup 函數(shù)僅執(zhí)行一次,怎么做到當(dāng) useMouse 導(dǎo)致 x、y 值變化時,可以在 setup 中拿到最新的值?

在 React 中,useMouse 如果修改了 x 的值,那么使用 useMouse 的函數(shù)就會被重新執(zhí)行,以此拿到最新的 x,而在 Vue 中,將 Hooks 與 Immutable 深度結(jié)合,通過包裝 x.value,使得當(dāng) x 變更時,引用保持不變,僅值發(fā)生了變化。所以 Vue 利用 Proxy 監(jiān)聽機(jī)制,可以做到 setup 函數(shù)不重新執(zhí)行,但 Template 重新渲染的效果。

這就是 Mmutable 的好處,Vue Hooks 中,不需要 useMemo useCallback useRef 等機(jī)制,僅需一個 value 函數(shù),直觀的 Mutable 修改,就可以實(shí)現(xiàn) React 中一套 Immutable 性能優(yōu)化后的效果,這個是 Mutable 的魅力所在。

Vue Hooks 的優(yōu)勢

筆者對 RFC 中對 Vue、React Hooks 的對比做一個延展解釋:
首先最大的不同:setup 僅執(zhí)行一遍,而 React Function Component 每次渲染都會執(zhí)行。

Vue 的代碼使用更符合 JS 直覺。

這句話直截了當(dāng)戳中了 JS 軟肋,JS 并非是針對 Immutable 設(shè)計(jì)的語言,所以 Mutable 寫法非常自然,而 Immutable 的寫法就比較別扭。

當(dāng) Hooks 要更新值時,Vue 只要用等于號賦值即可,而 React Hooks 需要調(diào)用賦值函數(shù),當(dāng)對象類型復(fù)雜時,還需借助第三方庫才能保證進(jìn)行了正確的 Immutable 更新。

對 Hooks 使用順序無要求,而且可以放在條件語句里。

對 React Hooks 而言,調(diào)用必須放在最前面,而且不能被包含在條件語句里,這是因?yàn)?React Hooks 采用下標(biāo)方式尋找狀態(tài),一旦位置不對或者 Hooks 放在了條件中,就無法正確找到對應(yīng)位置的值。
而 Vue Function API 中的 Hooks 可以放在任意位置、任意命名、被條件語句任意包裹的,因?yàn)槠洳⒉粫|發(fā) setup 的更新,只在需要的時候更新自己的引用值即可,而 Template 的重渲染則完全繼承 Vue 2.0 的依賴收集機(jī)制,它不管值來自哪里,只要用到的值變了,就可以重新渲染了。

不會再每次渲染重復(fù)調(diào)用,減少 GC 壓力。

這確實(shí)是 React Hooks 的一個問題,所有 Hooks 都在渲染閉包中執(zhí)行,每次重渲染都有一定性能壓力,而且頻繁的渲染會帶來許多閉包,雖然可以依賴 GC 機(jī)制回收,但會給 GC 帶來不小的壓力。

而 Vue Hooks 只有一個引用,所以存儲的內(nèi)容就非常精簡,也就是占用內(nèi)存小,而且當(dāng)值變化時,也不會重新觸發(fā) setup 的執(zhí)行,所以確實(shí)不會造成 GC 壓力。

必須要總包裹 useCallback 函數(shù)確保不讓子元素頻繁重渲染。

React Hooks 有一個問題,就是完全依賴 Immutable 屬性。而在 Function Component 內(nèi)部創(chuàng)建函數(shù)時,每次都會創(chuàng)建一個全新的對象,這個對象如果傳給子組件,必然導(dǎo)致子組件無法做性能優(yōu)化。 因此 React 采取了 useCallback 作為優(yōu)化方案:

const fn = useCallback(() => /* .. */, [])

只有當(dāng)?shù)诙€依賴參數(shù)變化時才返回新引用。但第二個依賴參數(shù)需要 lint 工具確保依賴總是正確的(關(guān)于為何要對依賴誠實(shí),感興趣可以移步 精讀《Function Component 入門》 - 永遠(yuǎn)對依賴誠實(shí))。

回到 Vue 3.0,由于 setup 僅執(zhí)行一次,因此函數(shù)本身只會創(chuàng)建一次,不存在多實(shí)例問題,不需要 useCallback 的概念,更不需要使用lint 插件 保證依賴書寫正確,這對開發(fā)者是實(shí)實(shí)在在的友好。

不需要使用 useEffect useMemo 等進(jìn)行性能優(yōu)化,所有性能優(yōu)化都是自動的。

這也是實(shí)在話,畢竟 Mutable + 依賴自動收集就可以做到最小粒度的精確更新,根本不會觸發(fā)不必要的 Rerender,因此 useMemo 這個概念也不需要了。

而 useEffect 也需要傳遞第二個參數(shù) “依賴項(xiàng)”,在 Vue 中根本不需要傳遞 “依賴項(xiàng)”,所以也不會存在用戶不小心傳錯的問題,更不需要像 React 寫一個 lint 插件保證依賴的正確性。(這也是筆者想對 React Hooks 吐槽的點(diǎn),React 團(tuán)隊(duì)如何保障每個人都安裝了 lint?就算裝了 lint,如果 IDE 有 BUG,導(dǎo)致沒有生效,隨時可能寫出依賴不正確的 “危險代碼”,造成比如死循環(huán)等嚴(yán)重后果)

4. 總結(jié)

通過對比 Vue Hooks 與 React Hooks 可以發(fā)現(xiàn),Vue 3.0 將 Mutable 特性完美與 Hooks 結(jié)合,規(guī)避了一些 React Hooks 的硬傷。所以我們可以說 Vue 借鑒了 React Hooks 的思想,但創(chuàng)造出來的確實(shí)一個更精美的藝術(shù)品。
但 React Hooks 遵循的 Immutable 也有好的一面,就是每次渲染中狀態(tài)被穩(wěn)定的固化下來了,不用擔(dān)心狀態(tài)突然變更帶來的影響(其實(shí)反而要注意狀態(tài)用不變更帶來的影響),對于數(shù)據(jù)記錄、程序運(yùn)行的穩(wěn)定性都有較高的可預(yù)期性。
最后,對于喜歡 Mutable 的開發(fā)者,Vue 3.0 是你的最佳選擇,基于 React + Mutable 搞的一些小輪子做到頂級可能還不如 Vue 3.0。對于 React 開發(fā)者來說,堅(jiān)持你們的 Immutable 信仰吧,Vue 3.0 已經(jīng)將 Mutable 發(fā)揮到極致,只有將 React Immutable 特性發(fā)揮到極致才能發(fā)揮 React 的最大價值。

討論地址是:精讀《Vue3.0 Function API》 · Issue #173 · dt-fe/weekly

到此這篇關(guān)于精讀《Vue3.0 Function API》的文章就介紹到這了,更多相關(guān)Vue3.0 Function API內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue transition組件及常用屬性

    vue transition組件及常用屬性

    在使用Vue過渡動畫時,注意選擇器優(yōu)先級,謹(jǐn)慎合并樣式,Vue2中關(guān)于顯示隱藏的類名有v-enter、v-leave以及v-enter-active、v-leave-active等,這些可以用來定義動畫的持續(xù)時間和樣式,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • Vue+elementUI導(dǎo)出word打印方式

    Vue+elementUI導(dǎo)出word打印方式

    這篇文章主要介紹了Vue+elementUI導(dǎo)出word打印方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • vue中表格設(shè)置某列樣式、不顯示表頭問題

    vue中表格設(shè)置某列樣式、不顯示表頭問題

    這篇文章主要介紹了vue中表格設(shè)置某列樣式、不顯示表頭問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • vue中自定義指令directive的詳細(xì)指南

    vue中自定義指令directive的詳細(xì)指南

    這篇文章主要給大家介紹了關(guān)于vue中自定義指令directive的相關(guān)資料,自定義指令解決的問題或者說使用場景是對普通 DOM 元素進(jìn)行底層操作,所以我們不能盲目的胡亂的使用自定義指令,需要的朋友可以參考下
    2021-09-09
  • vue props傳值失敗 輸出undefined的解決方法

    vue props傳值失敗 輸出undefined的解決方法

    今天小編就為大家分享一篇vue props傳值失敗 輸出undefined的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • WebStorm無法正確識別Vue3組合式API的解決方案

    WebStorm無法正確識別Vue3組合式API的解決方案

    這篇文章主要介紹了WebStorm無法正確識別Vue3組合式API的解決方案,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下
    2021-02-02
  • Vue3中reactive函數(shù)toRef函數(shù)ref函數(shù)簡介

    Vue3中reactive函數(shù)toRef函數(shù)ref函數(shù)簡介

    這篇文章主要介紹了Vue3中的三種函數(shù),分別對reactive函數(shù)toRef函數(shù)以及ref函數(shù)原理及使用作了簡單介紹,有需要的朋友可以借鑒參考下
    2021-09-09
  • vue+element下日期組件momentjs轉(zhuǎn)換賦值問題解決

    vue+element下日期組件momentjs轉(zhuǎn)換賦值問題解決

    這篇文章主要介紹了vue+element下日期組件momentjs轉(zhuǎn)換賦值問題,記錄下使用momentjs轉(zhuǎn)換日期字符串賦值給element的日期組件報錯問題,需要的朋友可以參考下
    2024-02-02
  • 深入探索Vue3.x中的七大高級用法

    深入探索Vue3.x中的七大高級用法

    Vue3.x 自發(fā)布以來,憑借其性能的顯著提升和更加靈活的組合式 API,已經(jīng)成為了現(xiàn)代前端開發(fā)的重要工具之一,除了基本用法外,Vue3.x 還提供了許多高級功能,本文將和大家一起深入探索Vue3.x中的七大高級用法,需要的朋友可以參考下
    2024-03-03
  • vue使用Highcharts實(shí)現(xiàn)3D餅圖

    vue使用Highcharts實(shí)現(xiàn)3D餅圖

    這篇文章主要為大家詳細(xì)介紹了vue使用Highcharts實(shí)現(xiàn)3D餅圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評論

大余县| 诏安县| 冷水江市| 静海县| 阿合奇县| 陈巴尔虎旗| 广宁县| 白河县| 泌阳县| 项城市| 华容县| 汤阴县| 改则县| 平果县| 监利县| 陕西省| 宣城市| 阿鲁科尔沁旗| 绵竹市| 南江县| 得荣县| 商南县| 永兴县| 广州市| 崇明县| 玉屏| 连南| 达拉特旗| 二连浩特市| 密山市| 运城市| 会泽县| 天长市| 景洪市| 丹巴县| 诏安县| 边坝县| 玉环县| 霍林郭勒市| 宜良县| 搜索|