2025-03-26- VUE響應式變化

2025-03-26- VUE響應式變化

這是一個非常棒的問題,而且說明你已經在思考 Vue 中「響應式變化」與效能優化的核心概念了!


✅ 為什麼接收一組 style 要用 computed()

答案是:讓這組 style 自動「響應變化」並有效率地重新渲染 DOM


🌟 我們來看一個基本寫法

1
2
3
4
const badgeStyle = {
backgroundColor: props.color,
color: props.textColor,
}

這樣寫也「可以」工作,但有一個問題:

  • 這是一個靜態物件(plain object),只在 setup 時執行一次
  • 如果 props 改變了,這個物件 不會更新

✅ 用 computed() 包起來的好處

1
2
3
4
const badgeStyle = computed(() => ({
backgroundColor: props.color,
color: props.textColor,
}))

這樣一來:

  • 如果 props.colorprops.textColor 改變了,
  • badgeStyle 會自動 重新計算
  • 並觸發 DOM 的 style 響應式更新

這正是 Vue 的反應式核心!


🧠 簡單比喻

做法 類似行為
const obj = {...} 拍一張靜態照片,不會變
const obj = computed(() => {...}) 裝一台即時監視器,只要變動就會更新

🎯 實務重點:computed vs ref vs reactive

  • computed():當你想要根據變數動態產生新值時使用(常用於 style, class, 總價, 折扣後價格)。
  • ref():單一變數(例如 const count = ref(0)
  • reactive():多個變數組成的物件(例如表單資料)

🔍 延伸:如果你不想用 computed() 呢?

可以用 watch(),但寫法更長,而且不建議這樣做:

1
2
3
4
5
6
7
8
9
10
11
const badgeStyle = ref({})

watch(
() => [props.color, props.textColor],
([newColor, newTextColor]) => {
badgeStyle.value = {
backgroundColor: newColor,
color: newTextColor
}
}
)

是不是覺得 computed() 簡潔多了!


✅ 結論

使用 computed() 的主要目的:

原因 解釋
響應式更新 props 改變時,style 自動更新
更佳效能 Vue 會快取並只在必要時重新計算
可讀性更高 直觀地表達「這是根據某些值動態計算出來的」變數