Vue3一個組件綁定多個 v-model,自定義 prop 和 event 名稱
Vue3
中v-mode
l默認使用modelValue
作為prop
,update:modelValue
作為事件,而Vue2
使用的是value
和input
。此外,Vue3允許通過參數的方式為組件添加多個v-model
綁定,例如v-model:title
和v-model:description
,每個都可以對應不同的prop
和事件。
例一
一個簡單的雙綁定
多個v-model
綁定,比如用戶信息和權限設置。子組件接收兩個v-model
,如userName
和isAdmin
,然后在子組件內部使用modelValue
和對應的update
事件。不過這里可能需要使用不同的參數,比如v-model:userName
和v-model:isAdmin
,然后子組件的props
應該是userName
和isAdmin
,事件則是update:userName
和update:isAdmin
。
基礎用法 - 用戶信息組件
ChildComponent.vue
<template><div><input :value="userName" @input="$emit('update:userName', $event.target.value)"><inputtype="checkbox":checked="isAdmin"@change="$emit('update:isAdmin', $event.target.checked)"></div>
</template><script setup>
defineProps(['userName', 'isAdmin']);
defineEmits(['update:userName', 'update:isAdmin']);
</script><!-- 父組件使用 -->
<!-- <UserForm v-model:user-name="userData.name" v-model:is-admin="userData.adminStatus"
/> -->
例二
一個自定義事件名稱
例子可以涉及自定義prop
和事件名稱,但根據Vue3
的文檔,實際上通過v-model
的參數就可以直接指定prop
和事件,不需要額外配置。例如,v-model:title="pageTitle"
會自動使用title
作為prop
,update:title
作為事件
自定義參數 - 分頁組件
Pagination.vue
<template><div><button @click="$emit('update:currentPage', currentPage - 1)">上一頁</button><span>{{ currentPage }}/{{ totalPages }}</span><button @click="$emit('update:currentPage', currentPage + 1)">下一頁</button></div>
</template><script setup>
defineProps(['currentPage', 'totalPages']);
defineEmits(['update:currentPage']);
</script><!-- 父組件使用 -->
<!-- <Pagination v-model:current-page="page" :total-pages="totalPages"
/> -->
注意:在
Vue3
中,每個v-model
綁定默認對應一個prop
和update
事件,因此自定義名稱實際上是通過v-model
的參數來實現的。例如,v-model:userName
對應prop userName
和事件update:userName
。
例三
更復雜的對象傳遞,比如綁定整個對象,需要使用計算屬性的getter
和setter
對象參數 - 顏色選擇器
ColorPicker.vue
<template><input type="color" :value="color" @input="$emit('update:color', $event.target.value)"><inputtype="range":value="opacity"@input="$emit('update:opacity', $event.target.value)"min="0"max="1"step="0.1">
</template><script setup>
defineProps({color: String,opacity: Number
});
defineEmits(['update:color', 'update:opacity']);
</script><!-- 父組件使用 -->
<!-- <ColorPicker v-model:color="style.color" v-model:opacity="style.opacity"
/> -->
關鍵點總結:
- 使用
v-model:
參數名 語法實現多個綁定 - 子組件通過
defineProps
接收參數 - 通過
update:
參數名 事件觸發更新 - 參數名會自動轉換為
kebab-case
(如userName → user-name
) - 支持任意數量的
v-model
綁定 - 可以組合使用普通
props
和v-model
參數