Eu tenho um projeto Vue 2 que tem muitos (50+) componentes de arquivo único . Eu uso o Vue-Router para roteamento e Vuex para o estado.
Existe um arquivo, chamado helpers.js , que contém várias funções de uso geral , como colocar a primeira letra de uma string em maiúscula. Este arquivo tem a seguinte aparência:
export default {
capitalizeFirstLetter(str) {
return str.charAt(0).toUpperCase() + str.slice(1);
}
}
Meu arquivo main.js inicializa o aplicativo:
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')
Meu arquivo App.vue contém o modelo:
<template>
<navbar></navbar>
<div class="container">
<router-view></router-view>
</div>
</template>
<script>
export default {
data() {
return {
//stuff
}
}
}
</script>
Então, tenho um monte de componentes de arquivo único, que o Vue-Router lida com a navegação dentro da <router-view>
tag no modelo App.vue.
Agora, digamos que eu precise usar a capitalizeFirstLetter()
função dentro de um componente definido em SomeComponent.vue . Para fazer isso, primeiro preciso importá-lo:
<template>Some Component</template>
<script>
import {capitalizeFirstLetter} from '../helpers.js'
export default {
data() {
return {
myString = "test"
}
},
created() {
var newString = this.capitalizeFirstLetter(this.myString)
}
}
</script>
Isso se torna um problema rapidamente porque acabo importando a função em muitos componentes diferentes, senão em todos eles. Isso parece repetitivo e também torna o projeto mais difícil de manter. Por exemplo, se eu quiser renomear helpers.js, ou as funções dentro dele, eu preciso ir para cada componente que o importa e modificar a instrução import.
Resumindo: como faço para tornar as funções dentro de helpers.js globalmente disponíveis para que eu possa chamá-las dentro de qualquer componente sem ter que primeiro importá-las e depois acrescentar this
o nome da função? Eu basicamente quero ser capaz de fazer isso:
<script>
export default {
data() {
return {
myString = "test"
}
},
created() {
var newString = capitalizeFirstLetter(this.myString)
}
}
</script>
fonte
this
.Respostas:
O que você descreveu é mixin .
Este é um mixin global. com isso TODOS os seus componentes terão um
capitalizeFirstLetter
método, então você pode chamarthis.capitalizeFirstLetter(...)
de métodos de componente ou pode chamá-lo diretamente comocapitalizeFirstLetter(...)
no template de componente.Exemplo de trabalho: http://codepen.io/CodinCat/pen/LWRVGQ?editors=1010
Veja a documentação aqui: https://vuejs.org/v2/guide/mixins.html
fonte
capitalizeFirstLetter
partir de umaconst vm = new Vue()
instância? Porquevm.capitalizeFirstLetter
não funciona.capitalizeFirstLetter
função no mixin ou terão sua própria cópia dele? Estou procurando um lugar para armazenar uma função que deve ser acessível a todos os componentes, mas de outra forma não relacionada a eles (buscar dados de um servidor para armazenar em um armazenamento vuex)Caso contrário, você pode tentar fazer com que seus ajudantes funcionem como um plugin:
Em sua
helper.js
exportação de funções, desta forma:ou
Você deve ser capaz de usá-los em qualquer lugar em seus componentes usando:
this.$helpers.capitalizeFirstLetter()
ou em qualquer lugar em seu aplicativo usando:
Vue.helpers.capitalizeFirstLetter()
Você pode aprender mais sobre isso na documentação: https://vuejs.org/v2/guide/plugins.html
fonte
Crie um novo mixin:
"src / mixins / generalMixin.js"
Em seguida, importe-o para o main.js como:
De agora em diante, você poderá usar a função como
this.capitalizeFirstLetter(str)
dentro do script de componente ou semthis
um modelo.Você tem que usar
this
porque misturou um método na instância principal do Vue. Se houver maneiras de removê-this
lo, provavelmente envolverá algo não convencional, pelo menos é uma forma documentada de compartilhar funções que será fácil de entender para qualquer futuro desenvolvedor Vue para o seu projeto.fonte
Ótima pergunta. Em minha pesquisa, descobri que o vue-inject pode lidar com isso da melhor maneira. Tenho muitas bibliotecas de funções (serviços) separadas dos métodos de manipulação de lógica de componente vue padrão. Minha escolha é que os métodos de componente sejam apenas delegadores que chamam as funções de serviço.
https://github.com/jackmellis/vue-inject
fonte
Crie um arquivo separado para facilitar a leitura (apenas coloquei o meu na pasta de plug-ins). Reproduzido das respostas de @CodinCat e @digout
Em seguida, importe em seu arquivo main.js ou app.js
USO:
Ligue
this.sampleFunction()
outhis.capitalizeFirstLetter()
fonte
Importe-o no arquivo main.js como em 'store' e você poderá acessá-lo em todos os componentes.
fonte