Reputation: 3951
I'm learning Vue with an online course and the instructor gave me an exercise to make an input text with a default value.
I completed it using v-model
but, the instructor chose v-bind:value
, and I don't understand why.
Can someone give me a simple explanation about the difference between these two and when it's better use each one?
Upvotes: 382
Views: 235876
Reputation: 28982
From here - Remember:
<input v-model="something">
is essentially the same as:
<input
v-bind:value="something"
v-on:input="something = $event.target.value"
>
or (shorthand syntax):
<input
:value="something"
@input="something = $event.target.value"
>
So v-model
is a two-way binding for form inputs. It combines v-bind
, which brings a js value into the markup and v-on:input
to update the js value. The js value must be present in your data
, or in an inject
.
Use v-model
when you can. Use v-bind
/v-on
when you must :-) I hope your answer was accepted.
v-model
works with all the basic HTML input types (text, textarea, number, radio, checkbox, select). You can use v-model
with input type=date
if your model stores dates as ISO strings (yyyy-mm-dd). If you want to use date objects in your model (a good idea as soon as you're going to manipulate or format them), do this.
v-model
has some extra smarts that it's good to be aware of. If you're using an IME ( lots of mobile keyboards, or Chinese/Japanese/Korean ), v-model will not update until a word is complete (a space is entered or the user leaves the field). v-input
will fire much more frequently.
v-model
also has modifiers .lazy
, .trim
, .number
, covered in the doc.
Upvotes: 686
Reputation: 21
VUE JS
Problem => Unnecessary value binding used alongside v-model. It will interfere with v-model's behavior.
<input v-model="signup.password" id="password" name="password" type="password" required="" value="">
It is problem.
Solve:
<input v-model="signup.password" id="password" name="password" type="password" required="">
Value cannot be used here if v-model
is used. Removing the value will solve the problem
Upvotes: 1
Reputation: 2140
In simple words:
v-model
: two way bindings
if you change input value, the bound data will be changed and vice versa.
v-bind:value
one way binding
You can change input value by changing bound data but you can't change bound data by changing input value through the element_.
Check out this simple example: https://jsfiddle.net/gs0kphvc/
Upvotes: 100
Reputation: 402
v-model
is for two way bindings means: if you change input value, the bound data will be changed and vice versa. But v-bind:value
is called one way binding that means: you can change input value by changing bound data but you can't change bound data by changing input value through the element.
v-model
is intended to be used with form elements. It allows you to tie the form element (e.g. a text input) with the data object in your Vue instance.
Example: https://jsfiddle.net/jamesbrndwgn/j2yb9zt1/1/
v-bind
is intended to be used with components to create custom props. This allows you to pass data to a component. As the prop is reactive, if the data that’s passed to the component changes then the component will reflect this change
Example: https://jsfiddle.net/jamesbrndwgn/ws5kad1c/3/
Upvotes: 10
Reputation: 4160
There are cases where you don't want to use v-model
. If you have two inputs, and each depend on each other, you might have circular referential issues. Common use cases is if you're building an accounting calculator.
In these cases, it's not a good idea to use either watchers or computed properties.
Instead, take your v-model
and split it as above answer indicates
<input
:value="something"
@input="something = $event.target.value"
>
In practice, if you are decoupling your logic this way, you'll probably be calling a method.
This is what it would look like in a real world scenario:
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<input :value="extendedCost" @input="_onInputExtendedCost" />
<p> {{ extendedCost }}
</div>
<script>
var app = new Vue({
el: "#app",
data: function(){
return {
extendedCost: 0,
}
},
methods: {
_onInputExtendedCost: function($event) {
this.extendedCost = parseInt($event.target.value);
// Go update other inputs here
}
}
});
</script>
Upvotes: 2
Reputation: 79
v-model
it is two way data binding, it is used to bind html input element when you change input value then bounded data will be change.
v-model is used only for HTML input elements
ex: <input type="text" v-model="name" >
v-bind
it is one way data binding,means you can only bind data to input element but can't change bounded data changing input element.
v-bind is used to bind html attribute
ex:
<input type="text" v-bind:class="abc" v-bind:value="">
<a v-bind:href="home/abc" > click me </a>
Upvotes: 7