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

Vue3 用組合編寫更好的代碼:靈活的參數(2/5)

開發 前端
本節,介紹一種模式,可以讓我即可以使用 ref,又可以不使用,從而讓組件更具有靈活性。

在使用 vue 組合時,有時候想用 ref,有時候又不想使用。本節,介紹一種模式,可以讓我即可以使用 ref,又可以不使用,從而讓組件更具有靈活性。

使用ref和unref獲得更靈活的參數

幾乎所有可組合對象都需要某種類型的參數作為輸入。通常,這是一個響應式 ref。它也可以是一個原始的Javascript類型,比如字符串、數字或對象。

但是我們想要編寫更加靈活和可重用的組合,所以我們不僅要接收 ref 類型的參數也可以接收原始類型參數,然后我們將參數轉換為我們需要參數。如下所示:

// 傳遞一個 ref
const countRef = ref(2);
useCount(countRef);
// 或者直接一個數字
const countRef = useRef(2);

VueUse 中的 useTitle 也是采用這種模式。

當我們傳入一個 ref 時,網頁標題就可以通過 .value 的方式來動態更改。

const title = ref('This is the title');
useTitle(title);
title.value = 'New title please';

如果傳入的是一個字符串,useTitle內部會創建一個 ref,值為我們所傳入的字符,最后返回一個 ref 變量,然后 .value 的方式來動態更改。

const title = useTitle('This is the title');
title.value = 'New title please';

在組合中實現一個靈活的參數

為了讓靈活的參數模式能工作,我們需要對得到的參數使用ref函數或unref函數。

export default useMyComposable(input) {
const ref = ref(input);
}
export default useMyComposable(input) {
const rawValue = unref(input);
}

ref 函數將為我們創建一個新的ref。但如果我們傳給它一個ref,它只是把這個ref返回給我們。

// 創建一個 ref
const myRef = ref(0);
// 結果是相等的
assert(myRef === ref(myRef));

unref函數的工作原理是一樣的,但是它要么解開一個ref,要么把我們的原始值還給我們。

const value = unref(myRef);
// 結果是相等的
assert(value === unref(value));

讓我們看看VueUse中的一些組合是如何實現這個模式的。VueUse是Vue 3的一個開源組合集合,編寫得非常好。它是學習如何編寫可組合代碼的一個很好的資源。

useTitle

回到useTitle,這個我們已經很熟悉它。

這種可組合的模式可以讓我們傳入一個字符串或一個字符串的 ref。它并不關心我們提供的是哪一個。

// Pass in a string
const titleRef = useTitle('Initial title');
// Pass in a ref of a string
const titleRef = ref('Initial title');
useTitle(titleRef);

在源代碼中,可以看到,在我們對選項對象進行解構之后,我們就創建了title ref。這里使用了ref函數,它允許我們使用一個ref或一個字符串來創建 title 的 ref。

// ...
const title = ref(newTitle ?? document?.title ?? null)
// ...

這里的意思是先取 newTitle 作為初始化值,如果沒有在取 document?.title,還是沒有就取 null

對于TypeScript 使用者來說,這里有一些趣事需要注意。

這里使用的newTitle變量的類型是MaybeRef<string>。下面是這個類型的定義:

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

這個類型定義意味著 MaybeRef<string> 類型既可以是一個字符串,也可以是一個Ref<string>,也就是一個里面有一個字符串值的Ref

我們接著看下一個組合也是使用這種類型來實現這種模式。

useCssVar

useCssVar 組合允許我們抓取一個CSS變量的值并在我們的應用程序中使用它。

const backgroundColor = useCssVar('--background-color');

但與useTitle不同的是,這里我們需要字符串值,這樣我們就可以在DOM中查找CSS變量。使用unref函數,這個可組合的函數可以同時處理傳入的引用和字符串。

// Using a string
const backgroundColor = useCssVar('--background-color');
// Using a ref
const cssVarRef = ref('--background-color');
const backgroundColor = useCssVar(cssVarRef);

