DEV Community

Cover image for Multiple v-model in Vue 3
Snehal Rajeev Moon
Snehal Rajeev Moon

Posted on

Multiple v-model in Vue 3

Hello Readers,

With the release of Vue 3 now we can add multiple v-model for two-way data binding in a more standardized way on the same component with more flexibility.

As given in Vue 3 document the syntax of using v-model on a custom component is similar by-passing modelValue as a prop and emitting an update:modelValue event.

 <custom-multiple-input :modelValue="msg" @update:modelValue="msg= $event" /> /* the above code can be written as */ <custom-multiple-input v-model="msg" /> 
Enter fullscreen mode Exit fullscreen mode

If you want to see what is composition API in Vue 3 you can refer to my previous blog.

.

v-model as an argument:

Instead of changing the model name or option now we are able to pass an argument to v-model as shown below.

<custom-multiple-input v-model:title="heading" v-model:subHeading="pageSubHeading" /> <!-- it can be done as: --> <custom-multiple-input :title="heading" @update:title="heading = $event" :subHeading="pageSubHeading" @update:subHeading="pageSubHeading = $event" /> 
Enter fullscreen mode Exit fullscreen mode

For better understanding let us see an example. In this example, we will create a custom input that will have username, email, and mobile.

Step 1:
Create a component named as CustomMultipleInput.vue and add the following code.

<template> <div class="flex flex-col w-1/3 mx-auto"> <input type="text" :value="username" class="border shadow border-blue-200 rounded-md p-2 mb-3" placeholder="username" @input="$emit('update:username', $event.target.value)" /> <input type="email" :value="email" @input="$emit('update:email', $event.target.value)" class="border shadow border-blue-200 rounded-md p-2 mb-3" placeholder="email" /> <input type="number" :value="mobile" @input="$emit('update:mobile', $event.target.value)" class="border shadow border-blue-200 rounded-md p-2 mb-3" placeholder="mobile" /> </div> </template>  <script> export default { name: "CustomMultipleInput", props: { username: String, email: String, mobile: String, }, // or we can call a function on input and update it in setup function // setup(props, context) { // const updateEmail = (event) => { // context.emit("update:email", event.target.value); // }; // return { updateEmail } // }, }; </script> 
Enter fullscreen mode Exit fullscreen mode

Step 2:
Now create another component MultipleVmodel.vue in which we call custom-input component.

<template> <div class="mt-20"> <custom-multiple-input v-model:username="username" v-model:email="email" v-model:mobile="mobile" /> <div class=" flex flex-col text-left w-1/3 bg-indigo-100 p-3 rounded shadow mx-auto " > <p class="font-medium text-indigo-800 mb-3">Value Entered By you:</p>  <div class="enterValue"><label for="username">Username : </label> {{ username }}</div> <div class="enterValue"><label for="email">Email : </label> {{ email }}</div> <div class="enterValue"><label for="mobile">Mobile : </label> {{ mobile }}</div> </div>  </div> </template>  <script> import CustomMultipleInput from "./CustomMultipleInput.vue"; import { ref } from "vue"; export default { components: { CustomMultipleInput }, setup() { const username = ref(""); const email = ref(""); const mobile = ref(""); return { username, email, mobile }; }, }; </script>  <style> .enterValue { padding-bottom: 5px; font-weight: 500; } </style> 
Enter fullscreen mode Exit fullscreen mode

Step 3:
Add the MultipleVModel.vue component in App.vue component

<template> <MultipleVmodel msg="Hello Vue 3 in CodeSandbox!" /> </template>  <script> import MultipleVmodel from "./components/MultipleVmodel.vue"; export default { name: "App", components: { MultipleVmodel: MultipleVmodel, }, }; </script>  <style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } </style> 
Enter fullscreen mode Exit fullscreen mode

You can also refer the demo in below sandbox.

🦄 ❤️ Thank you for reading. 🦄 ❤️

Top comments (0)