2016-06-08 20 views
22

Posso usare lodash _ in tutti i miei componenti Vue?Utilizzo di lodash in tutto il modello di componente vue

ad esempio:

ho componenti organizzata come di seguito:

App.vue>Parent.vue>Child.vue

Vorrei tutta la mia componente può accedere _ lodash senza definito in ogni sua componente vm data

===

Sto anche provando a usare Mixins. Funziona. ma il risultato non previsto come questo _().isEmpty() invece di _.isEmpty()

+1

È consigliabile includere tutti i moduli richiesti all'interno del componente – Jeff

+0

Potrebbe essere più conciso? Dove esattamente vuoi usare il carattere di sottolineatura? nei tuoi modelli o solo nella tua logica di metodi/componenti? Se si vuole ridurre la ridondanza mi sembra ovvio se si aggiunge una libreria senza stato come underscore JS allo spazio dei nomi globale. –

+0

@Jeff esiste un modo per riusarlo? – antoniputra

risposta

22

Alcune delle risposte attuali può funzionare nel vostro scenario, ma non sono "buone pratiche":

  • L'aggiunta all'oggetto window significa che il tuo progetto Vue non può essere reso come server, perché i server non hanno accesso all'oggetto window.
  • L'importazione in ogni file funzionerà, ma è un problema perché devi ricordarti di farlo in ogni file.

Un approccio migliore è aggiungere la libreria al prototipo Vue.Tutti i componenti ereditano da questo in modo che ora saranno tutti in grado di accedere alla libreria dalla parola chiave this.

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

Ora il lodash è disponibile come metodo di istanza per tutti i componenti. In un file .vue si può fare questo senza importare nulla:

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

Il vantaggio di utilizzare Object.defineProperty piuttosto che un'assegnazione di proprietà normale è che si può definire un descrittore, che ti permette di fare la proprietà di sola lettura, che sarà di default.

Questo è più ampiamente spiegato in this blog post (che ho scritto).

+0

Fantastico, adoro questo approccio! – antoniputra

+0

Questo sembra il modo giusto per farlo - grazie! – DogCoffee

+5

FYI - può scrivere come Vue.prototype. $ Lodash = lodash – DogCoffee

14

Si potrebbe importare il lodash in ogni componente:

<script> 
    import _ from 'lodash' 

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

l'esempio del tuo codice è solo avvolgendo il metodo 'isEmpty'. che ne dici degli altri metodi di lodash? – antoniputra

+0

Questo è solo un esempio basato sul tuo. È possibile sostituire 'isEmpty' con qualsiasi metodo' lodash'. –

+0

hmm. Capisco ora .. comunque, grazie per la risposta .. – antoniputra

9

Per i modelli in linea separate dal codice del modulo js dovrebbe funzionare con:

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

E quindi è possibile utilizzarlo nel modello in "nativo" modo - _.isEmpty(value).

11

Si potrebbe importare lodash a livello globale come questo

window._ = require('lodash'); 

volta che è stato importato, si avrà accesso a _ da qualsiasi luogo.

+0

Grazie. questa è un'ottima soluzione usando lo spazio dei nomi 'window' – antoniputra

+0

Penso che questa sia la risposta corretta per il mio caso. – antoniputra

+1

Ho downvoted perché la finestra non è definita quando il server esegue il rendering dell'app. – anthonygore

1

È possibile utilizzare plug-in/mixin come questo.

import _ from 'lodash'; 
exports default { 
    install : function(Vue, options){ 
     Vue.mixin({ 
      computed : { 
       "_" : function(){ 
        return _; 
       } 
      } 
     }); 
    } 
} 
1

Check out vue-lodash !! È un nuovo involucro per l'utilizzo di lodash in vue. Si può chiamare usando

Vue ._. Casuale (20) // per ottenere numero casuale compreso tra 20

questo ._. Casuale (20) // o altro metodo che si desidera utilizzare

in uno dei file del componente :)

+2

Funziona, ma hai davvero bisogno di un altro modulo nel tuo progetto per aggiungere qualcosa che può essere aggiunto manualmente con una linea? – anthonygore

+1

Penso che stiate facendo un buon punto, ma dipende dalla persona. Certo, alcune persone potrebbero voler usarlo spesso in un grande progetto che contiene molti file .vue, ma alcuni potrebbero usarlo solo per un componente .vue. Proprio come l'idea di avere vue-axios. Non è necessario ma in alcuni casi è sicuramente conveniente! :) – Ewing

4

Un approccio semplice che ha funzionato per me:

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

Questo dovrebbe consentire di utilizzare _ in tutti i modelli di componenti e le istanze VUE.

Problemi correlati