Fermer

juin 6, 2018

Remplacement de jQuery avec Vue –


Je suis prêt à parier qu'il y a beaucoup de développeurs qui recherchent encore jQuery lorsqu'ils sont chargés de construire des applications simples. Il y a souvent des moments où nous devons ajouter de l'interactivité à une page, mais atteindre un framework JavaScript semble être trop compliqué – avec tous les kilo-octets supplémentaires, le standard, les outils de construction et les bundlers de modules. Y compris jQuery d'un CDN semble comme une évidence.

Dans cet article, je voudrais essayer de vous convaincre que l'utilisation de Vue.js (appelé Vue à partir d'ici) , même pour des projets relativement basiques, ne doit pas être un casse-tête, et vous aidera à écrire de meilleurs codes plus rapidement. Nous allons prendre un exemple simple, le coder dans jQuery, puis le recréer dans Vue étape par étape.

Ce que nous construisons

Pour cet article, nous allons construire une facture en ligne de base , en utilisant ce modèle open-source de Sparksuite . Heureusement, cela devrait apporter un changement rafraîchissant à partir d'une autre liste de choses à faire, et fournir assez de complexité pour démontrer les avantages d'utiliser quelque chose comme Vue tout en étant facile à suivre.

 Screenshot of template

rendre cela interactif en fournissant des entrées article, prix unitaire et quantité, et faire recalculer automatiquement la colonne Prix lorsque l'une des valeurs change. Nous allons également ajouter un bouton pour insérer de nouvelles lignes vides dans la facture, et un champ Total qui sera automatiquement mis à jour lorsque nous éditerons les données.

J'ai modifié le modèle pour que HTML pour une seule ligne (vide) ressemble maintenant à ceci:


  
   $ 
  
   $ 0.00 

jQuery

Donc, tout d'abord, regardons comment on pourrait faire ça avec jQuery.

 $ ('table'). on ('mouseup keyup', 'input [type=number]', calculateTotaux);

Nous attachons un écouteur à la table elle-même, qui exécutera la fonction calculateTotals lorsque les valeurs Coût unitaire ou Quantité sont modifiées: [19659012] function calculateTotals () {
  const subtotals = $ ('. item'). map ((idx, val) => calculateSubtotal (val)). get ();
  const total = subtotals.reduce ((a, v) => a + nombre (v), 0);
  $ ('. total td: eq (1)'). text (formatAsCurrency (total));
}

Cette fonction recherche toutes les lignes d'éléments de la table et les boucle sur elles, en passant chaque ligne à une fonction calculateSubtotal puis en additionnant les résultats. Ce total est ensuite inséré dans l'endroit pertinent sur la facture.

 function calculateSubtotal (row) {
  const $ row = $ (ligne);
  Entrées const = $ row.find ('entrée');
  const sous-total = entrées [1] .value * entrées [2] .value;

  $ row.find ('td: last'). text (formatAsCurrency (sous-total));

  retourner le sous-total;
}

Dans le code ci-dessus, nous saisissons une référence à tous les s dans la rangée et multiplions les 2e et 3e ensemble pour obtenir le sous-total. Cette valeur est ensuite insérée dans la dernière cellule de la ligne.

 function formatAsCurrency (amount) {
  return `$$ {Number (amount) .toFixed (2)}`;
}

Nous avons aussi une petite fonction d'aide que nous utilisons pour nous assurer que les sous-totaux et le total sont formatés à deux décimales et préfixés d'un symbole monétaire.

 $ ('.btn-add-row' ) .on ('clic', () => {
  const $ lastRow = $ ('. item: last');
  const $ newRow = $ lastRow.clone ();

  $ newRow.find ('input'). val ('');
  $ newRow.find ('td: last'). text ('$ 0.00');
  $ newRow.insertAfter ($ lastRow);

  $ newRow.find ('input: first'). focus ();
});

Enfin, nous avons un gestionnaire de clic pour notre bouton Ajouter une ligne . Ce que nous faisons ici est de sélectionner la dernière ligne d'items et de créer un doublon. Les entrées de la ligne clonée sont définies par défaut et insérées en tant que nouvelle dernière ligne. Nous pouvons aussi être gentils avec nos utilisateurs et mettre l'accent sur la première entrée, prête pour qu'ils commencent à taper.

Voici la démo terminée de jQuery:

Voir le stylo jQuery Invoice de SitePoint ( @SitePoint ) le CodePen .

Inconvénients

Alors quel est le problème avec ce code tel qu'il est, ou plutôt, quoi de mieux?

Vous avez peut-être entendu Certaines de ces bibliothèques plus récentes, comme Vue et Réagir, prétendent être déclaratives plutôt qu'impératives. Certainement en regardant ce code jQuery, la majorité de celui-ci se lit comme une liste d'instructions sur la façon de manipuler le DOM. Le but de chaque section de code – le «quoi» – est souvent difficile à établir à travers les détails de «comment» cela est fait. Bien sûr, nous pouvons clarifier l'intention du code en le décomposant en fonctions bien nommées, mais ce code va encore faire un effort pour analyser mentalement si vous y revenez après un certain temps.

