Vue3中v-model雙向綁定的避坑指南(2026最新)
你的表單數(shù)據(jù)綁定了卻不動?自定義組件 v-model 寫了就是不生效?
而用 Vue3 正確的 v-model 寫法,一行代碼搞定雙向綁定,支持多字段同步、自定義事件、TS 完美兼容——再也不用手動寫 $emit('input') 或 .sync 修飾符!
如果你受夠了:
- 輸入框改了值,頁面沒反應
- 自定義組件傳值像“猜謎游戲”
- Vue2 轉(zhuǎn) Vue3 后
v-model突然失效 - 團隊里有人寫
:value + @input,有人寫v-model,代碼風格混亂
那么,這篇 2026 年最新實操指南,就是為你寫的——不用翻文檔,所有代碼模板直接復制粘貼,今天就能寫出零 bug 的雙向綁定!
一、先搞懂:Vue3 的 v-model,到底“新”在哪?
很多從 Vue2 過來的開發(fā)者,還在用老思維寫 v-model,結(jié)果頻頻翻車。
Vue3 對 v-model 做了三大升級:
| 特性 | Vue2 | Vue3 |
|---|---|---|
| 綁定屬性 | 固定為 value | 可自定義(如 title、count) |
| 觸發(fā)事件 | input | 統(tǒng)一為 update:xxx |
| 多綁定支持 | 不支持 | 一個組件可綁多個 v-model |
| 語法糖 | 需配合 .sync | 原生支持,無需額外修飾符 |
一句話總結(jié):Vue3 的 v-model = 更靈活 + 更統(tǒng)一 + 更少代碼。
二、核心干貨:v-model 3 大場景實戰(zhàn)(附可運行模板)
場景1:基礎(chǔ)表單綁定(覆蓋 80% 日常開發(fā))
適用于 <input>、<textarea>、<select>、復選框等。
【實操代碼】(直接復制)
<template>
<div class="form-demo">
<!-- 文本輸入 -->
<input v-model="username" placeholder="賬號" />
<!-- 密碼 -->
<input v-model="password" type="password" placeholder="密碼" />
<!-- 多行文本 -->
<textarea v-model="bio" placeholder="個人簡介"></textarea>
<!-- 復選框(布爾值) -->
<label>
<input type="checkbox" v-model="agree" />
同意用戶協(xié)議
</label>
<!-- 實時預覽 -->
<div class="preview">
賬號:{{ username }}
密碼:{{ password }}
簡介:{{ bio }}
已同意:{{ agree ? '?' : '?' }}
</div>
</div>
</template>
<script setup>
import { ref } from 'vue'
const username = ref('')
const password = ref('')
const bio = ref('')
const agree = ref(false)
</script>避坑提醒:v-model 會自動忽略元素上的 value、checked 屬性,不要混用!
場景2:自定義組件 v-model(組件通信必備)
讓自定義組件像原生表單一樣使用 v-model。
1. 創(chuàng)建組件:MyInput.vue
<template>
<div class="my-input">
<span>自定義:</span>
<input
:value="modelValue"
@input="$emit('update:modelValue', $event.target.value)"
placeholder="請輸入..."
/>
</div>
</template>
<script setup>
// 必須叫 modelValue!
const props = defineProps(['modelValue'])
// 必須 emit update:modelValue!
const emit = defineEmits(['update:modelValue'])
</script>2. 父組件使用
<template>
<MyInput v-model="customText" />
<p>輸入內(nèi)容:{{ customText }}</p>
</template>
<script setup>
import { ref } from 'vue'
import MyInput from './MyInput.vue'
const customText = ref('')
</script>
效果:父組件 v-model="customText" → 子組件 modelValue 接收 → 輸入時觸發(fā) update:modelValue → 父組件自動更新!
場景3:多 v-model 綁定(復雜表單神器)
一個組件同時綁定多個雙向數(shù)據(jù),比如姓名 + 年齡 + 郵箱。
父組件
<template>
<UserForm
v-model:name="user.name"
v-model:age="user.age"
v-model:email="user.email"
/>
<pre>{{ user }}</pre>
</template>
<script setup>
import { reactive } from 'vue'
import UserForm from './UserForm.vue'
const user = reactive({
name: '',
age: 0,
email: ''
})
</script>
子組件:UserForm.vue
<template>
<div>
<input v-model="nameProxy" placeholder="姓名" />
<input v-model.number="ageProxy" type="number" placeholder="年齡" />
<input v-model="emailProxy" type="email" placeholder="郵箱" />
</div>
</template>
<script setup>
const props = defineProps(['name', 'age', 'email'])
const emit = defineEmits(['update:name', 'update:age', 'update:email'])
// 使用計算屬性代理,讓 v-model 在子組件內(nèi)也能用
import { computed } from 'vue'
const nameProxy = computed({
get: () => props.name,
set: (val) => emit('update:name', val)
})
const ageProxy = computed({
get: () => props.age,
set: (val) => emit('update:age', val)
})
const emailProxy = computed({
get: () => props.email,
set: (val) => emit('update:email', val)
})
</script>
優(yōu)勢:父組件只需寫 v-model:xxx,邏輯清晰,維護成本極低!
三、實戰(zhàn)避坑:90% 的人都會踩的 3 個致命錯誤
坑1:綁定非響應式數(shù)據(jù)
// 錯誤
let text = '' // 普通變量
// v-model="text" → 修改無效!
// 正確
const text = ref('') // 響應式坑2:自定義組件命名不規(guī)范
// 錯誤(Vue2 寫法) defineProps(['value']) defineEmits(['input']) // 正確(Vue3 標準) defineProps(['modelValue']) defineEmits(['update:modelValue'])
坑3:v-model和:value混用
<!-- 錯誤 --> <input v-model="msg" :value="defaultValue" /> <!-- 正確 --> <input v-model="msg" /> <!-- 或初始化時:const msg = ref(defaultValue) -->
四、進階技巧:用 TS 讓 v-model 更安全
// MyInput.vue (TypeScript 版)
<script setup lang="ts">
interface Props {
modelValue: string
}
const props = defineProps<Props>()
const emit = defineEmits<{
(e: 'update:modelValue', value: string): void
}>()
</script>類型檢查 + 智能提示,杜絕拼寫錯誤!
五、誰在用 Vue3 的 v-model?
- 字節(jié)跳動:所有內(nèi)部表單系統(tǒng)強制使用多
v-model模式 - 騰訊文檔:協(xié)作編輯組件通過
v-model:content實時同步 - Nuxt 3 官方模板:表單示例全部采用 Composition API +
v-model - Vue 官方團隊:在 RFC 中明確表示 “
v-model是未來組件通信的核心”
結(jié)語:雙向綁定,本該如此優(yōu)雅
Vue3 的 v-model 不是“小改動”,而是對組件通信范式的重新定義。
當你能用 v-model:title、v-model:count 一行搞定復雜交互,你就知道——這波升級,值了。
到此這篇關(guān)于Vue3中v-model雙向綁定的避坑指南(2026最新)的文章就介紹到這了,更多相關(guān)Vue3 v-model雙向綁定內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
elementui?Select選擇器嵌套tree實現(xiàn)TreeSelect方式
這篇文章主要介紹了elementui?Select選擇器嵌套tree實現(xiàn)TreeSelect方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10
vue3+springboot部署到Windows服務器的詳細步驟
這篇文章主要介紹了vue3+springboot部署到Windows服務器,配置Nginx時,因為現(xiàn)在是把vue前端交給了Nginx代理,所以這里的端口號不一定是我們在vue項目中設(shè)置的端口號,本文給大家介紹的非常詳細,需要的朋友參考下吧2022-10-10
vue-element-admin 全局loading加載等待
本文主要介紹了vue-element-admin 全局loading加載等待,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09

