Vue.js-v模型和v-bind之间的差异


208

我正在通过在线课程学习Vue,导师给了我一个练习,使输入文本具有默认值。我使用v-model完成了此操作,但是讲师选择了v-bind:value,但我不明白为什么。

有人可以给我简单的解释一下两者之间的区别,什么时候最好使用它们?


8
v-model主要用于输入和表单投标,因此在处理各种输入类型时要使用它。v-bind指令允许您通过键入大多数情况下取决于数据模型中数据的JS表达式来产生一些动态值-因此,请考虑将v-bind用作要处理一些动态事物时应使用的指令。
Belmin Bedak '17

5
在某些情况下,您可以使用它们中的每一个。例如,有时不是:<div v-bind:class="{ active: isActive }"></div>-无法使用模型绑定html属性,而应使用v-bind指令。对于表单的元素,您将需要使用v-model指令-“它会根据输入类型自动选择正确的方法来更新元素。”
亚历山大

1
@Alexander短语“绑定HTML属性”帮助我更好地考虑了这一点。很高兴看到您在这方面有了一个更完整的答案,以了解这两种结构的实际情况。
汤姆·罗素

@Alexander Esp在组件dataprops... 的上下文中
Tom Russell

Answers:


428

这里开始 -请记住:

<input v-model="something">

本质上与以下内容相同:

<input
   v-bind:value="something"
   v-on:input="something = $event.target.value"
>

或(简写语法):

<input
   :value="something"
   @input="something = $event.target.value"
>

所以v-model是一个双向的表单输入绑定。它结合v-bind,这带来了一个JS值到标记,并v-on:input更新JS值

v-model可以的时候使用。在需要时使用v-bind/ v-on:-)我希望您的回答被接受。

v-model 适用于所有基本的HTML输入类型(文本,文本区域,数字,单选,复选框,选择)。如果模型将日期存储为ISO字符串(yyyy-mm-dd)v-modelinput type=date则可以使用with 。如果您想在模型中使用日期对象(一旦您要对它们进行操作或设置格式,是一个好主意),请执行此操作

v-model有一些额外的聪明之处,值得您注意。如果您使用的是IME(很多移动键盘,或者中文/日文/韩文),则v-model不会更新,直到单词完整(输入空格或用户离开字段)为止。v-input会更频繁地触发。

v-model也有修饰语.lazy.trim.number,覆盖的文档


33
'如果可以,请使用v模型。必要时使用v-bind / v-on。很棒的总结!非常感谢你!
尤川豪

v-model和之间有什么区别v-bind:xxx.sync
El Mac

2
@ElMac v模型是Vue组件和javascript模型之间的双向绑定。源(绑定的模型端)在Vue组件的数据中声明。这样,Vue允许您从组件中提取状态,然后直接从组件中修改此状态。这是状态管理的一种简单模式,是Vue的标志(在Angular和React中是困难/隐藏/不可能/不受欢迎的)。v-bind:xxx.sync是Vue组件与其父组件之间的双向绑定。状态保持封装状态。它“属于”父母。这不一定更好!
bbsimonbb,

45

简而言之 v-model绑定两种方式如果更改输入值,则绑定的数据将被更改,反之亦然

但是v-bind:value被称为一种方式绑定,这意味着:您可以通过更改绑定数据来更改输入值,但是不能通过element通过更改输入值来更改绑定数据

看看这个简单的例子:https : //jsfiddle.net/gs0kphvc/


'如果更改输入值,则绑定数据将更改,反之亦然。'-即使从小提琴示例中也无法理解“反之亦然”部分。你能解释一下吗?
Istiaque Ahmed

如果通过元素更改输入值,则绑定数据也将更改,并且如果通过例如Vue API更改绑定数据,则输入元素的值也将更改。
Madmadi

如何通过Vue API更改绑定数据?
Istiaque Ahmed

在拨弄例如,假设我们有改变DATA_SOURCE这样的方法this.data_source = 'Some new value'
Madmadi

通过data_source,您的意思是HTML从DOM中注入了HTML input,对吗?
Istiaque Ahmed

3

v模型
是数据绑定的两种方式,它用于在更改输入值时绑定html输入元素,然后绑定的数据将被更改。

v模型仅用于HTML输入元素

ex: <input type="text" v-model="name" > 

v-bind
是数据绑定的一种方式,意味着您只能将数据绑定到输入元素,而不能更改有界数据更改输入元素。 v-bind用于绑定html属性,
例如:
<input type="text" v-bind:class="abc" v-bind:value="">

<a v-bind:href="home/abc" > click me </a>

“ v-model这是两种方式的数据绑定”:这两种方式具体是什么?
Istiaque Ahmed

2
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/

希望这对您有基本的了解


1

在某些情况下,您不想使用v-model。如果您有两个输入,并且每个输入都相互依赖,则可能会有循环引用问题。常见的用例是您要构建会计计算器。

在这些情况下,使用观察者或计算属性不是一个好主意。

取而代之的v-model是按照上面的答案进行拆分

<input
   :value="something"
   @input="something = $event.target.value"
>

在实践中,如果您以这种方式将逻辑去耦,则可能会调用一个方法。

这是真实情况下的样子:

<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>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.