在 vue3 中的組合式 api 中,針對(duì)響應(yīng)式有了一些改變,其中響應(yīng)式 api 中,兩個(gè)比較重要的是 ref 和 reactive,但是對(duì)于這兩個(gè)區(qū)別以及使用場(chǎng)景,大多數(shù)初學(xué)者都比較迷惑,本文會(huì)詳細(xì)講述這兩個(gè)區(qū)別以及使用場(chǎng)景。
1.什么是reactive?
reactive用于創(chuàng)建一個(gè)響應(yīng)式的對(duì)象。它會(huì)遞歸地將對(duì)象的所有屬性轉(zhuǎn)換為響應(yīng)式的。這意味著如果對(duì)象內(nèi)部還有嵌套的對(duì)象或數(shù)組,它們也會(huì)變成響應(yīng)式的。
例如,創(chuàng)建一個(gè)reactive
對(duì)象
const state = reactive({ count: 0, message: 'Hello' })
ref用于創(chuàng)建一個(gè)響應(yīng)式的數(shù)據(jù)引用。它可以包裝基本數(shù)據(jù)類型(如number
、string
、boolean
等)和對(duì)象。當(dāng)ref
包裝的值被修改時(shí),Vue 會(huì)自動(dòng)更新與之綁定的 DOM。例如,創(chuàng)建一個(gè)ref
來存儲(chǔ)一個(gè)數(shù)字
3.ref 和
reactive 之間的區(qū)別?
ref
:可以包裝基本數(shù)據(jù)類型和對(duì)象。當(dāng)訪問ref
包裝的值時(shí),需要通過.value
屬性來獲取實(shí)際的值。例如reactive
:主要用于對(duì)象類型,對(duì)于基本數(shù)據(jù)類型,雖然也可以使用reactive
(如reactive({ value: 1})
),但不如ref
方便。并且reactive
對(duì)象的屬性可以直接訪問,不需要額外的語法,如
?響應(yīng)式轉(zhuǎn)換方式
ref
:是通過Object.defineProperty()
(在 Vue 3 中實(shí)際的實(shí)現(xiàn)更復(fù)雜,但基本原理類似)為.value
屬性添加了get
和set
訪問器來實(shí)現(xiàn)響應(yīng)式。reactive
:是基于Proxy
對(duì)象來實(shí)現(xiàn)響應(yīng)式的。它可以攔截對(duì)象的各種操作(如屬性讀取、設(shè)置、刪除等),從而實(shí)現(xiàn)響應(yīng)式更新。這使得reactive
在處理復(fù)雜的嵌套對(duì)象時(shí)更加高效和靈活。
在模板中的使用
ref
:在模板中,ref
包裝的值會(huì)自動(dòng)解包。例如,如果count
是一個(gè)ref
,在模板中可以直接使用{{ count }}
,而不需要寫成{{ count.value }}
。reactive
:在模板中可以直接訪問reactive
對(duì)象的屬性,如{{ state.count }}
。
4. 何時(shí)使用 Reactive,何時(shí)使用 Ref?
使用 Reactive:
當(dāng)你需要?jiǎng)?chuàng)建一個(gè)包含多個(gè)屬性的狀態(tài)對(duì)象時(shí),例如在狀態(tài)機(jī)、表單數(shù)據(jù)等場(chǎng)景中,使用 reactive 更為合適。
如果你的數(shù)據(jù)結(jié)構(gòu)是復(fù)雜的,使用 reactive 可以使代碼更簡(jiǎn)潔明了。
使用 Ref:
如果你要管理簡(jiǎn)單的數(shù)據(jù)類型(如數(shù)字、字符串等),則使用 ref 更為簡(jiǎn)便和高效。
當(dāng)你需要單獨(dú)處理某個(gè)變量,或?qū)⑵渥鳛?props 傳遞時(shí),使用 ref 更加直觀。
5.使用場(chǎng)景
ref
的使用場(chǎng)景
當(dāng)需要存儲(chǔ)一個(gè)簡(jiǎn)單的基本數(shù)據(jù)類型的響應(yīng)式數(shù)據(jù)時(shí),如一個(gè)計(jì)數(shù)器的值、一個(gè)輸入框的文本長(zhǎng)度等,ref
是很好的選擇。例如,在一個(gè)組件中跟蹤用戶點(diǎn)擊按鈕的次數(shù):
<template>
<button @click="increment">Click me</button>
<p>You clicked {{ count }} times.</p>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const count = ref(0);
const increment = () => {
count.value++;
};
return { count, increment };
}
};
</script>
reactive
的使用場(chǎng)景
當(dāng)需要管理一個(gè)復(fù)雜的狀態(tài)對(duì)象,特別是包含多個(gè)相關(guān)屬性的對(duì)象時(shí),reactive
更合適。例如,管理一個(gè)表單的狀態(tài),包括多個(gè)輸入框的值、表單的提交狀態(tài)等:<template>
<form @submit.prevent="submitForm">
<input v-model="formData.name" type="text" placeholder="Name">
<input v-model="formData.email" type="email" placeholder="Email">
<button type="submit">Submit</button>
</form>
<p v-if="formData.submitted">Form submitted successfully!</p>
</template>
<script>
import { reactive } from 'vue';
export default {
setup() {
const formData = reactive({
name: '',
email: '',
submitted: false
});
const submitForm = () => {
formData.submitted = true;
};
return { formData, submitForm };
}
};
</script>
組合使用
<template>
<div>
<p>{{ state.obj.count }}</p>
<button @click="incrementCount">Increment</button>
</div>
</template>
<script>
import { ref, reactive } from 'vue';
export default {
setup() {
const count = ref(0);
const state = reactive({
obj: { count }
});
const incrementCount = () => {
count.value++;
};
return { state, incrementCount };
}
};
</script>
總結(jié)
在 Vue 3 中,Reactive
和 Ref
是實(shí)現(xiàn)響應(yīng)式編程的重要工具。通過理解這兩者之間的區(qū)別以及適用場(chǎng)景,可以更有效地進(jìn)行狀態(tài)管理和應(yīng)用開發(fā)。簡(jiǎn)單來說:
使用 Reactive
處理復(fù)雜的對(duì)象結(jié)構(gòu)及其屬性。使用 Ref
管理簡(jiǎn)單基本數(shù)據(jù)類型或單獨(dú)數(shù)據(jù)。
該文章在 2025/1/25 10:28:30 編輯過