Accede a la instancia/servicio desde Vuex que fue provista a Vue (Vue.js 3)
Antecedentes
Considera lo siguiente:
// app.js
import API from 'utils/API';
const api = new API(config.app.urls.api, endpoints, token);
app.provide('$api', api);
Basado en todo lo que he leído en las últimas 24 horas, el método recomendado para proporcionar un ‘servicio’ a Vue.js 3 es como se muestra arriba.
Sin embargo, el problema con esto es que ahora no puedo acceder a la instancia de API ya que el método inject
no se puede utilizar fuera de un componente Vue.
Por lo tanto, cuando quiero importar la instancia de API en mis módulos Vuex, no puedo hacerlo…
Pregunta
¿Existe una forma ‘recomendada’ de acceder a un servicio proporcionado fuera de un componente Vue? ¿O una de las soluciones propuestas a continuación es cómo debería hacerse?
Soluciones Posibles
Solución Propuesta 1
En lugar de proporcionar el servicio a Vue, podemos simplemente agregarlo a las propiedades globales de la siguiente manera:
// app.js
app.config.globalProperties.$api = api;
y luego podemos acceder a él de la siguiente manera en el almacenamiento:
// some-vuex-module.js
import { getCurrentInstance } from 'vue';
const api = getCurrentInstance().appContext.config.globalProperties.$api;
Estoy utilizando lo anterior para ciertas cosas en mi aplicación, pero para el servicio API parece incorrecto hacerlo de esta manera.
Solución Propuesta 2
Otra solución que se me ocurrió fue hacer que la instancia de API esté disponible en la ventana de la siguiente manera:
// app.js
import API from 'utils/API';
const api = window.api = new API(config.app.urls.api, endpoints, token);
app.provide('$api', api);
Lo anterior parece ser un anti-patrón…
davy.ai
Los métodos
provide
einject
en Vue.js 3 tienen la finalidad de proveer una forma de compartir datos y servicios entre componentes. No se recomienda utilizarlos para compartir datos fuera de los componentes.Sin embargo, si deseas acceder a un servicio proporcionado fuera de un componente, puedes utilizar la función
getCurrentInstance()
del módulovue
para obtener la instancia actual de Vue y acceder al servicio proporcionado desde allí.Aquí tienes un ejemplo de cómo hacerlo en un módulo Vuex:
Ten en cuenta que este enfoque puede no funcionar en todos los casos y, en general, es mejor pasar la instancia del servicio como parámetro a las funciones o métodos que lo necesiten en lugar de depender del acceso global.