355 votes

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

Je suis en train d'apprendre Vue avec un cours en ligne et l'instructeur m'a donné un exercice pour faire une entrée de texte avec une valeur par défaut. Je l'ai réalisé 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 les deux et quand il est préférable d'utiliser chacun d'eux ?

11 votes

v-model est principalement utilisé pour la saisie et la soumission de formulaires. Utilisez-le donc lorsque vous avez affaire à différents types de saisie. v-bind La directive v-bind vous permet de produire une valeur dynamique en saisissant 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 à une directive que vous devez utiliser lorsque vous voulez traiter des éléments dynamiques.

6 votes

Dans certains cas, vous pouvez utiliser chacun d'entre eux. Parfois non, par exemple : <div v-bind:class="{ active: isActive }"></div> - vous ne pouvez pas lier l'attribut html en utilisant le modèle, vous devez utiliser v-bind de la directive. Pour les éléments de formulaire, vous voudrez utiliser la directive v-model qui "choisit automatiquement la manière correcte de mettre à jour l'élément en fonction du type d'entrée".

1 votes

Alexander La phrase "bind HTML attribute" m'a aidé à mieux réfléchir à cette question. Il serait bon de vous voir intervenir sur ce point avec une réponse plus complète sur ce qui se passe réellement avec ces deux constructions.

656voto

user1585345 Points 33

De aquí - Rappelez-vous :

<input v-model="something">

est essentiellement la même chose 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"
>

Alors v-model est un liaison bidirectionnelle pour les entrées de formulaire . Il combine v-bind qui apporte une valeur js dans le balisage, et v-on:input a mettre à jour la valeur js .

Utilisez v-model quand vous le pouvez. Utilisez v-bind / v-on quand il le faut :-) J'espère que votre réponse a été acceptée.

v-model fonctionne avec tous les types de saisie HTML de base (texte, zone de texte, nombre, radio, case à cocher, sélection). Vous pouvez utiliser v-model con input type=date si votre modèle stocke les dates sous forme de chaînes ISO (yyyy-mm-dd). Si vous voulez utiliser des objets date dans votre modèle (une bonne idée dès que vous allez les manipuler ou les formater), faites ceci .

v-model a des capacités supplémentaires dont il est bon d'être conscient. Si vous utilisez un IME (beaucoup de claviers mobiles, ou chinois/japonais/coréen), v-model ne sera pas mis à jour tant qu'un mot n'est pas complet (un espace est saisi ou l'utilisateur quitte le champ). v-input se déclencheront beaucoup plus fréquemment.

v-model a également des modificateurs .lazy , .trim , .number couvert par le doc .

62 votes

Utilisez v-model quand vous le pouvez. Utilisez v-bind/v-on quand vous le devez'. Excellent résumé ! Merci beaucoup !

0 votes

Quelle est la différence entre v-model y v-bind:xxx.sync ?

3 votes

@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. De cette façon, Vue vous permet d'extraire l'état de vos composants, puis de modifier cet état directement à partir du composant. Il s'agit d'un modèle simple de gestion de l'é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 nécessairement mieux !

92voto

Madmadi Points 96

En termes simples v-model est pour fixations à double sens signifie : si vous modifiez la valeur d'entrée, les données liées seront modifiées et vice versa. .

mais v-bind:value s'appelle liaison à sens unique c'est-à-dire : vous pouvez changer la valeur d'entrée en changeant les données liées mais vous ne pouvez pas changer les données liées en changeant la valeur d'entrée à travers l'élément. .

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

2 votes

' si vous modifiez la valeur d'entrée, les données liées seront modifiées et vice versa. Je n'arrive pas à comprendre la partie 'vice versa', même dans l'exemple du violon. pouvez-vous l'expliquer ?

0 votes

Si vous modifiez la valeur de l'entrée par le biais de l'élément, les données liées seront modifiées. De même, si vous modifiez les données liées par le biais, par exemple, des API de Vue, la valeur de l'élément d'entrée sera modifiée.

0 votes

Comment modifier les données liées via l'API Vue ?

7voto

Prashant Gurav Points 69

Modèle en V
Il s'agit d'une liaison de données bidirectionnelle, utilisée pour lier l'élément d'entrée html lorsque vous changez la valeur d'entrée, les données lié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
Il s'agit d'une liaison de données à sens unique, ce qui signifie que vous pouvez seulement lier les données à l'élément d'entrée mais que vous ne pouvez pas changer les données liées à 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>

0 votes

V-model est une liaison de données à double sens : quels sont ces deux sens ?

6voto

sda87 Points 179

V-model est destiné aux liaisons bidirectionnelles, ce qui signifie que si vous modifiez la valeur d'entrée, les données liées seront modifiées et vice versa. Mais v-bind:value est appelé liaison à sens unique, ce qui signifie que vous pouvez changer la valeur d'entrée en changeant les données liées, mais vous ne pouvez pas changer les données liées en changeant la valeur d'entrée à travers l'élément.

v-model est destiné à être utilisé avec des éléments de formulaire. Il vous permet de lier l'élément de formulaire (par exemple, une entrée de texte) avec l'objet de données dans votre instance Vue.

Ejemplo: https://jsfiddle.net/jamesbrndwgn/j2yb9zt1/1/

v-bind est destiné à être utilisé avec des composants pour créer des props personnalisés. Cela vous permet de transmettre des données à un composant. Comme l'accessoire est réactif, si les données transmises au composant changent, le composant reflétera ce changement.

Example: https://jsfiddle.net/jamesbrndwgn/ws5kad1c/3/

J'espère que cela vous aidera à comprendre les principes de base.

2voto

Vincent Tang Points 694

Il y a des cas où vous ne voulez pas utiliser v-model . Si vous avez deux entrées, et qu'elles dépendent l'une de l'autre, vous pouvez avoir des problèmes de référence circulaire. Le cas le plus courant est celui d'une calculatrice de comptabilité.

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

Au lieu de cela, prenez votre v-model et le diviser comme indiqué dans la réponse ci-dessus

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

En pratique, si vous découplez votre logique de cette manière, vous appellerez probablement une méthode.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X