Vue 3에서 전역 구성 요소를 동적으로 등록하는 방법은 무엇입니까?
13456 단어 vuevue3frontendtypescript
Vue 3는 2021년 6월 8일부터 Pluto라는 버전 3.1.0으로 안정적입니다. Typescript와 호환되며
setup
함수 내에서 구성 요소의 대부분을 초기화할 수 있는 Composition API를 도입합니다. Vue 3에 대한 자세한 정보를 원하시면 아래 링크를 확인하세요.이 기사의 주제로 즉시 진행합시다. Vue 3에는 이미 구성 요소를 전역적으로 등록하는 방법에 대한 설명서가 있습니다. 전역 구성 요소는 구성 요소 속성에서 가져오기 및 선언 없이 다른 구성 요소의 템플릿 내부에서 즉시 선언할 수 있는 Vue 구성 요소입니다. Vue 3에 익숙하지 않은 경우 구성 요소 내부의 다른 구성 요소를 가져오는 방법은 다음과 같습니다.
<template>
<div>
<SomeComponent/>
</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import SomeComponent from '@/components/SomeComponent.vue';
export default defineComponent({
components: { SomeComponent },
});
</script>
위의 파일이
views
디렉토리 안에 있고 components
디렉토리에서 재사용 가능한 구성 요소를 가져오고 있다고 가정합니다. 보시다시피 Vue 2에서 컴포넌트를 가져오는 방법은 컴포넌트 생성과 Typescript 사용법(script 태그 내부에 lang="ts"
추가)의 차이점을 제외하고 다르지 않습니다.구성 요소를 다른 구성 요소에 전역적으로 액세스할 수 있도록 하면 프로젝트가 더 커져 재사용이 가능해지면 매우 유용할 것입니다. 또한 구성 요소가 로컬 하위 구성 요소가 아닌 한 구성 요소 내부의 여러 구성 요소 가져오기를 제거합니다. 아래 예를 참조하십시오.
<template>
<div>
<SomeComponent/>
</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
export default defineComponent({
});
</script>
보시다시피
SomeComponent
구문과 import
함수 내부에 components
매개변수 없이 HTML 요소와 같은 defineComponent
구성 요소를 다른 구성 요소 내부에 직접 선언했습니다.그렇다면 Vue 3에서 전역 구성 요소를 만드는 방법은 무엇입니까? official documentation 에 따르면
main.ts
파일에서 Typescript else를 사용하여 개발하는 경우 main.js
파일에 구성 요소를 전역적으로 등록하는 방법은 다음과 같습니다.import { createApp } from 'vue';
import ComponentC from './components/ComponentC.vue';
// Usually it is App.vue inside the createApp function.
// App.vue is your main or root Vue component.
const app = createApp({});
// Component named with kebab-case.
app.component('component-a', {
/* ... */
});
// Component named with PascalCase.
app.component('ComponentB', {
/* ... */
});
app.component('ComponentC', ComponentC);
// The second argument of the component function is the object that creates a component or it can be an imported component instance.
// It willl mount the Vue app inside the HTML element with ID of
// #app in index.html which is located in public directory.
app.mount('#app');
참고: Vue 3 Global Registration
위의 절차를 따르면
main.js
또는 main.ts
파일이 부풀어 오를 것입니다. 특히 응용 프로그램이 커지면 재사용 가능한 구성 요소가 증가합니다. 그러면 어떻게 하면 그런 일이 발생하지 않도록 방지할 수 있습니까?Vue 2를 사용하여 프론트엔드 애플리케이션을 개발할 때 항상 사용하는 전역 구성 요소를 동적으로 등록하는 방법에 대한 아이디어는 Vue 2 설명서에서 얻었습니다. Vue 3에서는 설명서에 이 섹션이 없습니다.
참고: Automatic Global Registration of Base Components
내 구현은 다음과 같습니다.
./components/base/index.ts
import { App } from 'vue';
const requireComponent = require.context(
// The relative path of the components folder
'./',
// Whether or not to look in subfolders
false,
// The regular expression used to match base component filenames
/[A-Z]\w+Base\.vue$/,
);
const register = (app: App<Element>): void => {
requireComponent.keys().forEach((fileName) => {
// Get component config
const componentConfig = requireComponent(fileName);
// Get component name
const componentName = fileName.split('/').pop()?.replace(/\.\w+$/, '') as string;
app.component(componentName, componentConfig.default || componentConfig);
});
};
export default {
register,
};
Vue 2 구현에 대해 위에서 제공한 링크를 확인했다면 위의 Vue 3 구현과 거의 동일합니다. 내 구현의 차이점은 다음과 같습니다.
app
유형의 App<Element>
인수가 있습니다. App
유형은 vue
패키지에서 가져오고 Element
유형은 인터페이스에 가깝습니다. 자세한 내용을 참조하십시오here. './'
에 배치했기 때문에 내 상대 경로는 ./components/base/index.ts
입니다. Base.vue
로 끝나는 모든 파일을 가져옵니다. 나는 모든 전역 구성 요소를 base
디렉토리에 배치하는 것을 선호하지만 원하는 이름을 지정할 수 있습니다.lodash
패키지를 사용하지 않았습니다. 다음은
main.ts
파일에서 구현한 방법입니다.메인.ts
import { createApp } from 'vue';
import BaseComponents from './components/base';
const app = createApp(App);
BaseComponents.register(app);
app.mount('#app');
그게 다야! 수백 개의 전역 구성 요소를 등록해야 기본 파일이 부풀려지지 않습니다. 이 글이 많은 도움이 되기를 바랍니다. 😉
또한 위의 코드 구현에 대한 Github Gist를 만들었습니다.
https://gist.github.com/jirehnimes/2fcb31a2cbe7bb0c722a96f49e4cbf8f
건배!
Reference
이 문제에 관하여(Vue 3에서 전역 구성 요소를 동적으로 등록하는 방법은 무엇입니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jirehnimes/how-to-register-global-components-in-vue-3-dynamically-3gl텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)