成人免费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-20 11:41:56

Windows 11硬盤空間占用微軟

2021-09-27 14:33:01

Windows 11Windows微軟

2022-01-05 22:41:47

PintaPinta 2.0開源

2021-09-21 10:51:42

iOS蘋果系統
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕精品一区二区三区精品 | 成人精品在线视频 | 亚洲 成人 av| 日韩精品一区二区三区视频播放 | 91视频久久 | 日韩中文字幕一区 | 色婷婷一区二区三区四区 | 中文字幕亚洲精品在线观看 | 一区二区伦理电影 | 欧日韩在线观看 | 最近日韩中文字幕 | 日日综合| 欧美极品视频在线观看 | 性欧美xxxx| 午夜视频一区 | 中日字幕大片在线播放 | 午夜av电影| 看一级毛片| 成人永久免费 | 毛片网在线观看 | 精品美女久久久久久免费 | www久久久| 热久久性 | 亚洲狠狠 | 久久久精品久久 | 久久精品亚洲精品国产欧美kt∨ | 欧美日韩一二三区 | 国精日本亚洲欧州国产中文久久 | 一级毛片在线播放 | 久久九精品 | 亚洲美女一区二区三区 | 久久在线视频 | www亚洲免费国内精品 | 国产一级片一区二区 | 成人一区二区视频 | 在线观看免费av网站 | 久久的色 | 欧美阿v | 91精品国产91久久久久久吃药 | 国产精产国品一二三产区视频 | 日韩一二区 |