DEV Community

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

Posted on

11

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. 🦄 ❤️

Image of Timescale

🚀 pgai Vectorizer: SQLAlchemy and LiteLLM Make Vector Search Simple

We built pgai Vectorizer to simplify embedding management for AI applications—without needing a separate database or complex infrastructure. Since launch, developers have created over 3,000 vectorizers on Timescale Cloud, with many more self-hosted.

Read full post →

Top comments (0)

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up