在 vue3 中的組合式 api 中,針對響應式有了一些改變,其中響應式 api 中,兩個比較重要的是 ref 和 reactive,但是對于這兩個區別以及使用場景,大多數初學者都比較迷惑,本文會詳細講述這兩個區別以及使用場景。
1.什么是reactive?
reactive用于創建一個響應式的對象。它會遞歸地將對象的所有屬性轉換為響應式的。這意味著如果對象內部還有嵌套的對象或數組,它們也會變成響應式的。
const state = reactive({ count: 0, message: 'Hello' })
ref用于創建一個響應式的數據引用。它可以包裝基本數據類型(如number
、string
、boolean
等)和對象。當ref
包裝的值被修改時,Vue 會自動更新與之綁定的 DOM。
ref
:可以包裝基本數據類型和對象。當訪問ref
包裝的值時,需要通過.value
屬性來獲取實際的值。例如reactive
:主要用于對象類型,對于基本數據類型,雖然也可以使用reactive
(如reactive({ value: 1})
),但不如ref
方便。并且reactive
對象的屬性可以直接訪問,不需要額外的語法,如
?響應式轉換方式
ref
:是通過Object.defineProperty()
(在 Vue 3 中實際的實現更復雜,但基本原理類似)為.value
屬性添加了get
和set
訪問器來實現響應式。reactive
:是基于Proxy
對象來實現響應式的。它可以攔截對象的各種操作(如屬性讀取、設置、刪除等),從而實現響應式更新。這使得reactive
在處理復雜的嵌套對象時更加高效和靈活。
在模板中的使用
ref
:在模板中,ref
包裝的值會自動解包。例如,如果count
是一個ref
,在模板中可以直接使用{{ count }}
,而不需要寫成{{ count.value }}
。reactive
:在模板中可以直接訪問reactive
對象的屬性,如{{ state.count }}
。
4. 何時使用 Reactive,何時使用 Ref?
使用 Reactive:
當你需要創建一個包含多個屬性的狀態對象時,例如在狀態機、表單數據等場景中,使用 reactive 更為合適。
如果你的數據結構是復雜的,使用 reactive 可以使代碼更簡潔明了。
使用 Ref:
如果你要管理簡單的數據類型(如數字、字符串等),則使用 ref 更為簡便和高效。
當你需要單獨處理某個變量,或將其作為 props 傳遞時,使用 ref 更加直觀。
5.使用場景
ref
的使用場景
當需要存儲一個簡單的基本數據類型的響應式數據時,如一個計數器的值、一個輸入框的文本長度等,ref
是很好的選擇。例如,在一個組件中跟蹤用戶點擊按鈕的次數:
<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
的使用場景
當需要管理一個復雜的狀態對象,特別是包含多個相關屬性的對象時,reactive
更合適。例如,管理一個表單的狀態,包括多個輸入框的值、表單的提交狀態等:<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>
總結
在 Vue 3 中,Reactive
和 Ref
是實現響應式編程的重要工具。通過理解這兩者之間的區別以及適用場景,可以更有效地進行狀態管理和應用開發。簡單來說:
該文章在 2025/1/25 10:28:30 編輯過