24
Vue 3 學習之旅
進階應用

ref() vs. reactive() 的選擇

·6 分鐘閱讀·進階應用

摘要

ref() 適用於所有資料型別,reactive() 僅適用於物件型別。ref() 賦值更靈活,reactive() 操作屬性更直觀。團隊應建立一致的風格,普遍作法是「基本型別用 ref,物件陣列用 reactive」。

定義與說明

ref(value)

優點:

通用性強,可接受任何值。可以對整個 ref 物件進行重新賦值(myRef.value = ...)。

缺點:

在 script 中存取時,總要記得加上 .value,略顯繁瑣。

reactive(object)

優點:

操作代理物件的屬性時,語法和普通 JS 物件一樣,無需 .value。

缺點:

只能用於物件或陣列。不能直接對變數重新賦值,否則會失去響應性。對其屬性進行解構時,容易丟失響應性。

實作範例

Vue SFC
<script setup>
import { ref, reactive } from 'vue';

// --- 使用 ref 處理物件 ---
const userRef = ref({ name: 'Jake', age: 30 });
function changeUserRef() {
  // 必須透過 .value 存取
  userRef.value.age++;
}

// --- 使用 reactive 處理物件 ---
const userReactive = reactive({ name: 'Eason', age: 25 });
function changeUserReactive() {
  // 直接存取屬性
  userReactive.age++;
}
</script>

結論

ref 和 reactive 並非互斥,而是互補。選擇哪個取決於個人或團隊的程式碼風格偏好。一個常見的約定是:對於基本型別(字串、數字等)總是使用 ref;對於需要整體響應的物件和陣列,則使用 reactive。另一個風格是為了保持一致性,全部使用 ref。

ref reactive 選擇