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. 父 → 子:

    1
    :modelValue="vMy123"

    把父元件的 vMy123 傳給子元件的 props.modelValue

  2. 子 → 父:

    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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<template>
<div>
<h2>父元件</h2>
<p>父元件的 vMyGod:{{ vMyGod }}</p>

<!-- 用 v-model 綁定子元件 -->
<MyInput v-model="vMyGod" />
</div>
</template>

<script setup>
import { ref } from 'vue'
import MyInput from './MyInput.vue'

// 父元件變數
const vMyGod = ref("初始值:Hello World")
</script>

子元件 MyInput.vue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<template>
<div>
<h3>子元件</h3>
<input
type="text"
:value="modelValue"
@input="$emit('update:modelValue', $event.target.value)"
/>
<p>子元件接到的值:{{ modelValue }}</p>
</div>
</template>

<script setup>
// 接收父元件傳來的值
const props = defineProps({
modelValue: String
})

// 定義可以發射事件
const emit = defineEmits(['update:modelValue'])
</script>

運作流程

  1. 父元件啟動vMyGod = "初始值:Hello World"

  2. 父元件透過 v-model 把值傳給 MyInput.vuemodelValue

  3. 子元件顯示輸入框,內容是 "初始值:Hello World"

  4. 你在輸入框改文字 → 子元件用

    1
    $emit('update:modelValue', 新的值)

    把資料回傳給父元件,父元件的 vMyGod 也會即時更新。


這個範例跑起來,你會看到:

  • 父元件的 <p> 和子元件的 <p> 永遠同步
  • 改父元件變數或子元件輸入框,都會互相影響