Tengo un proyecto de Vue 2 que tiene muchos (50+) componentes de un solo archivo . Utilizo Vue-Router para enrutamiento y Vuex para estado.
Hay un archivo, llamado helpers.js , que contiene un montón de funciones de propósito general , como poner en mayúscula la primera letra de una cadena. Este archivo tiene este aspecto:
export default {
capitalizeFirstLetter(str) {
return str.charAt(0).toUpperCase() + str.slice(1);
}
}
Mi archivo main.js inicializa la aplicación:
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')
Mi archivo App.vue contiene la plantilla:
<template>
<navbar></navbar>
<div class="container">
<router-view></router-view>
</div>
</template>
<script>
export default {
data() {
return {
//stuff
}
}
}
</script>
Luego tengo un montón de componentes de un solo archivo, que Vue-Router maneja navegando dentro de la <router-view>
etiqueta en la plantilla App.vue.
Ahora digamos que necesito usar la capitalizeFirstLetter()
función dentro de un componente que está definido en SomeComponent.vue . Para hacer esto, primero necesito importarlo:
<template>Some Component</template>
<script>
import {capitalizeFirstLetter} from '../helpers.js'
export default {
data() {
return {
myString = "test"
}
},
created() {
var newString = this.capitalizeFirstLetter(this.myString)
}
}
</script>
Esto se convierte en un problema rápidamente porque termino importando la función en muchos componentes diferentes, si no en todos. Esto parece repetitivo y también hace que el proyecto sea más difícil de mantener. Por ejemplo, si quiero cambiar el nombre de helpers.js, o las funciones dentro de él, entonces necesito ir a cada componente que lo importa y modificar la declaración de importación.
En pocas palabras: ¿cómo puedo hacer que las funciones dentro de helpers.js estén disponibles globalmente para poder llamarlas dentro de cualquier componente sin tener que importarlas primero y luego anteponerlas this
al nombre de la función? Básicamente quiero poder hacer esto:
<script>
export default {
data() {
return {
myString = "test"
}
},
created() {
var newString = capitalizeFirstLetter(this.myString)
}
}
</script>
fuente
this
.Respuestas:
Lo que describiste es mixin .
Este es un mixin global. con esto TODOS sus componentes tendrán un
capitalizeFirstLetter
método, por lo que puede llamarthis.capitalizeFirstLetter(...)
desde métodos de componentes o puede llamarlo directamente comocapitalizeFirstLetter(...)
en la plantilla de componentes.Ejemplo de trabajo: http://codepen.io/CodinCat/pen/LWRVGQ?editors=1010
Consulte la documentación aquí: https://vuejs.org/v2/guide/mixins.html
fuente
capitalizeFirstLetter
desde unaconst vm = new Vue()
instancia? Porquevm.capitalizeFirstLetter
no funciona.capitalizeFirstLetter
función en el mixin o tendrán su propia copia? Estoy buscando un lugar para almacenar una función que debería ser accesible para todos los componentes, pero que de lo contrario no estaría relacionada con ellos (obtener datos de un servidor para almacenarlos en un almacenamiento vuex)De lo contrario, podría intentar hacer que sus ayudantes funcionen como un complemento:
En su
helper.js
exportación sus funciones, de esta manera:o
Entonces debería poder usarlos en cualquier lugar de sus componentes usando:
this.$helpers.capitalizeFirstLetter()
o en cualquier lugar de su aplicación usando:
Vue.helpers.capitalizeFirstLetter()
Puede obtener más información sobre esto en la documentación: https://vuejs.org/v2/guide/plugins.html
fuente
Crea un nuevo mixin:
"src / mixins / generalMixin.js"
Luego impórtelo en su main.js como:
A partir de ahora, podrá utilizar la función como
this.capitalizeFirstLetter(str)
dentro de su script de componente o sin ellathis
en una plantilla.Debe usarlo
this
porque mezcló un método en la instancia principal de Vue. Si hay formas de eliminarlothis
, probablemente implique algo poco convencional, al menos esta es una forma documentada de compartir funciones que será fácil de entender para cualquier futuro desarrollador de Vue de su proyecto.fuente
Cree un archivo separado para facilitar la lectura (simplemente colocó el mío en la carpeta de complementos). Reproducido de las respuestas de @CodinCat y @digout
Luego importe en su archivo main.js o app.js
USO:
Llamar
this.sampleFunction()
othis.capitalizeFirstLetter()
fuente
Utilice un filtro global si solo se refiere a cómo se formatean los datos cuando se procesan. Este es el primer ejemplo en los documentos :
fuente
Gran pregunta. En mi investigación, descubrí que vue-inject puede manejar esto de la mejor manera. Tengo muchas bibliotecas de funciones (servicios) que se mantienen separadas de los métodos estándar de manejo de lógica de componentes vue. Mi elección es que los métodos de componentes sean simplemente delegadores que llamen a las funciones de servicio.
https://github.com/jackmellis/vue-inject
fuente
Impórtelo en el archivo main.js como 'tienda' y puede acceder a él en todos los componentes.
fuente