Vue3中v-model實(shí)現(xiàn)雙向數(shù)據(jù)綁定的全面指南
1. v-model 基礎(chǔ)
1.1 什么是 v-model
v-model 是 Vue 提供的一個(gè)語(yǔ)法糖,它本質(zhì)上結(jié)合了 v-bind 和 v-on:
<input v-model="message">
等價(jià)于:
<input :value="message" @input="message = $event.target.value" >
1.2 基本用法
在表單元素上使用 v-model 非常簡(jiǎn)單:
<template>
<input v-model="text" placeholder="請(qǐng)輸入">
<p>你輸入的內(nèi)容是: {{ text }}</p>
</template>
<script setup>
import { ref } from 'vue'
const text = ref('')
</script>
2. Vue 3 中的 v-model 改進(jìn)
2.1 多個(gè) v-model 綁定
Vue 3 允許在單個(gè)組件上使用多個(gè) v-model:
<UserName v-model:first-name="firstName" v-model:last-name="lastName" />
子組件實(shí)現(xiàn):
<script setup>
defineProps({
firstName: String,
lastName: String
})
defineEmits(['update:firstName', 'update:lastName'])
</script>
<template>
<input
:value="firstName"
@input="$emit('update:firstName', $event.target.value)"
/>
<input
:value="lastName"
@input="$emit('update:lastName', $event.target.value)"
/>
</template>
2.2 v-model 修飾符
Vue 3 支持自定義 v-model 修飾符。例如,創(chuàng)建一個(gè) capitalize 修飾符:
<MyComponent v-model.capitalize="myText" />
子組件處理:
<script setup>
const props = defineProps({
modelValue: String,
modelModifiers: { default: () => ({}) }
})
const emit = defineEmits(['update:modelValue'])
function emitValue(e) {
let value = e.target.value
if (props.modelModifiers.capitalize) {
value = value.charAt(0).toUpperCase() + value.slice(1)
}
emit('update:modelValue', value)
}
</script>
<template>
<input :value="modelValue" @input="emitValue" />
</template>
3. 不同表單元素的使用
3.1 文本輸入
<input v-model="text" type="text">
3.2 多行文本
<textarea v-model="message"></textarea>
3.3 復(fù)選框
單個(gè)復(fù)選框綁定到布爾值:
<input type="checkbox" id="checkbox" v-model="checked">
<label for="checkbox">{{ checked }}</label>
多個(gè)復(fù)選框綁定到數(shù)組:
<input type="checkbox" id="jack" value="Jack" v-model="checkedNames"> <input type="checkbox" id="john" value="John" v-model="checkedNames"> <input type="checkbox" id="mike" value="Mike" v-model="checkedNames">
3.4 單選按鈕
<input type="radio" id="one" value="One" v-model="picked"> <input type="radio" id="two" value="Two" v-model="picked">
3.5 選擇框
單選:
<select v-model="selected"> <option disabled value="">請(qǐng)選擇</option> <option>A</option> <option>B</option> <option>C</option> </select>
多選(綁定到數(shù)組):
<select v-model="selected" multiple> <option>A</option> <option>B</option> <option>C</option> </select>
4. v-model 修飾符
Vue 提供了一些內(nèi)置修飾符來(lái)修改 v-model 的行為:
4.1 .lazy
將 input 事件改為 change 事件:
<input v-model.lazy="msg">
4.2 .number
自動(dòng)將用戶輸入轉(zhuǎn)為數(shù)字:
<input v-model.number="age" type="number">
4.3 .trim
自動(dòng)去除用戶輸入的首尾空白:
<input v-model.trim="msg">
5. 在組件中使用 v-model
5.1 基本實(shí)現(xiàn)
子組件:
<script setup>
defineProps(['modelValue'])
defineEmits(['update:modelValue'])
</script>
<template>
<input
:value="modelValue"
@input="$emit('update:modelValue', $event.target.value)"
/>
</template>
父組件:
<CustomInput v-model="searchText" />
5.2 帶參數(shù)的 v-model
子組件:
<script setup>
defineProps(['title'])
defineEmits(['update:title'])
</script>
<template>
<input
type="text"
:value="title"
@input="$emit('update:title', $event.target.value)"
/>
</template>
父組件:
<MyComponent v-model:title="bookTitle" />
6. 高級(jí)技巧
6.1 自定義輸入組件
創(chuàng)建一個(gè)帶驗(yàn)證的輸入組件:
<!-- ValidatedInput.vue -->
<script setup>
import { computed } from 'vue'
const props = defineProps({
modelValue: String,
required: Boolean,
minLength: Number
})
const emit = defineEmits(['update:modelValue'])
const error = computed(() => {
if (props.required && !props.modelValue) {
return '此字段為必填項(xiàng)'
}
if (props.minLength && props.modelValue?.length < props.minLength) {
return `至少需要 ${props.minLength} 個(gè)字符`
}
return null
})
function handleInput(e) {
emit('update:modelValue', e.target.value)
}
</script>
<template>
<input :value="modelValue" @input="handleInput" />
<div v-if="error" class="error">{{ error }}</div>
</template>
使用:
<ValidatedInput v-model="username" :required="true" :minLength="5" />
6.2 組合式 API 中的 v-model
使用 computed 實(shí)現(xiàn)更復(fù)雜的邏輯:
<script setup>
import { computed } from 'vue'
const props = defineProps(['modelValue'])
const emit = defineEmits(['update:modelValue'])
const value = computed({
get() {
return props.modelValue
},
set(value) {
emit('update:modelValue', value)
}
})
</script>
7. 性能考慮
- 避免大型表單的深度響應(yīng)式:對(duì)于大型表單,考慮使用淺響應(yīng)式或手動(dòng)管理狀態(tài)
- 防抖處理:頻繁的輸入可以使用防抖優(yōu)化性能
- 虛擬滾動(dòng):對(duì)于大量選項(xiàng)的選擇框,考慮使用虛擬滾動(dòng)
8. 常見(jiàn)問(wèn)題解答
Q: v-model 和 sync 修飾符有什么區(qū)別?
A: 在 Vue 2 中,.sync 修飾符用于雙向綁定,Vue 3 中已統(tǒng)一使用帶參數(shù)的 v-model。
Q: 為什么我的 v-model 在自定義組件上不工作?
A: 確保子組件正確接收 modelValue prop 并發(fā)出 update:modelValue 事件。
Q: 如何處理 v-model 的初始值?
A: 確保父組件為 v-model 綁定的數(shù)據(jù)提供初始值。
9. 總結(jié)
Vue 3 的 v-model 提供了更靈活、更強(qiáng)大的雙向數(shù)據(jù)綁定能力。通過(guò)理解其工作原理和各種使用場(chǎng)景,開(kāi)發(fā)者可以構(gòu)建更復(fù)雜、更高效的表單交互。關(guān)鍵點(diǎn)包括:
v-model是:value和@input的語(yǔ)法糖- Vue 3 支持多個(gè)
v-model綁定 - 可以創(chuàng)建自定義修飾符
- 在組件中使用需要正確實(shí)現(xiàn) prop 和 emit
掌握這些概念將大大提升你在 Vue 開(kāi)發(fā)中的效率和代碼質(zhì)量。
以上就是Vue3中v-model實(shí)現(xiàn)雙向數(shù)據(jù)綁定的全面指南的詳細(xì)內(nèi)容,更多關(guān)于Vue3 v-model雙向數(shù)據(jù)綁定的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vue3實(shí)現(xiàn)SSE(Server-Sent?Events)連接
SSE?是一種允許服務(wù)器向?yàn)g覽器推送事件的技術(shù),這篇文章主要為大家詳細(xì)介紹了如何通過(guò)vue3實(shí)現(xiàn)SSE(Server-Sent?Events)連接,有需要的小伙伴可以了解下2024-10-10
詳解如何使用vue-cli腳手架搭建Vue.js項(xiàng)目
這篇文章主要介紹了詳解如何使用vue-cli腳手架搭建Vue.js項(xiàng)目 ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
vue使用canvas畫布實(shí)現(xiàn)平面圖點(diǎn)位標(biāo)注功能(最新推薦)
這篇文章主要介紹了vue使用canvas畫布實(shí)現(xiàn)平面圖點(diǎn)位標(biāo)注功能,經(jīng)過(guò)本文一番研究發(fā)現(xiàn)canvas標(biāo)簽可以完成很多功能,電子簽名,點(diǎn)位標(biāo)注,問(wèn)題標(biāo)注,畫圖功能,感興趣的朋友跟隨小編一起看看吧2023-07-07
ElementPlus 自定義封裝 el-date-picker 的快捷功能示例詳解
文章討論了用戶對(duì)官網(wǎng)提供的案例不滿足快捷功能需求的情況,建議在外部自定義組件中導(dǎo)入并使用快捷內(nèi)容,以滿足用戶需求,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2024-12-12
一篇文章帶你使用Typescript封裝一個(gè)Vue組件(簡(jiǎn)單易懂)
這篇文章主要介紹了使用Typescript封裝一個(gè)Vue組件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
vuex + axios 做登錄驗(yàn)證 并且保存登錄狀態(tài)的實(shí)例
今天小編就為大家分享一篇vuex + axios 做登錄驗(yàn)證 并且保存登錄狀態(tài)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
vue動(dòng)態(tài)設(shè)置img的src路徑實(shí)例
今天小編就為大家分享一篇vue動(dòng)態(tài)設(shè)置img的src路徑實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09

