69 votes

Utilisation de lodash dans tous les modèles de composants Vue

Puis-je utiliser lodash _ dans tous mes composants Vue ?

par exemple :

J'ai organisé les composants comme suit :

App.vue > Parent.vue > Child.vue

Je voudrais que tous mes composants aient accès _ lodash sans défini dans chaque composant vm data

\===

J'essaie également d'utiliser Mixins . il fonctionne. mais le résultat n'est pas attendu comme ceci _().isEmpty() au lieu de _.isEmpty()

4 votes

Il est préférable d'inclure tous les modules requis dans le composant.

0 votes

Pourriez-vous être plus concis ? Où voulez-vous utiliser underscore exactement ? Dans vos modèles ou simplement dans vos méthodes / logique de composant ? Si vous voulez réduire la redondance, il me semble correct d'ajouter une bibliothèque apatride comme underscore JS à l'espace de nom global.

0 votes

@Jeff y a-t-il un moyen de le réutiliser ?

96voto

anthonygore Points 2611

Certaines des réponses actuelles peuvent fonctionner dans votre scénario, mais elles ont des inconvénients :

  • Ajoutant à la window signifie que votre projet Vue ne peut pas être rendu par le serveur, car les serveurs n'ont pas accès à l'objet window objet.
  • L'importation dans chaque fichier fonctionne bien, mais cela peut être pénible si vous devez vous rappeler de le faire dans chaque fichier.

Une autre approche consiste à ajouter votre bibliothèque au prototype Vue. Tous les composants héritent de ce prototype et pourront donc accéder à votre bibliothèque à partir de la balise this mot-clé.

import _ from 'lodash';    
Object.defineProperty(Vue.prototype, '$_', { value: _ });

Maintenant, lodash est disponible comme méthode d'instance pour tous les composants. Dans un fichier .vue, vous pouvez le faire sans importer quoi que ce soit :

export default {
  created() {
    console.log(this.$_.isEmpty(null));
  }
}

L'avantage d'utiliser Object.defineProperty plutôt qu'une affectation de propriété normale est que vous pouvez définir un descripteur qui vous permet de rendre la propriété en lecture seule, ce qu'elle sera par défaut. Cela empêche les composants consommateurs de l'écraser.

Ce point est expliqué plus en détail dans cet article de blog (que j'ai écrit).

Note : L'inconvénient de cette approche est que vous obtenez l'intégralité de la bibliothèque Lodash, même si vous n'avez besoin que d'une ou deux fonctions. Si c'est un problème, il est préférable d'utiliser import { reduce, whatever } from "lodash"; en haut du fichier qui en a besoin.

8 votes

Pour info - on peut écrire comme Vue.prototype.$lodash = lodash

0 votes

Merci. J'ai aliasé lodash avec $_

0 votes

J'ai ajouté ma solution ci-dessous en utilisant le plugin Webpack ProvidePlugin, ce qui, à mon avis, est une façon encore plus propre et plus simple de faire les choses.

31voto

Pantelis Peslis Points 8288

Vous pourriez importer le lodash dans chaque composant :

<script>
  import _ from 'lodash'

  export default {
    methods: {
      test (value) {
        return _.isEmpty(value)
      }
    }
  }
</script>

0 votes

L'exemple de votre code ne fait qu'envelopper isEmpty qu'en est-il des autres méthodes lodash ?

0 votes

C'est juste un exemple basé sur le vôtre. Vous pourriez remplacer le isEmpty avec n'importe quel lodash méthode.

2 votes

L'utilisation de l'importation est la bonne méthode si vous utilisez le code (_) dans le composant enfant.

22voto

antongorodezkiy Points 76

Pour les modèles en ligne séparés du code du module js avec lequel ils doivent fonctionner :

  Vue.component('some-tag', {
    computed: {
      _() {
        return _;
      }
    }
  });

Et ensuite vous pouvez l'utiliser dans le modèle dans "natif" chemin - _.isEmpty(value) .

12voto

Brandon Ferens Points 129

Vous pourriez importer lodash globalement comme ceci

window._ = require('lodash');

Une fois que cela a été importé, vous aurez accès à _ de n'importe où.

4 votes

J'ai rétrogradé parce que la fenêtre est indéfinie lorsque le serveur rend l'application.

1 votes

N'oubliez pas non plus d'ajouter le code ci-dessous dans .eslintrc.js sinon ESLint se plaindra toujours à propos du fichier _ is undefined . globals: { _: false, },

2 votes

J'ai voté en haut et je pense que cela devrait être sérieusement considéré parce que 1) dans une application non triviale, vous rencontrez toutes sortes de problèmes lorsque l'instance de Vue n'est pas encore disponible mais que vous avez besoin de la bibliothèque 2) peu de gens ont vraiment besoin de s'inquiéter du rendu du serveur, cela semble être une objection pédante sans raison.

11voto

newms87 Points 47

Une approche simple qui a fonctionné pour moi :

Vue.set(Vue.prototype, '_', _);

Cela devrait vous permettre d'utiliser _ dans tous les modèles de composants et instances Vue.

1 votes

Cette solution ne fonctionne que pour l'un de mes projets, pas dans un autre, je ne sais pas pourquoi... bizarre...

0 votes

J'aime cette solution parce que vous pouvez l'utiliser uniquement dans le composant, et non dans l'ensemble du site. Comme certains sites sur lesquels j'ai travaillé utilisent à la fois lodash et underscore, une solution globale ne fonctionnerait pas dans cette situation.

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