2025-04-02- Vue *情境化**解釋 v-model
2025-04-02- Vue *情境化**解釋 v-model
我懂了,你的意思是要用情境化的方式,把為什麼有:modelValue
+ @update:modelValue
(也就是 v-model)這種父子元件互傳資料的語法,講得更貼近開發需求對吧?
情境說明
假設我們有一個頁面 A.vue
(父元件),上面有一個變數:
1 | let vMy123 = "小明" |
原本這個變數是直接在 A.vue
中用 <input>
綁定的,很單純。
但後來我們覺得——這個輸入框需要包裝成一個好看又可重用的元件(方便其他地方也用),
所以我們拆成兩個檔案:
- 父元件
A.vue
→ 管理資料與邏輯 - 子元件
MyInput.vue
→ 專門負責顯示與處理輸入
問題出現
一旦拆成父子元件,vMy123
這個變數就不在子元件裡了,
但子元件需要顯示它(父 → 子傳值),
而且使用者輸入新內容時,子元件也要告訴父元件更新 vMy123
(子 → 父回傳)。
解決方式
Vue 提供了資料單向流 + 事件回傳的做法:
父 → 子:
1
:modelValue="vMy123"
把父元件的
vMy123
傳給子元件的props.modelValue
。子 → 父:
1
@update:modelValue="vMy123 = $event"
當子元件輸入框變更時,觸發
update:modelValue
事件,把新值傳回給父元件。
v-model 的好處
這兩段寫在一起很囉嗦,所以 Vue 給你糖衣版本:
1 | <MyInput v-model="vMy123" /> |
它等於:
1 | <MyInput :modelValue="vMy123" @update:modelValue="vMy123 = $event" /> |
✅ 簡單總結
你理解的對:這就是在父子元件分工的情況下,
為了讓資料雙向同步(父傳給子、子回傳給父)而設計的語法。
事件的觸發,通常是因為使用者操作了子元件(輸入、點擊等),
而父元件需要根據這個新資料做後續的邏輯。
如果你願意,我可以用「父元件輸入名字,子元件顯示輸入框」的最小範例讓你馬上看到雙向傳遞的效果。
這樣你會瞬間抓到它的運作方式。
好,那我們做一個超精簡的範例,變數就叫 **vMyGod
**,讓你直接看到 父 → 子 與 子 → 父 資料同步的效果。
父元件 A.vue
1 | <template> |
子元件 MyInput.vue
1 | <template> |
運作流程
父元件啟動 →
vMyGod = "初始值:Hello World"
父元件透過
v-model
把值傳給MyInput.vue
的modelValue
子元件顯示輸入框,內容是
"初始值:Hello World"
你在輸入框改文字 → 子元件用
1
$emit('update:modelValue', 新的值)
把資料回傳給父元件,父元件的
vMyGod
也會即時更新。
這個範例跑起來,你會看到:
- 父元件的
<p>
和子元件的<p>
永遠同步 - 改父元件變數或子元件輸入框,都會互相影響