Parece muito estranho tentar aderir às esquisitices Vuex de chamar métodos com literais de string para serviços quando você poderia fazer uma classe TypeScript / JS que contenha o estado e a lógica para ela? Como você pode usar uma classe com estado como um serviço no Vue?
Douglas Gaskell
37
Estou usando axios como cliente HTTP para fazer chamadas API, criei uma gatewayspasta em minha srcpasta e coloquei arquivos para cada backend, criando instâncias de axios , como a seguir
Como suponho que você queira reutilizar esse método em vários componentes, você pode usar mixins de vue.js:
Mixins são uma maneira flexível de distribuir funcionalidades reutilizáveis para componentes Vue. Um objeto mixin pode conter qualquer opção de componente. Quando um componente usa um mixin, todas as opções do mixin serão “combinadas” com as opções do próprio componente.
Então você pode adicionar um método no mixin e ele estará disponível em todos os componentes, onde o mixin será misturado. Veja o seguinte exemplo:
// define a mixin object
var myMixin = {
methods: {
getProducts () {
myApi.get('products?id=' + prodId).then(response => this.product = response.data)
}
}
}
// define a component that uses this mixin
var Component = Vue.extend({
mixins: [myMixin]
})
// alternate way to have a mixin while initialising
new Vue({
mixins: [myMixin],
created: function () {
console.log('other code')
}
})
como você atualizará o X-Auth-Token de myApi.js quando o usuário fizer login
Amarjit Singh
3
geralmente este não é um valor estático
Amarjit Singh
30
Estou usando principalmente o recurso Vue.
1. Eu crio um novo arquivo onde faço a conexão com o endpoint da API usando Vue.http.xxx. Então, digamos que temos um endpoint que produz os posts. Crie um novo diretório em seu projeto, eu o chamo servicese, em seguida, crio o arquivo chamado PostsService.js- o conteúdo se parece com isto:
De acordo com Evan You, a Vue-Resource vai se aposentar e, em vez disso, recomenda a Axios. Leia o artigo dele , realmente gosto da sua abordagem, que parece mais angular 2
codamente
@noypee VueResource ainda funciona. Mas não importa usar o que quiser, seria exatamente a mesma abordagem com o Axios.
Belmin Bedak de
1
Sim, Vue2 continuará a acomodar vue-resource também de acordo com seu artigo
codamente
2
Isso é muito bom, mas como testar esse componente com o mock-PostsService?
Shrike
@noypee, vue-resource não está sendo aposentado - Evan afirmou que ele está apenas "aposentando-o do status de recomendação oficial" . Ele esclareceu ainda porque sua equipe concluiu que não havia mais a necessidade de uma biblioteca oficial AJAX. O artigo vinculado explica bem. E deve-se notar que o vue-resource ainda é mantido ativamente e uma opção perfeitamente viável.
squidbe
8
Eu sugiro criar um provedor de API que você possa acessar de qualquer lugar em seu aplicativo.
Simplesmente crie uma src/utilspasta e dentro dela um arquivo chamado api.js.
Nele, exporte seu wrapper que sabe como se comunicar com sua API como um objeto ou uma classe estática ES6 (eu prefiro como esta última parece e funciona se você não tem medo de classes). Este provedor pode usar qualquer biblioteca de solicitação de HTTP de sua preferência e você pode trocá-la facilmente mais tarde, alterando um único arquivo (este) em vez de procurar por toda a base de código. Aqui está um exemplo de uso de axios, assumindo que temos uma API REST disponível em api.example.com/v1que usa SSL:
import axios from 'axios'
import { isProduction, env } from '@/utils/env'
const http = null // not possible to create a private property in JavaScript, so we move it outside of the class, so that it's only accessible within this module
class APIProvider {
constructor ({ url }) {
http = axios.create({
baseURL: url,
headers: { 'Content-Type': 'application/json' }
})
}
login (token) {
http.defaults.headers.common.Authorization = `Bearer ${token}`
}
logout () {
http.defaults.headers.common.Authorization = ''
}
// REST Methods
find ({ resource, query }) {
return http.get(resource, {
params: query
})
}
get ({ resource, id, query }) {
return http.get(`${resource}/${id}`, {
params: query
})
}
create ({ resource, data, query }) {
return http.post(resource, data, {
params: query
})
}
update ({ resource, id, data, query }) {
return http.patch(`${resource}/${id}`, data, {
params: query
})
}
destroy ({ resource, id }) {
return http.delete(`${resource}/${id}`)
}
}
export default new APIProvider({
url: env('API_URL') // We assume 'https://api.example.com/v1' is set as the env variable
})
Em seguida, em seu main.jsarquivo ou onde quer que você inicialize o aplicativo Vue, faça o seguinte:
import api from '@/src/utils/api'
Vue.$api = api
Object.defineProperty(Vue.prototype, '$api', {
get () {
return api
}
})
Agora você pode acessá-lo em qualquer lugar em seu aplicativo Vue, bem como em qualquer lugar para importar o próprio Vue:
Eu acho que para sua pergunta simples, a resposta poderia ser qualquer módulo ES6 contendo funções (equivalente a métodos em classe em ANgular) e importando-as diretamente em componentes usando importações e exportações ES6. Não existem serviços que possam ser injetados em componentes.
Você pode fazer seu próprio serviço onde pode colocar todas as suas chamadas de servidor HTTP e, em seguida, importá-lo para os componentes onde deseja usá-los.
O melhor é usar o Vuex para aplicativos complexos de gerenciamento de estado porque no Vuex você é capaz de lidar com todas as chamadas assíncronas por meio de ações que sempre são executadas de forma assíncrona e, em seguida, confirmar a mutação assim que tiver o resultado. A mutação irá interagir diretamente com o estado e será atualizada de uma maneira imutável (que é preferível). Esta é uma abordagem com estado.
Existem outras abordagens também. Mas esses são os que sigo em meu código.
Estou usando axios como cliente HTTP para fazer chamadas API, criei uma
gateways
pasta em minhasrc
pasta e coloquei arquivos para cada backend, criando instâncias de axios , como a seguirmyApi.js
Agora, em seu componente, você pode ter uma função que buscará dados da API como a seguir:
Como suponho que você queira reutilizar esse método em vários componentes, você pode usar mixins de vue.js:
Então você pode adicionar um método no mixin e ele estará disponível em todos os componentes, onde o mixin será misturado. Veja o seguinte exemplo:
fonte
Estou usando principalmente o recurso Vue.
1. Eu crio um novo arquivo onde faço a conexão com o endpoint da API usando
Vue.http.xxx
. Então, digamos que temos um endpoint que produz os posts. Crie um novo diretório em seu projeto, eu o chamoservices
e, em seguida, crio o arquivo chamadoPostsService.js
- o conteúdo se parece com isto:Então vou para o componente onde desejo usar este serviço e o importo
Para obter mais informações sobre essa abordagem, sinta-se à vontade para verificar meu repositório no GitHub https://github.com/bedakb/vuewp/tree/master/public/app/themes/vuewp/app
fonte
Eu sugiro criar um provedor de API que você possa acessar de qualquer lugar em seu aplicativo.
Simplesmente crie uma
src/utils
pasta e dentro dela um arquivo chamadoapi.js
.Nele, exporte seu wrapper que sabe como se comunicar com sua API como um objeto ou uma classe estática ES6 (eu prefiro como esta última parece e funciona se você não tem medo de classes). Este provedor pode usar qualquer biblioteca de solicitação de HTTP de sua preferência e você pode trocá-la facilmente mais tarde, alterando um único arquivo (este) em vez de procurar por toda a base de código. Aqui está um exemplo de uso de axios, assumindo que temos uma API REST disponível em
api.example.com/v1
que usa SSL:Em seguida, em seu
main.js
arquivo ou onde quer que você inicialize o aplicativo Vue, faça o seguinte:Agora você pode acessá-lo em qualquer lugar em seu aplicativo Vue, bem como em qualquer lugar para importar o próprio Vue:
ou:
Espero que isto ajude.
fonte
Eu acho que para sua pergunta simples, a resposta poderia ser qualquer módulo ES6 contendo funções (equivalente a métodos em classe em ANgular) e importando-as diretamente em componentes usando importações e exportações ES6. Não existem serviços que possam ser injetados em componentes.
fonte
Você pode fazer seu próprio serviço onde pode colocar todas as suas chamadas de servidor HTTP e, em seguida, importá-lo para os componentes onde deseja usá-los.
O melhor é usar o Vuex para aplicativos complexos de gerenciamento de estado porque no Vuex você é capaz de lidar com todas as chamadas assíncronas por meio de ações que sempre são executadas de forma assíncrona e, em seguida, confirmar a mutação assim que tiver o resultado. A mutação irá interagir diretamente com o estado e será atualizada de uma maneira imutável (que é preferível). Esta é uma abordagem com estado.
Existem outras abordagens também. Mas esses são os que sigo em meu código.
fonte