How to handle multiple v-model bindings in Vue

Managing multiple v-model bindings is essential for building complex Vue components that need to synchronize multiple data properties with parent components. As the creator of CoreUI, a widely used open-source UI library, I’ve implemented sophisticated two-way binding patterns in Vue components over 25 years of development. From my expertise, the most effective approach in Vue 3 is using named v-models with the defineEmits and defineProps composition API functions. This enables clean, type-safe multiple data bindings between parent and child components.

Use named v-models in Vue 3 to handle multiple two-way data bindings.

<!-- Child Component -->
<script setup>
const props = defineProps(['firstName', 'lastName'])
const emit = defineEmits(['update:firstName', 'update:lastName'])
</script>

<!-- Parent Component -->
<UserForm v-model:first-name="user.firstName" v-model:last-name="user.lastName" />

Here the child component defines props for both values and corresponding update events using the update: prefix convention. The parent component uses named v-models with v-model:first-name and v-model:last-name syntax to bind different data properties. Vue automatically handles the two-way synchronization when the child emits the update events.

Best Practice Note:

This is the same multiple binding pattern we use in CoreUI Vue components for complex form controls and data inputs. Always use descriptive names for your v-model bindings and ensure prop names match the emit event suffixes for Vue’s automatic v-model handling to work correctly.


Speed up your responsive apps and websites with fully-featured, ready-to-use open-source admin panel templates—free to use and built for efficiency.


About the Author