L'autre problème avec le code comme ceci est que nous gardons notre état d'application dans le DOM lui-même. Les informations sur les articles commandés n'existent que dans le cadre du code HTML constituant l'interface utilisateur. Cela peut ne pas sembler un gros problème lorsque nous affichons uniquement les informations dans un seul endroit, mais dès que nous commençons à avoir besoin d'afficher les mêmes données à plusieurs endroits dans notre application, il devient de plus en plus complexe de s'assurer que chaque pièce est maintenu en synchronisation. Bien que rien sur jQuery ne nous empêche de garder notre état en dehors du DOM et d'éviter ces problèmes, les bibliothèques telles que Vue fournissent des fonctionnalités et une structure qui facilitent la création d'une bonne architecture et d'écriture plus propre, plus de code modulaire

Conversion en vue

Alors, comment allons-nous recréer cette fonctionnalité en utilisant Vue?

Comme je l'ai mentionné plus tôt, Vue n'exige pas que nous utilisions un bundler de module, un transpiler, ou d'opter- dans leurs composants de fichiers uniques ( .vue fichiers) afin de commencer. Comme jQuery, nous pouvons simplement inclure la bibliothèque d'un CDN. Commençons par échanger la balise de script:

   

La prochaine chose à faire est de créer une nouvelle instance de Vue:

 const app = new Vue ({
  el: 'table'
});

La seule option que nous devons fournir ici est el qui est un sélecteur (comme nous utiliserions jQuery) qui identifie la partie du document que nous voulons que Vue gère.

