一文搞懂Vue3中toRef和toRefs的區(qū)別
上面這段代碼中:
- 我們使用 reactive 創(chuàng)建了一個(gè)名為 info 的響應(yīng)式對(duì)象,包含 name 和 age 屬性。
- 然后使用 toRef 函數(shù)將 info 對(duì)象的 age 屬性轉(zhuǎn)換為一個(gè)獨(dú)立的 ref 對(duì)象。
- 接著定義了兩個(gè)方法 updateInfoObjAge 和 updateAge,分別用于更新 info 對(duì)象的 age 屬性和 age 引用的值。
從上面的代碼中,我們可以看到,age 屬性是使用 toRef 函數(shù)轉(zhuǎn)換的具有響應(yīng)式的 ref 屬性,當(dāng)我們更新時(shí),使用 reactive 定義的響應(yīng)式對(duì)象 info 中的 age 也會(huì)隨著更新。
<script setup> import { reactive } from 'vue'; let info = reactive({ name: 'Echo', age: 26, gender: 'Male', }) // 這樣解構(gòu)會(huì)丟失響應(yīng)式效果 let { name, age, gender } = info; </script>
下面,我們一起看看 toRef 和 toRefs 的用法:
1. toRef
- toRef 函數(shù)可以將一個(gè)響應(yīng)式對(duì)象的屬性轉(zhuǎn)換為一個(gè)獨(dú)立的 ref 對(duì)象。
- 返回的是一個(gè)指向源對(duì)象屬性的 ref 引用,任何對(duì)該引用的修改都會(huì)同步到源對(duì)象屬性上。
- 使用 toRef 時(shí)需要傳入源對(duì)象和屬性名作為參數(shù)。
下面我們一起看一段代碼:
<script setup> import { reactive, toRef } from 'vue'; let info = reactive({ name: 'Echo', age: 26, }) let age = toRef(info, 'age'); const updateInfoObjAge = () => { info.age++; } const updateAge = () => { age.value++; } </script> <template> <div id="app"> <p>info對(duì)象中的age:{{ info.age }}</p> <button @click="updateInfoObjAge">更新info對(duì)象中的 age</button> <br /> <p>使用toRef函數(shù)轉(zhuǎn)換后的age:{{ age }}</p> <button @click="updateAge">更新 age</button> </div> </template>
上面這段代碼中:
- 我們使用 reactive 創(chuàng)建了一個(gè)名為 info 的響應(yīng)式對(duì)象,包含 name 和 age 屬性。
- 然后使用 toRef 函數(shù)將 info 對(duì)象的 age 屬性轉(zhuǎn)換為一個(gè)獨(dú)立的 ref 對(duì)象。
- 接著定義了兩個(gè)方法 updateInfoObjAge 和 updateAge,分別用于更新 info 對(duì)象的 age 屬性和 age 引用的值。
從上面的代碼中,我們可以看到,age 屬性是使用 toRef 函數(shù)轉(zhuǎn)換的具有響應(yīng)式的 ref 屬性,當(dāng)我們更新時(shí),使用 reactive 定義的響應(yīng)式對(duì)象 info 中的 age 也會(huì)隨著更新。
而且,從開發(fā)工具中,我們也可以看到,age 屬性是一個(gè)具有 ref 響應(yīng)式的屬性。
2. toRefs
- toRefs 函數(shù)可以將一個(gè)響應(yīng)式對(duì)象轉(zhuǎn)換為一個(gè)普通的對(duì)象,該對(duì)象的每個(gè)屬性都是獨(dú)立的 ref 對(duì)象。
- 返回的對(duì)象可以進(jìn)行解構(gòu),每個(gè)屬性都可以像普通的 ref 對(duì)象一樣訪問和修改,而且會(huì)保持響應(yīng)式的關(guān)聯(lián)。
- toRefs 的使用場景主要是在將響應(yīng)式對(duì)象作為屬性傳遞給子組件時(shí),確保子組件可以正確地訪問和更新這些屬性。
下面我們一起看一段代碼:
<script setup> import { reactive, toRefs } from 'vue'; let info = reactive({ name: 'Echo', age: 26, gender: 'Male', }) let { name, age, gender } = toRefs(info); const update = () => { name.value = 'Julie'; age.value = 33; gender.value = 'Female'; } </script> <template> <div id="app"> <p>info對(duì)象中的name:{{ info.name }}</p> <p>info對(duì)象中的age:{{ info.age }}</p> <p>info對(duì)象中的gender:{{ info.gender }}</p> <br /> <p>解構(gòu)出來的name:{{ name }}</p> <p>解構(gòu)出來的age:{{ age }}</p> <p>解構(gòu)出來的gender:{{ gender }}</p> <button @click="update">更新數(shù)據(jù)</button> </div> </template>
上面這段代碼中:
- 首先,使用 reactive 函數(shù)創(chuàng)建了一個(gè)響應(yīng)式對(duì)象 info,包含了 name、age 和 gender 三個(gè)屬性,同時(shí)設(shè)置了初始值。
- 接著,使用 toRefs 函數(shù)將 info 對(duì)象轉(zhuǎn)換為多個(gè)獨(dú)立的響應(yīng)式引用對(duì)象。然后通過解構(gòu)賦值,把 name、age 和 gender 三個(gè)響應(yīng)式引用對(duì)象分別賦給了相應(yīng)的變量。
- 最后,添加了一個(gè)按鈕,點(diǎn)擊按鈕會(huì)觸發(fā) update 函數(shù),在 update 函數(shù)中,通過修改響應(yīng)式引用對(duì)象的 value 屬性來更新數(shù)據(jù)的值。
從開發(fā)工具中,我們可以看到,解構(gòu)出來的每個(gè)屬性,都是獨(dú)立的具有 ref 響應(yīng)式的屬性,因此,我們需要使用 .value 才能訪問和修改其值。
3. 相同點(diǎn)
- toRef 和 toRefs 都用于將響應(yīng)式對(duì)象的屬性轉(zhuǎn)換為 ref 對(duì)象。
- 轉(zhuǎn)換后的屬性仍然保持響應(yīng)式,對(duì)屬性的修改會(huì)反映到源對(duì)象上。
- 不管是使用 toRef 還是 toRefs 將響應(yīng)式對(duì)象轉(zhuǎn)成普通對(duì)象,在 script 中修改和訪問其值都需要通過 .value 進(jìn)行。
4. 不同點(diǎn)
- toRef 修改的是對(duì)象的某個(gè)屬性,生成一個(gè)單獨(dú)的 ref 對(duì)象。
- toRefs 修改的是整個(gè)對(duì)象,生成多個(gè)獨(dú)立的 ref 對(duì)象集合。
- toRefs 適用于在組件傳遞屬性或解構(gòu)時(shí)使用,更加方便靈活,而 toRef 更適合提取單個(gè)屬性進(jìn)行操作。
通過上面對(duì) toRef 和 toRefs 函數(shù)的了解,你們知道為什么需要 toRef 和 toRefs 了嗎?
總結(jié)起來就是:在不丟失響應(yīng)式的前提下,對(duì)響應(yīng)式對(duì)象數(shù)據(jù)進(jìn)行解構(gòu),這樣如果在 setup 中返回 toRefs(obj),或者 toRef(obj, 'xxx'),我們就可以在 template 中不使用 obj.xxx 來取值了。
以上就是一文搞懂Vue3中toRef和toRefs的區(qū)別的詳細(xì)內(nèi)容,更多關(guān)于Vue3 toRef和toRefs區(qū)別的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
el-tree樹狀控件如何定位到選中的節(jié)點(diǎn)的位置
這篇文章主要介紹了el-tree樹狀控件如何定位到選中的節(jié)點(diǎn)的位置,本文通過示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-08-08Vue+Electron打包桌面應(yīng)用(超詳細(xì)完整教程)
這篇文章主要介紹了Vue+Electron打包桌面應(yīng)用超詳細(xì)完整教程,在這大家要記住整個(gè)項(xiàng)目的json文件不能有注釋,及時(shí)沒報(bào)錯(cuò)也不行,否則運(yùn)行命令時(shí)還是有問題,具體細(xì)節(jié)問題參考下本文詳細(xì)講解2024-02-02vue.js項(xiàng)目 el-input 組件 監(jiān)聽回車鍵實(shí)現(xiàn)搜索功能示例
今天小編就為大家分享一篇vue.js項(xiàng)目 el-input 組件 監(jiān)聽回車鍵實(shí)現(xiàn)搜索功能示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08使用vue框架 Ajax獲取數(shù)據(jù)列表并用BootStrap顯示出來
這篇文章主要介紹了使用vue框架 Ajax獲取數(shù)據(jù)列表并用BootStrap顯示出來,需要的朋友可以參考下2017-04-04vue中動(dòng)態(tài)出來返回的時(shí)間秒數(shù)(在多少秒顯示分、小時(shí)等等)
這篇文章主要給大家介紹了關(guān)于vue中動(dòng)態(tài)出來返回的時(shí)間秒數(shù)(在多少秒顯示分、小時(shí)等等)的相關(guān)資料,文中通過代碼示例介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-01-01vue?elementUi中的tabs標(biāo)簽頁使用教程
Tabs 組件提供了選項(xiàng)卡功能,默認(rèn)選中第一個(gè)標(biāo)簽頁,下面這篇文章主要給大家介紹了關(guān)于vue?elementUi中的tabs標(biāo)簽頁使用的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03vue+drf+第三方滑動(dòng)驗(yàn)證碼接入的實(shí)現(xiàn)
這篇文章要給大家介紹的是vue和drf以及第三方滑動(dòng)驗(yàn)證碼接入的實(shí)現(xiàn),下文小編講詳細(xì)講解該內(nèi)容,感興趣的小伙伴可以和小編一起來學(xué)習(xí)奧2021-10-10vue插件mescroll.js實(shí)現(xiàn)移動(dòng)端上拉加載和下拉刷新
這篇文章主要介紹了vue插件mescroll.js實(shí)現(xiàn)移動(dòng)端上拉加載和下拉刷新,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03