vue3?中的toRef函數(shù)和toRefs函數(shù)的基本使用
這篇我們看下toRef和toRefs的基本使用
我們知道ref可以用于創(chuàng)建一個(gè)響應(yīng)式數(shù)據(jù),而toRef也可以創(chuàng)建一個(gè)響應(yīng)式數(shù)據(jù),那他們之間有什么區(qū)別呢?
事實(shí)上,如果利用ref函數(shù)將某個(gè)對(duì)象中的屬性變成響應(yīng)式數(shù)據(jù),修改響應(yīng)式數(shù)據(jù)是不會(huì)影響到原始數(shù)據(jù)。
import {ref} from 'vue';
export default {
name:'App'
setup(){
let obj = {name : 'alice', age : 12};
let newObj= ref(obj.name);
function change(){
newObj.value = 'Tom';
console.log(obj,newObj)
}
return {newObj,change}
}
}上述代碼,當(dāng)change執(zhí)行的時(shí)候,響應(yīng)式數(shù)據(jù)發(fā)生改變,而原始數(shù)據(jù)obj并不會(huì)改變。
原因在于,ref的本質(zhì)是拷貝,與原始數(shù)據(jù)沒有引用關(guān)系
需要注意ref(obj.name)相當(dāng)于ref('alice')相當(dāng)于reactive({value:'alice'})
所以在修改數(shù)據(jù)時(shí),是修改newObj.value=xxx
而如果使用toRef將某個(gè)對(duì)象中的屬性變成響應(yīng)式數(shù)據(jù),修改響應(yīng)式數(shù)據(jù)是會(huì)影響到原始數(shù)據(jù)的。但是需要注意,如果修改通過toRef創(chuàng)建的響應(yīng)式數(shù)據(jù),并不會(huì)觸發(fā)UI界面的更新。
所以,toRef的本質(zhì)是引用,與原始數(shù)據(jù)有關(guān)聯(lián)
import {toRef} from 'vue';
export default {
name:'App'
setup(){
let obj = {name : 'alice', age : 12};
let newObj= toRef(obj, 'name');
function change(){
newObj.value = 'Tom';
console.log(obj,newObj)
}
return {newObj,change}
}
}上述代碼,當(dāng)change執(zhí)行的時(shí)候,響應(yīng)式數(shù)據(jù)發(fā)生改變,原始數(shù)據(jù)obj并不會(huì)改變,但是UI界面不會(huì)更新
小結(jié):
ref和toRef的區(qū)別
(1). ref本質(zhì)是拷貝,修改響應(yīng)式數(shù)據(jù)不會(huì)影響原始數(shù)據(jù);toRef的本質(zhì)是引用關(guān)系,修改響應(yīng)式數(shù)據(jù)會(huì)影響原始數(shù)據(jù)
(2). ref數(shù)據(jù)發(fā)生改變,界面會(huì)自動(dòng)更新;toRef當(dāng)數(shù)據(jù)發(fā)生改變是,界面不會(huì)自動(dòng)更新
(3). toRef傳參與ref不同;toRef接收兩個(gè)參數(shù),第一個(gè)參數(shù)是哪個(gè)對(duì)象,第二個(gè)參數(shù)是對(duì)象的哪個(gè)屬性
所以如果想讓響應(yīng)式數(shù)據(jù)和以前的數(shù)據(jù)關(guān)聯(lián)起來,并且想在更新響應(yīng)式數(shù)據(jù)的時(shí)候不更新UI,那么就使用toRef
有的時(shí)候,我們希望將對(duì)象的多個(gè)屬性都變成響應(yīng)式數(shù)據(jù),并且要求響應(yīng)式數(shù)據(jù)和原始數(shù)據(jù)關(guān)聯(lián),并且更新響應(yīng)式數(shù)據(jù)的時(shí)候不更新界面,就可以使用toRefs,用于批量設(shè)置多個(gè)數(shù)據(jù)為響應(yīng)式數(shù)據(jù)。(toRef一次僅能設(shè)置一個(gè)數(shù)據(jù))
toRefs接收一個(gè)對(duì)象作為參數(shù),它會(huì)遍歷對(duì)象身上的所有屬性,然后挨個(gè)調(diào)用toRef執(zhí)行
例如
import {toRefs} from 'vue';
export default {
name:'App'
setup(){
let obj = {name : 'alice', age : 12};
let newObj= toRefs(obj);
function change(){
newObj.name.value = 'Tom';
newObj.age.value = 18;
console.log(obj,newObj)
}
return {newObj,change}
}
}Vue3的toRef
更改person.age的值時(shí),
通過ref(person.age)得到的age1不會(huì)改變,因?yàn)閞ef是復(fù)制,拷貝了一份新的數(shù)據(jù)值單獨(dú)操作, 更新時(shí)相互不影響
通過toRef(person,‘age’)得到的age2會(huì)改變,因?yàn)?toRef是引用。它為源響應(yīng)式對(duì)象上的某個(gè)屬性創(chuàng)建一個(gè) ref對(duì)象, 二者內(nèi)部操作的是同一個(gè)數(shù)據(jù)值, 更新時(shí)二者是同步的
? setup() {
? ? let person =reactive( { name: "long",age:23 });
? ? let age1 = ref(person.age);
? ? let age2=toRef(person,'age')
? ? const change1 = () => {
? ? ? person.age++
? ? };
? ? return {
? ? ? age1,
? ? ? age2,
? ? ? change1,
? ? };
? },應(yīng)用: 當(dāng)要將 某個(gè)prop 的 ref 傳遞給復(fù)合函數(shù)時(shí),toRef 很有用
useFeatureX函數(shù)需要使用props中的foo屬性,且foo要為ref。
? setup (props, context) {
? ? const length = useFeatureX(toRef(props, 'foo'))
? ? return {
? ? ? length
? ? }
? }到此這篇關(guān)于vue3 toRef函數(shù)和toRefs函數(shù)的文章就介紹到這了,更多相關(guān)vue3 toRef和toRefs函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue+element表格實(shí)現(xiàn)多層數(shù)據(jù)的嵌套方式
這篇文章主要介紹了vue+element表格實(shí)現(xiàn)多層數(shù)據(jù)的嵌套方式,具有很好的參考價(jià)值。希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
Vue項(xiàng)目結(jié)合Vue-layer實(shí)現(xiàn)彈框式編輯功能(實(shí)例代碼)
這篇文章主要介紹了Vue項(xiàng)目中結(jié)合Vue-layer實(shí)現(xiàn)彈框式編輯功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
VueJs中的shallowRef與shallowReactive函數(shù)使用比較
這篇文章主要為大家介紹了VueJs中的shallowRef與shallowReactive函數(shù)的使用比較解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
webStorm?debug?vue項(xiàng)目的兩種方案圖文詳解
WebStorm作為一款功能強(qiáng)大的IDE,提供了豐富的調(diào)試功能和技巧,可以幫助你更高效地開發(fā)和調(diào)試Vue應(yīng)用,這篇文章主要給大家介紹了關(guān)于webStorm?debug?vue項(xiàng)目的兩種方案,需要的朋友可以參考下2024-07-07
vue打包優(yōu)化時(shí)配置webpack的8大方案小結(jié)
vue-cli?生成的項(xiàng)目通常集成Webpack?,在打包的時(shí)候,需要webpack來做一些事情,這里我們希望它可以壓縮代碼體積,提高運(yùn)行效率,本文為大家整理了8大webpack配置方案,希望對(duì)大家有所幫助2024-02-02
Vant picker選擇器設(shè)置默認(rèn)值導(dǎo)致選擇器失效的解決
這篇文章主要介紹了Vant picker選擇器設(shè)置默認(rèn)值導(dǎo)致選擇器失效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
使用vue實(shí)現(xiàn)點(diǎn)擊按鈕滑出面板的實(shí)現(xiàn)代碼
這篇文章主要介紹了使用vue實(shí)現(xiàn)點(diǎn)擊按鈕滑出面板的實(shí)現(xiàn)代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-01-01
vue中v-text / v-html使用實(shí)例代碼詳解
這篇文章主要介紹了vue中v-text / v-html使用實(shí)例代碼詳解,非常不錯(cuò),代碼簡(jiǎn)單易懂,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04
vue3項(xiàng)目導(dǎo)入異常Error:@vitejs/PLUGIN-vue?requires?vue?(>=3.2.13
這篇文章主要給大家介紹了關(guān)于vue3項(xiàng)目導(dǎo)入異常Error:@vitejs/PLUGIN-vue?requires?vue?(>=3.2.13)的解決辦法,文中將解決辦法介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01

