Vue.js la Prise de fonctions d'assistance à l'échelle mondiale à un seul fichier de composants
J'ai Vue 2 du projet qui a beaucoup de (50+) fichier unique des composants. J'utilise Vue-Routeur pour le routage et Vuex pour l'état.
Il y a un fichier appelé helpers.js, qui contient un tas de fonctions d'usage général, comme la mise en majuscule de la première lettre d'une chaîne. Ce fichier ressemble à ceci:
export default {
capitalizeFirstLetter(str) {
return str.charAt(0).toUpperCase() + str.slice(1);
}
}
Mon main.js fichier d'initialisation de l'application:
import Vue from 'vue'
import VueResource from "vue-resource"
import store from "./store"
import Router from "./router"
import App from "./components/App.vue"
Vue.use(VueResource)
const app = new Vue({
router: Router,
store,
template: '<app></app>',
components: { App }
}).$mount('#app')
Mon App.vue fichier contient le modèle:
<template>
<navbar></navbar>
<div class="container">
<router-view></router-view>
</div>
</template>
<script>
export default {
data() {
return {
//stuff
}
}
}
</script>
Je puis avoir un tas de fichier unique de composants, qui Vue-Routeur gère la navigation à l'intérieur de la <router-view>
balise dans l'Application.vue modèle.
Maintenant, disons que j'ai besoin d'utiliser la capitalizeFirstLetter()
fonction à l'intérieur d'un composant qui est défini dans SomeComponent.vue. Pour ce faire, j'ai d'abord besoin de l'importer:
<template>Some Component</template>
<script>
import {capitalizeFirstLetter} from '../helpers.js'
export default {
data() {
return {
myString = "test"
}
},
created() {
var newString = this.capitalizeFirstLetter(this.myString)
}
}
</script>
Cela devient rapidement un problème parce que j'arrive à la fin de l'importation de la fonction dans de nombreux composants différents, si pas tous d'entre eux. Cela semble répétitif et aussi rend le projet plus difficile à maintenir. Par exemple si je veux renommer helpers.js ou les fonctions à l'intérieur d'elle, je puis avoir besoin d'aller dans chaque élément que les importations et de le modifier à l'instruction import.
Longue histoire courte: comment puis-je faire les fonctions à l'intérieur de helpers.js à l'échelle mondiale disponibles afin que je puisse les appeler à l'intérieur de tout composant sans avoir à les importer, puis ajouter this
le nom de la fonction? En gros, je veux être capable de faire cela:
<script>
export default {
data() {
return {
myString = "test"
}
},
created() {
var newString = capitalizeFirstLetter(this.myString)
}
}
</script>
- Vous pouvez utiliser un mondial mixin, mais vous auriez à utiliser
this
. - Avez-vous envisagé d'exposer vos aides que filtres de sorte qu'ils peuvent être utilisés directement dans vos modèles sans avoir besoin de les importer? C'est la stratégie que je vais prendre et il fonctionne bien pour l'instant.
Vous devez vous connecter pour publier un commentaire.
Ce que vous avez décrit est mixin.
C'est un mondial mixin. avec cet ENSEMBLE de vos composants ont une
capitalizeFirstLetter
méthode, de sorte que vous pouvez appelerthis.capitalizeFirstLetter(...)
De travail exemple: http://codepen.io/CodinCat/pen/LWRVGQ?editors=1010
Voir la documentation ici: https://vuejs.org/v2/guide/mixins.html
capitalizeFirstLetter
à partir d'unconst vm = new Vue()
exemple? Parce quevm.capitalizeFirstLetter
ne fonctionne pas.capitalizeFirstLetter
fonction dans le mixin ou vont-ils avoir leur propre copie de celui-ci? Je suis à la recherche d'un endroit pour stocker une fonction qui doit être accessible à tous les composants, mais autrement non apparentés (extraire des données à partir d'un serveur pour stocker dans un vuex de stockage)Sinon, vous pouvez essayer de faire vos aides de la fonction d'un plugin:
MODIFIER le 1er Mars 2018:
Officiel pour faire un plugin est de créer un objet avec une fonction installer:
Vous devriez alors être en mesure de les utiliser n'importe où dans votre composants à l'aide de:
this.$helpers.capitalizeFirstLetter()
ou n'importe où dans votre application à l'aide de:
Vue.helpers.capitalizeFirstLetter()
Vous pouvez en apprendre plus à ce sujet dans la documentation: https://vuejs.org/v2/guide/plugins.html
Ancien réponse:
Puis, dans votre
main.js
fichier:Source: https://gist.github.com/logaretm/56126af5867e391ea9507b462259caf3
Grande question. Dans mes recherches, j'ai trouvé la vue-injecter pouvez gérer cela au mieux. J'ai beaucoup de bibliothèques de fonctions (services) séparés à partir de la norme de vue de la composante logique de méthodes de manipulation. Mon choix est d'avoir les méthodes du composant juste être delegators que d'appeler les fonctions de service.
https://github.com/jackmellis/vue-inject
De l'importer dans le main.js fichier comme "stocker" et vous pouvez y accéder à tous les composants.
Créer un nouveau mixin:
"src/mixins/generalMixin.js"
L'importer dans votre main.js comme:
À partir de maintenant, vous serez en mesure d'utiliser la fonction comme
this.capitalizeFirstLetter(str)
.Vous devez utiliser
this
parce que vous mélangé à une méthode dans la Vue principale de l'instance. Si il y a des moyens de retraitthis
il sera sans doute quelque chose de non conventionnel, ce qui est documenté de façon de partager des fonctions qui seront faciles à comprendre pour les futurs Vue devs à votre projet.