成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

最新,Vue 改進了響應式 API 中 Getter 的用法!

開發 前端
將這些功能添加在 v3.3 和 v2.7 之間造成了差異——雖然理論上不再回向 v2.7 添加新的功能,但這些可能值得向后移植以確保 vue-demi? 和依賴于 vue-demi 的 VueUse 的行為一致性。

近日,Vue 改進了響應式 API 中 getter 的用法,主要包括:

  • 一個用于將不同來源(value / ref / getter)規范化為值的 API(通過引入 toValue())
  • 一個用于將不同來源(value / ref / getter)規范化為引用的 API(通過增強 toRef())
  • 引入 MaybeRef<T> 和 MaybeRefOrGetter<T> 類型

通常需要將狀態傳遞到組合式函數中并保持響應性。在大多數情況下,這意味著要將響應源轉換為 ref:

import { toRef } from 'vue'

const props = defineProps(/* ... */)

useFeature(toRef(props, 'foo'))

目前,toRef 僅用于從對象中“提取”單個屬性。這就有點不靈活,例如,如果想將嵌套屬性轉換為 ref:

useFeature(toRef(props.foo, 'bar'))

上面的代碼有兩個問題:

  • 調用 toRef 時 props.foo 可能不存在
  • 如果 props.foo 被交換到不同的對象,這將無法處理這種情況。

為了解決這個問題,可以使用 computed:

useFeature(computed(() => props.foo?.bar))

但是,在這里使用 computed? 并不是最佳選擇。在內部,computed? 創建一個單獨的 effect? 來緩存計算值。當 getter 只訪問屬性而不執行任何昂貴的計算時,這實際上是很大的開銷。

將非引用響應狀態傳遞到組合式函數的成本最低的方法就是用 getter? 包裝它(或“thunking”——即延遲實際值的訪問,直到調用 getter):

useFeature(() => props.foo?.bar)

VueUse 已經廣泛支持這種模式,這也有點類似于在 Solid 中看到的函數式 signals(信號)。

此外,這種模式在使用響應式 props 解構時會很常用:

const { foo } = defineProps<{ foo: string }>()

useFeature(() => foo)

引入 toValue()

在組合式函數中,其參數可以接受值或引用。這可以表示為:

type MaybeRef<T> = T | Ref<T>

為了也支持 getters,接受的類型將是:

type MaybeRefOrGetter<T> = MaybeRef<T> | (() => T)

目前提供的unref?將 MaybeRef<T>? 規范化為 T?。但是,不能讓 unref? 也解包 getter?,因為這將是一個破壞性的變化。可以在函數值上調用 unref 并期望返回該函數。這種情況比較少見,但仍然是無法破解的可能情況。

因此,引入一個新方法,toValue():

export function toValue<T>(source: MaybeRefOrGetter<T>): T {
return isFunction(source) ? source() : unref(source)
}

這就相當于 VueUse 的 [resolveUnref()](https://vueuse.org/shared/resolveUnref/)?。這里將其命名為 toValue()? 是因為它與 toRef() 相反:兩者代表兩個不同的規范化方向:

ref <- toRef() - ref/value/getter - toValue() -> value

增強 toRef()

當然也可能存在需要 ref? 的情況——不能傳遞 getter?。對于這種情況,仍然可以使用 computed?。但如前所述,computed? 對于只訪問屬性的簡單 getter 來說是一種矯枉過正。

可以向 toRef()? 添加新的重載,以便它現在可以接受 getters :

const ref = toRef(() => 123)
ref.value // 123

以這種方式創建的 ref? 是只讀的,只是在每次訪問 .value? 時調用 getter。

toRef() 現在應該被視為“將 value / ref / getter 規范化為 refs” 的 API:

// value -> Ref
toRef(1) // Ref<number>

// Ref -> Ref
toRef(ref(1)) // Ref<number>

// getter -> Ref
toRef(() => 1) // Ref<number>

這就相當于 VueUse 的 [resolveRef()](https://vueuse.org/shared/resolveRef/)。

現在仍然支持舊的 toRef(object, 'key')? 用法,但應該首選更靈活的 getter 語法:

toRef(() => object.key)

向后移植到 v2.7?

將這些功能添加在 v3.3 和 v2.7 之間造成了差異——雖然理論上不再回向 v2.7 添加新的功能,但這些可能值得向后移植以確保 vue-demi? 和依賴于 vue-demi 的 VueUse 的行為一致性。

如果向后移植到 2.7,VueUse 也可以用 toRef? 和 toValue? 來替換 resolveRef? 和 resolveUnref。

參考:https://github.com/vuejs/core/pull/7997

責任編輯:武曉燕 來源: 前端充電寶
相關推薦

2024-01-09 09:40:23

2021-03-09 22:29:46

Vue 響應式API

2017-08-30 17:10:43

前端JavascriptVue.js

2017-05-31 10:43:26

Windows Ser容器數據保護

2024-04-10 08:45:51

Vue 3Proxy對象監測數據

2020-06-09 11:35:30

Vue 3響應式前端

2019-07-01 13:34:22

vue系統數據

2021-01-22 11:47:27

Vue.js響應式代碼

2010-07-05 13:20:48

BoneCPBoneCP 0.6.Java連接池

2022-08-22 09:01:24

Vue響應式原則雙向數據綁定

2024-07-26 10:47:10

2021-05-19 14:25:19

前端開發技術

2015-06-08 13:19:11

JavaScriptgettersetter

2017-07-13 11:44:20

Web開發CSSPC

2013-10-22 15:48:35

2021-03-29 09:25:58

JWTSpringNimbus

2021-09-21 10:51:42

iOS蘋果系統

2023-06-02 16:28:01

2019-12-06 10:44:53

Vue 3.0響應式系統前端

2025-02-05 08:43:40

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美黄色一区 | 国产视频在线观看一区二区三区 | 91欧美| 国产一区二区三区在线 | 97久久精品午夜一区二区 | 成人免费视频网站在线观看 | 久久国产精品99久久久久久丝袜 | 亚洲精品一区二区在线观看 | av网址在线 | 成人看片在线观看 | 中文字幕av在线一二三区 | 国产日韩欧美一区二区 | www.日韩 | 国产精品一区二 | 国产精品久久久久久亚洲调教 | 午夜久久 | 成年人黄色免费视频 | 免费观看黄色片视频 | 亚洲免费视频一区 | 天堂中文资源在线 | 欧美日韩在线视频一区 | 97成人在线 | 欧美色综合一区二区三区 | 国产成人a亚洲精品 | 91麻豆蜜桃一区二区三区 | 夜夜摸天天操 | 九九视频网 | av黄色在线| 在线免费亚洲视频 | 成人在线观看免费爱爱 | 成人影视网 | 亚洲国产精品久久久久婷婷老年 | 国产欧美在线一区二区 | 国产精彩视频 | 日韩在线成人 | 91在线精品秘密一区二区 | 午夜精品网站 | 亚洲国产欧美一区 | 亚洲免费视频在线观看 | 亚洲国产精品一区 | 国产精品高清一区二区 |