Vue에 제공된 Vuex에서 인스턴스/서비스에 액세스(Vue.js 3)
배경
다음을 고려하십시오.
// app.js
import API from 'utils/API';
const api = new API(config.app.urls.api, endpoints, token);
app.provide('$api', api);
내가 지난 24시간 동안 읽은 모든 것을 바탕으로, 위의 내용은 Vue.js 3에 '서비스'를 제공하는 권장 방법이다.
그러나 위의 문제는 메서드를 Vue 구성 요소 외부에서 사용할 수 없기 때문에 API 인스턴스에 액세스할 수 없다는 것이다.
따라서 API 인스턴스를 Vuex 모듈로 가져오려면...
질문
Vue 구성요소 외부에 제공된 서비스에 액세스하는 '개안된' 방법이 있는가?아니면 내가 제안한 해결책 중 하나가 어떻게 해야 하는가?
가능한 해결 방법
제안 솔루션 1
Vue에 서비스를 제공하는 대신 다음과 같은 글로벌 속성에 서비스를 추가하면 된다.
// app.js
app.config.globalProperties.$api = api;
매장에서 그렇게 접근할 수 있을 겁니다
// some-vuex-module.js
import { getCurrentInstance } from 'vue';
const api = getCurrentInstance().appContext.config.globalProperties.$api;
내 앱에서 어떤 것에 위 내용을 사용하고 있는데 API 서비스에서는 이런 식으로 하는 것이 잘못된 것 같아.
제안 솔루션 2
내가 생각한 또 다른 해결책은 API 인스턴스를 다음과 같이 창에서 사용할 수 있게 하는 것이었다.
// app.js
import API from 'utils/API';
const api = window.api = new API(config.app.urls.api, endpoints, token);
app.provide('$api', api);
위 내용은 반패턴적인 것 같지만...
모듈 환경에서 선호되는 방법(Vue 3 설정은 일반적으로)은 그냥 가져오는 것이다.api
구성 요소 내부 또는 외부와 상관없이 사용되는 장소
Vue 글로벌 속성을 가진 솔루션은 Vue 애플리케이션이 반드시 모듈화되지 않았기 때문에 Vue 인스턴스에 글로벌 애플리케이션 범위로 의존할 때 시작되었다.현재는 주로 템플릿에 사용되며 이를 수입·노출하기 위해 보일러플레이트 코드가 필요한 부동산에만 적합하다.그 예는$t
에vue-i18n
.
에 대한 해결책provide
/inject
종속성 주입이 필요한 경우에 사용할 수 있다.일반적인 경우는 의존성이 느슨하게 결합되어야 하는 도서관이다.또 다른 하나는 종속성은 구성요소 계층에 따라 달라지며 구성요소마다 다를 수 있다는 것이다.
에 대한 해결책window
응용 프로그램이 공통 JS 모듈을 통해 상호 작용할 수 없는 별도의 스크립트로 분할되지 않는 한 피해야 한다.그때도 문제는 글로벌 변수를 정의하는 스크립트가 이를 사용하는 스크립트보다 먼저 로드되어야 한다는 것이다.
'IT이야기' 카테고리의 다른 글
농담으로 i18 다음 모듈을 조롱하는 방법 (0) | 2022.04.12 |
---|---|
Vue.js에서 v-on과 같은 사용자 지정 지시어를 생성하는 방법 (0) | 2022.04.12 |
DOM에 삽입할 때 Vue 컴파일 (0) | 2022.04.12 |
Vuex의 개체 어레이에 v-bind 사용 (0) | 2022.04.12 |
vuejs에서 라디오 버튼을 기본적으로 선택하도록 하는 방법? (0) | 2022.04.12 |