看一下源代碼,我們可以看到它使用unref函數來完成這個任務。實際上,它使用了一個輔助函數,叫做unrefElement,以確保我們得到的是一個DOM元素,而不只是一個Vue實例。

如果想進一步探索它,VueUse中的大多數組合都實現了這種模式。所以,選擇一個感興趣的,然后深入到代碼中去吧。

總結

我們剛剛花了一些時間學習了這個系列的第二個模式,在這個模式中,我們可以通過在我們的可組合程序中巧妙地使用 ref 和 unref 來更靈活地使用參數。無論你碰巧有一個ref還是只有Javascript的原始值,可合成的東西仍然可以工作。它能適應你的使用方式!

我們還看了VueUse庫如何在 useTitle 和 useCssVar 組合中實現這種模式。useTitle 組合使用 ref 函數,而 useCssVar 使用 unref 函數,這樣我們就可以看到兩種變化的作用。

在下一篇文章中,我們將介紹另一種模式,通過使返回值動態化來改進它們。我們將學習如何根據需要,返回一個單一的值或一個對象。

// Returns a single value
const isDark = useDark();
// Returns an object of values
const {
counter,
pause,
resume,
} = useInterval(1000, { controls: true });

這種模式可以使你的可組合性在使用上簡單得多,特別是當你在大多數時候只需要一個單一的值時。

責任編輯:姜華 來源: 今日頭條
相關推薦

2022-07-08 08:52:25

Vue3組合動態返回

2022-07-11 10:32:35

Vue3await響應式

2020-05-08 19:52:31

Reactreact.js前端

2021-03-17 08:00:59

JS語言Javascript

2022-06-13 08:39:21

Vue3API

2014-04-21 10:14:52

PromisesJavaScript

2023-10-10 08:00:00

2021-01-15 05:16:37

Vue3開源代碼量

2022-06-21 12:09:18

Vue差異

2024-08-12 08:33:05

2021-12-02 05:50:35

Vue3 插件Vue應用

2021-12-01 08:11:44

Vue3 插件Vue應用

2021-05-27 10:36:34

ProvideInjectVue3

2021-11-30 08:19:43

Vue3 插件Vue應用

2021-12-08 09:09:33

Vue 3 Computed Vue2

2023-11-28 09:03:59

Vue.jsJavaScript

2020-11-12 08:32:14

Vue3模板優化

2020-03-25 18:23:07

Vue2Vue3組件

2022-07-18 10:43:12

項目TienChinJava

2021-03-22 10:05:25

開源技術 項目
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: www.v888av.com | 免费一级毛片 | 成人欧美一区二区 | 国产精品毛片一区二区在线看 | av黄色在线 | 亚洲成人黄色 | 精品久久久久久 | 97视频成人 | 黄色免费在线网址 | 91精品国产91久久久久久丝袜 | 亚洲欧美一区二区三区在线 | 一区二区中文字幕 | 欧洲一区二区在线 | caoporon| 91传媒在线观看 | 中文字幕一区二区三区在线乱码 | 婷婷丁香综合网 | 九九热在线免费视频 | 欧美日韩a| 欧美日韩在线视频观看 | 日韩精品免费一区二区在线观看 | 中文字幕乱码视频32 | 欧美日韩国产中文字幕 | 超碰97免费观看 | av在线二区 | 天天操天天摸天天爽 | 国产成人自拍av | 黄色av网站在线免费观看 | 91九色麻豆 | 国产精品美女www爽爽爽视频 | 亚洲福利在线视频 | 亚洲色图第一页 | 在线观看你懂的网站 | 国产精品久久久精品 | 精品免费在线 | 成人国产精品久久 | 天堂中文资源在线 | 亚洲一区二区三区高清 | 欧美白人做受xxxx视频 | 精品无码三级在线观看视频 | 99精品在线观看 |