Vue en charge de quoi que ce soit de la page entière (pour une application d'une seule page, par exemple) ou d'un seul

. Pour notre exemple de facture, nous donnerons le contrôle de vue de la table HTML.

Data

Ajoutons également les données pour les trois lignes d'exemple à notre instance de Vue:

 const app = new Vue ({
  el: 'table',
  Les données: {
    articles: [
      { description: 'Website design', quantity: 1, price: 300 },
      { description: 'Hosting (3 months)', quantity: 1, price: 75 },
      { description: 'Domain name (1 year)', quantity: 1, price: 10 },
    ]
  }
});

La propriété data est l'endroit où nous stockons l'état de notre application. Cela inclut non seulement les données avec lesquelles nous voulons que notre application travaille, mais également les informations sur l'état de l'interface utilisateur (par exemple, quelle section est actuellement active dans un groupe d'onglets ou si un accordéon est développé ou contracté).

Vue nous encourage à garder l'état de notre application séparé de sa présentation (ie le DOM) et centralisé en un seul endroit – une seule source de vérité.

Modifier le modèle

Maintenant, configurons notre modèle pour afficher les éléments de notre objet de données. Comme nous l'avons dit à Vue, nous voulons contrôler la table, nous pouvons utiliser sa syntaxe de template dans le HTML pour dire à Vue comment la rendre et la manipuler.

En utilisant l'attribut v-for peut rendre un bloc de HTML pour chaque élément de notre tableau :

  


Vue répétera ce balisage pour chaque élément du tableau (ou de l'objet) que vous passerez à la construction v-for vous permettant de référencer chaque élément à l'intérieur de la boucle – dans ce cas, item . Comme Vue observe toutes les propriétés de l'objet data il ré-affichera dynamiquement le balisage comme le contenu de items . Tout ce que nous avons à faire est d'ajouter ou supprimer des éléments à l'état de notre application, et Vue prend soin de mettre à jour l'interface utilisateur.

Nous devrons également ajouter s pour que l'utilisateur remplisse la description, prix unitaire, et quantité de l'article:


 $ 

 $ {{item.price * item.quantity}} 

Ici, nous utilisons l'attribut v-model pour établir une liaison bidirectionnelle entre les entrées et les propriétés de notre modèle de données. Cela signifie que toute modification des entrées mettra à jour les propriétés correspondantes sur le modèle d'article, et vice versa.

Dans la dernière cellule, nous utilisons des doubles accolades {{}} pour sortir du texte . Nous pouvons utiliser n'importe quelle expression JavaScript valide dans les accolades, donc nous multiplions deux de nos propriétés d'objet ensemble et produisons le résultat. Une fois que Vue observe notre modèle de données, une modification de l'une de ces propriétés entraînera une réévaluation automatique de l'expression.

Événements et méthodes

Nous avons maintenant configuré notre modèle pour afficher nos éléments collection, mais comment allons-nous ajouter de nouvelles lignes? Comme Vue rendra tout ce qui est dans éléments pour rendre une ligne vide, nous avons juste besoin de pousser un objet avec les valeurs par défaut que nous voulons dans le tableau items . que nous pouvons accéder à partir de notre modèle, nous devons les passer à notre instance de Vue en tant que propriétés d'un objet méthodes :

 const app = new Vue ({
  // ...
  méthodes: {
    myMethod () {}
  },
  // ...
})

Définissons une méthode addRow que nous pouvons appeler pour ajouter un nouvel élément à notre tableau items :

 methods: {
  ajouter une rangée() {
    this.items.push ({description: '', quantité: 1, prix: 0});
  },
},

Notez que toutes les méthodes que nous créons sont automatiquement liées à l'occurrence de Vue elle-même, donc nous pouvons accéder aux propriétés de notre objet et d'autres méthodes, comme . 19659007] Donc, maintenant que nous avons notre méthode, comment l'appelons-nous quand on clique sur le bouton Ajouter une ligne ? La syntaxe pour ajouter des écouteurs d'événement à un élément du modèle est v-on: nom-événement .

 

Vue fournit également un raccourci pour nous afin que nous puissions utiliser @ à la place de v-on: comme je l'ai montré dans le code ci-dessus. Pour le gestionnaire, nous pouvons spécifier n'importe quelle méthode de notre instance de Vue.

Propriétés calculées

Maintenant tout ce que nous devons faire est d'afficher le total général en bas de la facture. Potentiellement, nous pourrions le faire dans le modèle lui-même: comme je l'ai mentionné plus tôt, Vue nous permet de mettre toute déclaration JavaScript entre accolades. Cependant, il est préférable de ne rien ajouter à la logique très basique de nos modèles. c'est plus propre et plus facile à tester si nous gardons cette logique séparée.

Nous pourrions utiliser une autre méthode pour cela, mais je pense qu'une propriété calculée convient mieux. Similaire à la création de méthodes, nous transmettons à notre objet Vue un objet calculé contenant les fonctions dont nous voulons utiliser les résultats dans notre modèle:

 const app = new Vue ({
  // ...
  calculé: {
    total() {
      return this.items.reduce ((acc, item) => acc + (article.prix * article.quantité), 0);
    }
  }
});

Maintenant, nous pouvons référencer cette propriété calculée dans notre modèle:


  
   Total: $ {{total}} 

Comme vous l'avez peut-être déjà remarqué, les propriétés calculées peuvent être traitées comme si elles étaient des données; nous ne devons pas les appeler avec des parenthèses. Mais, l'utilisation de propriétés calculées a un autre avantage: Vue est assez intelligent pour mettre en cache la valeur renvoyée et réévaluer la fonction uniquement si l'une des propriétés de données dépend des changements.

Si nous utilisions une méthode pour résumer Total général, le calcul sera effectué chaque fois que le modèle a été rendu. Comme nous utilisons une propriété calculée, le total n'est recalculé que si l'un des champs ou prix de l'élément est modifié

Filtres

Vous avez peut-être détecté avoir un petit bug dans notre implémentation. Alors que les coûts unitaires sont des nombres entiers, notre total et nos sous-totaux sont affichés sans les centimes. Ce que nous voulons vraiment, c'est que ces chiffres soient toujours affichés avec deux décimales.

Plutôt que de modifier à la fois le code qui calcule les sous-totaux et le code qui calcule le total général, Vue nous fournit une bonne façon de traiter

Comme vous l'avez peut-être déjà deviné, pour créer un filtre, nous passons juste un objet avec cette clé à notre instance de Vue:

 const app = new Vue ({
  // ...
  filtres: {
    devise (valeur) {
      return value.toFixed (2);
    }
  }
});

Ici, nous avons créé un filtre très simple appelé currency qui appelle àFixed (2) sur la valeur qu'il reçoit et renvoie le résultat. Nous pouvons l'appliquer à n'importe quelle sortie de notre template comme ceci:

 Total: $ {{total | devise}} 

Voici la démo de Vue terminée:

Voir le stylo Vue Facture par SitePoint ( @SitePoint ) le CodePen .

Résumé [19659004] En comparant les deux versions du code côte à côte, deux choses ressortent de l'application Vue:

  • La séparation claire entre l'interface utilisateur et la logique / données qui la pilotent : le code est beaucoup plus facile pour comprendre, et se prête à des tests plus faciles
  • L'interface utilisateur est déclarative : vous avez seulement besoin de vous préoccuper de ce que vous voulez voir, pas comment manipuler le DOM pour l'atteindre.

La taille (en Ko ) des deux bibliothèques est presque identique. Bien sûr, vous pouvez alléger un peu jQuery avec une construction personnalisée, mais même avec un projet relativement simple comme notre exemple de facture, je pense que la facilité de développement et la lisibilité du code justifient la différence.

Vue peut aussi faire beaucoup plus que nous avons couvert ici. Sa force réside dans le fait de vous permettre de créer des composants d'interface utilisateur modulaires et réutilisables qui peuvent être composés dans des applications frontales sophistiquées. Si vous êtes intéressé à plonger plus profondément dans Vue, je vous recommande de vérifier Se lever et courir avec le cadre Vue.js 2.0 .




Source link