Tutorial

Using v-model for Two-Way Binding in Vue.js

Published on September 9, 2020
Default avatar

By Joshua Bemenderfer

Using v-model for Two-Way Binding in Vue.js

While we believe that this content benefits our community, we have not yet thoroughly reviewed it. If you have any suggestions for improvements, please let us know by clicking the “report an issue“ button at the bottom of the tutorial.

Vue’s two-way binding system takes one of the trickiest parts of developing a web application, user input synchronization, and makes it dead simple with v-model. The v-model directive updates the template whenever the model changes and updates data model whenever the template changes.

Two-way binding is a powerful feature that, if used properly, can significantly speed up your development process. It reduces the complexity of keeping user input consistent with the application data model.

In Vue, two-way binding is accomplished using the v-model directive.

Binding to Text Input Elements

To bind the value of an input element to a property of your component’s data, use v-model="dataProperty" like so.

Here’s the component’s data method:

data() {
  return {
    existentialQuestion: 'Am I truly an alligator?'  
  };
}

And the template:

<h2>My deepest, darkest question: {{existentialQuestion}}</h2>
<input v-model="existentialQuestion"/>

Here it is in a live demo: [codepen alligatorio poyLjqY]

Notice the input value starts out as Am I truly an alligator?, but when you change the input, the existentialQuestion property (and the h2 element) will update in real time.

Binding to Checkboxes and Radio Buttons

Checkboxes and radio buttons work pretty much like input elements. A checkbox binding will either be true or false, while a radio button binding will be whatever the contents of its value property is.

Additionally, a set of checkboxes can be bound to a single array, which will put the contents of their value property in the array if checked.

Single Checkbox Example

The component data…

data() {
  return {
    statementIsTrue: true  
  };
}

…and the template

<p>You have decided this statement is {{statementIsTrue}}</p>
<label>
  <input type="checkbox" v-model="statementIsTrue"/>
  Is this statement true?
</label>

…and try it live: [codepen alligatorio abNYvxd]

Multiple Checkbox Example

The component data…

data() {
  return {
    namesThatRhyme: []  
  };
}

…and the template

<p>A list of names that rhyme: {{namesThatRhyme.join(', ')}}</p>
<label>
  <input type="checkbox" value="Daniel" v-model="namesThatRhyme"/>
  Daniel
</label>
<label>
  <input type="checkbox" value="Nathaniel" v-model="namesThatRhyme"/>
  Nathaniel
</label>
<label>
  <input type="checkbox" value="Hubert" v-model="namesThatRhyme"/>
  Hubert
</label>

…and the demo: [codepen alligatorio NWNYGZE]

Radio Button Example

The component data…

  data() {
    return {
      howAreYouFeeling: "great"
    };
  }

…and the template

<p>How are you feeling today?</p>
  <label>
    <input type="radio" value="great" v-model="howAreYouFeeling" />
    great
  </label>
  <label>
    <input type="radio" value="wonderful" v-model="howAreYouFeeling" />
    wonderful
  </label>
  <label>
    <input type="radio" value="fantastic" v-model="howAreYouFeeling" />
    fantastic
  </label>
  <p>I am also feeling <em>{{howAreYouFeeling}}</em> today.</p>

Here it is in a demo: [codepen alligatorio gOreaVe]

Notes

  • By default, v-model is evaluated every time the input event is fired (ie. on keypress or paste.) If you’d rather wait until the user has finished inputting and unfocused the field, you can use the v-model.lazy modifier to have v-model listen to the change event instead.
  • If you’d like to cast user input to a number instead of a string, add the v-model.number modifier. You’ll have to handle casting to other types yourself.
  • The v-model.trim modifier will strip and leading or trailing whitespace from the bound string. This (obviously) cannot be used in conjunction with v-model.number.
  • While v-model=“dataProperty” seems like magic at first glance, it’s actually just short-hand for :value="dataProperty" @input="dataProperty = $event.target.value". As such, you can easily implement v-model support for your own components.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about us


About the authors
Default avatar
Joshua Bemenderfer

author

Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
1 Comments


This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Hi this works great but what if I want to set the model object programmatically? When I set the model programmatically I’m finding the UI does not get updated. Is there anything I can do?

Try DigitalOcean for free

Click below to sign up and get $200 of credit to try our products over 60 days!

Sign up

Join the Tech Talk
Success! Thank you! Please check your email for further details.

Please complete your information!

Get our biweekly newsletter

Sign up for Infrastructure as a Newsletter.

Hollie's Hub for Good

Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.

Become a contributor

Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

Welcome to the developer cloud

DigitalOcean makes it simple to launch in the cloud and scale up as you grow — whether you're running one virtual machine or ten thousand.

Learn more
DigitalOcean Cloud Control Panel