Mastering the V-Model in Vue 3: Building Reactive and Interactive User Interfaces

Godwin MartinsGodwin Martins
5 min read

Table of contents

The V-Model in Vue 3 is a powerful tool for building dynamic user interfaces. It allows developers to create reusable components that can be easily integrated into a variety of different applications. This article will take a closer look at the V-Model and how it works in Vue 3.

The V-Model creates a relationship between the data in the instance/component and a form input, so you can dynamically update values, called two-way binding. - Sarah Drasner

The V-Model is essentially a two-way data binding system that allows for easy communication between the view and the model. In Vue 3, the model is represented by the component's data object, while the view is represented by the template. When the user interacts with the view, the V-Model updates the data object accordingly, and vice versa.

One of the main advantages of the V-Model is that it allows for a clear separation of concerns between the view and the model. This makes it easy to update and maintain the application as it grows and evolves. Additionally, the V-Model makes sharing data between different components easy, which can be useful for creating complex and interactive user interfaces.

To use the V-Model in Vue 3, you first need to define the data object for your component. This can be done using the data option when defining the component. For example, if you have a component, you could define its data object like this:

data() {
  return {
    message: 'Hello, Vue 3!'
  }
}

Once you have defined the data object, you can use the v-model directive in your template to bind the view to the data object. For example, you could use the v-model directive to bind an input field to the message property of the data object like this:

<template>
  <div>
    <input v-model="message" />
    <p>{{ message }}</p>
  </div>
</template>

In this example, when the user types something into the input field, the value of the message property will be updated, and the text in the <p> tag will change accordingly.

It's worth noting that v-model internally uses v-bind and v-on to bind the element, So instead of v-model you could use v-bind and v-on.

Copy code<template>
  <div>
    <input :value="message" @input="message = $event.target.value" />
    <p>{{ message }}</p>
  </div>
</template>

In addition to standard HTML elements, the V-Model can also be used with custom components. To do this, you can define a model option when defining the component, which tells Vue how to update the data object when the component emits an event. For example, you could define a custom component like this:

Vue.component('my-counter', {
  template: `
    <button @click="count++">{{ count }}</button>
  `,
  data() {
    return {
      count: 0
    }
  },
  model: {
    prop: 'count',
    event: 'increment'
  }
})

In this example, the my-counter component has a count property and an increment event. When the user clicks the button, the count property is incremented and the increment event is emitted. To use this component in another template, you can use the v-model directive like this:

Copy code<template>
  <div>
    <my-counter v-model="counterValue"></my-counter>
    <p>{{ counterValue }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      counterValue: 0
    }
  }
}
</script>

In this example, the counterValue property is bound to the count property of the my-counter component using the v-model directive. When the user clicks the button, the counterValue will be incremented and the text in the <p> tag will change accordingly.

The V-Model directive can also create a two-way binding on form elements other than a textbox. We may want to add a two-way binding to a checkbox, a radio button, etc. When adding a V-model to a checkbox input element, the V-model directive binds the value of the checkbox to a data property in the Vue instance. When the checkbox is checked or unchecked, the corresponding data property in the Vue instance will be updated accordingly.

Here's an example of using a v-model on a checkbox

<template>
    <div>
        <input id='select' type='check' v-model='isChecked'/>
        <label for='select'>{{isChecked}}</lable>
    </div>
</template>
<script>
    export default {
        data(){
            return{ isChecked: false}
        }
    }
</script>

In this example, the v-model directive is used to bind the isChecked data property to the checkbox input element. When it is checked, the isChecked property will be set to true and when it is unchecked, the isChecked property will be set to false.

Also, we can create an array of data and bind it to every input we want to add to that array. This way, the instance object captures the true values and represents them in the array by its value name.

Here's an example of how we can achieve this.

<template>
    <div>
       <h3> Select Your Preferred framework</h3> 
        <div class="input-group">
            <input id="react" value="ReactJs" type="check" v-model="checked"/>
            <label for='react'>React</label>
        </div>
        <div class="input-group">
            <input id="vue" value="VueJs" type="check" v-model="checked"/>
            <label for='vue'>VueJs</label>
        </div>
        <div class="input-group">
            <input id="anguler" value="AngularJs" type="check" v-model="checked"/>
            <label for='anguler'>React</label>
        </div>
        <span> Checked: {{checked}}</span>
    </div>
</template>
<script>
    export default {
        data(){
            return{checked: []}
        }
    }
</script>

In this example, we have the checked array that gets appended when a checkbox is selected or removed from when a checkbox is deselected.

In conclusion, the V-Model in Vue 3 is a powerful tool for building dynamic user interfaces. It allows for easy communication between the view and the model and allows sharing of data between different components. With the V-Model, developers can create reusable and maintainable components that can be easily integrated into a variety of different applications.

1
Subscribe to my newsletter

Read articles from Godwin Martins directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Godwin Martins
Godwin Martins

I am a developer from Edo State, Nigeria.