Vue.js - Différence entre v-model et v-bind

209

J'apprends Vue avec un cours en ligne et l'instructeur m'a donné un exercice pour faire un texte d'entrée avec une valeur par défaut. Je l'ai terminé en utilisant v-model mais, l'instructeur a choisi v-bind: value et je ne comprends pas pourquoi.

Quelqu'un peut-il me donner une explication simple sur la différence entre ces deux et quand il vaut mieux les utiliser chacun?

Gustavo Dias
la source
8
v-modelest principalement utilisé pour les enchères de saisie et de formulaire, utilisez-le donc lorsque vous traitez avec différents types de saisie. v-bindLa directive vous permet de produire une valeur dynamique en tapant une expression JS qui, dans la plupart des cas, dépend des données du modèle de données - pensez donc à v-bind comme directive que vous devez utiliser lorsque vous voulez traiter des choses dynamiques.
Belmin Bedak
5
Dans certains cas, vous pouvez utiliser chacun d'eux. Parfois non, par exemple: <div v-bind:class="{ active: isActive }"></div>- vous ne pouvez pas lier un attribut html à l'aide d'un modèle, vous devez utiliser une v-binddirective. Pour les éléments du formulaire, vous voudrez utiliser la v-modeldirective - "il choisit automatiquement la bonne façon de mettre à jour l'élément en fonction du type d'entrée."
Alexander
1
@Alexander L'expression "lier l'attribut HTML" m'a aidé à mieux y penser. Il serait bon de vous voir peser là-dessus avec une réponse plus complète sur ce qui se passe réellement avec ces deux constructions.
Tom Russell
@Alexander Esp dans le contexte du composant dataet props...
Tom Russell

Réponses:

430

D' ici - N'oubliez pas:

<input v-model="something">

est essentiellement le même que:

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

ou (syntaxe abrégée):

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

Il en v-modelva de même pour une liaison bidirectionnelle pour les entrées de formulaire . Il combine v-bind, ce qui apporte une valeur js dans le balisage, et v-on:inputpour mettre à jour la valeur js .

Utilisez v-modelquand vous le pouvez. Utilisez v-bind/ v-onquand vous devez :-) J'espère que votre réponse a été acceptée.

v-model fonctionne avec tous les types d'entrée HTML de base (texte, zone de texte, nombre, radio, case à cocher, sélectionnez). Vous pouvez utiliser v-modelavec input type=datesi votre modèle stocke les dates sous forme de chaînes ISO (aaaa-mm-jj). Si vous souhaitez utiliser des objets de date dans votre modèle (une bonne idée dès que vous allez les manipuler ou les formater), faites-le .

v-modela quelques astuces supplémentaires dont il est bon d'être conscient. Si vous utilisez un IME (beaucoup de claviers mobiles ou chinois / japonais / coréen), le v-model ne sera pas mis à jour tant qu'un mot n'est pas terminé (un espace est entré ou l'utilisateur quitte le champ). v-inputse déclenchera beaucoup plus fréquemment.

v-modela également des modificateurs .lazy, .trim, .number, couvert dans la doc .

bbsimonbb
la source
33
'Utilisez v-model quand vous le pouvez. Utilisez v-bind / v-on quand vous le devez ». Excellent résumé! Merci beaucoup!
尤川豪
Quelle est la différence entre v-modelet v-bind:xxx.sync?
El Mac
2
@ElMac v-model est une liaison bidirectionnelle entre un composant Vue et un modèle javascript. La source (le côté modèle de la liaison) est déclarée dans les données du composant Vue. Comme cela, Vue vous permet d'extraire l'état de vos composants, puis de modifier cet état directement à partir du composant. C'est un modèle simple de gestion d'état qui est une caractéristique de Vue (difficile / caché / impossible / découragé dans Angular et React). v-bind: xxx.sync est une liaison bidirectionnelle entre un composant Vue et son parent]. L'État reste encapsulé. Il «appartient» au parent. Ce n'est pas forcément mieux!
bbsimonbb
45

En mots simples v-modelest de deux voies fixations signifie: si vous modifiez la valeur d' entrée, les données liées sera modifiée et vice - versa .

mais v-bind:valueest appelé liaison unidirectionnelle, ce qui signifie: vous pouvez modifier la valeur d'entrée en modifiant les données liées, mais vous ne pouvez pas modifier les données liées en modifiant la valeur d'entrée via l'élément .

consultez cet exemple simple: https://jsfiddle.net/gs0kphvc/

Madmadi
la source
'si vous modifiez la valeur d'entrée, les données liées seront modifiées et vice versa. '- ne peut pas comprendre la partie' vice versa 'même à partir de l'exemple du violon. pouvez-vous l'expliquer?
Istiaque Ahmed
si vous modifiez la valeur d'entrée via l'élément, les données liées seront modifiées et aussi si vous modifiez les données liées via par exemple les API Vue, la valeur de votre élément d'entrée changerait.
Madmadi
comment changer les données liées via l'API Vue?
Istiaque Ahmed
Dans un exemple de violon, disons que nous avons une méthode qui change data_source comme cecithis.data_source = 'Some new value'
Madmadi
par data_source, vous voulez dire le HTML injecté dans DOM à partir input, non?
Istiaque Ahmed
3

v-model
c'est une liaison de données bidirectionnelle, il est utilisé pour lier l'élément d'entrée html lorsque vous modifiez la valeur d'entrée, puis les données limitées seront modifiées.

v-model est utilisé uniquement pour les éléments d'entrée HTML

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

v-bind
est une liaison de données à sens unique, ce qui signifie que vous ne pouvez lier des données qu'à l'élément d'entrée mais ne pouvez pas modifier les données bornées en modifiant l'élément d'entrée. v-bind est utilisé pour lier l'attribut html
ex:
<input type="text" v-bind:class="abc" v-bind:value="">

<a v-bind:href="home/abc" > click me </a>
Prashant Gurav
la source
'v-model, c'est une liaison de données bidirectionnelle': quelles sont ces 2 façons spécifiquement?
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/

J'espère que cela vous aidera à comprendre les bases

sda87
la source
1

Il y a des cas où vous ne voulez pas utiliser v-model . Si vous avez deux entrées et que chacune dépend l'une de l'autre, vous pourriez avoir des problèmes référentiels circulaires. Les cas d'utilisation courants sont si vous créez une calculatrice comptable.

Dans ces cas, ce n'est pas une bonne idée d'utiliser des observateurs ou des propriétés calculées.

Au lieu de cela, prenez votre v-modelet divisez-le comme indiqué ci-dessus

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

En pratique, si vous découplez votre logique de cette façon, vous appellerez probablement une méthode.

Voici à quoi cela ressemblerait dans un scénario réel:

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

Vincent Tang
la source