Vue 3 использует динамический компонент с динамическим импортом

Я использую Vue 3, и у меня есть динамический компонент. Для этого требуется реквизит с именем componentName, поэтому я могу отправить ему любой компонент. Это работает, вроде.

Часть шаблона

<component :is = "componentName" />

Проблема в том, что мне все еще нужно импортировать все возможные компоненты. Если я отправлю About как componentName, мне нужно импортировать About.vue.

Часть сценария

Я импортирую все возможные компоненты, которые можно добавить в componentName. С 30 возможными компонентами это будет длинный список.

import About "@/components/About.vue";
import Projects from "@/components/Projects.vue";

Вопрос

Есть ли способ динамически импортировать используемый компонент?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
4 163
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я уже сталкивался с такой же ситуацией в своем шаблоне , когда пытался сделать демонстрацию своих иконок, состоящих из более чем 1 тыс. компонентов, поэтому я использовал что-то вроде этого:

import {defineAsyncComponent,defineComponent} from "vue";

const requireContext = require.context(
    "@/components", //path to components folder which are resolved automatically
    true,
    /\.vue$/i,
    "sync"
);
let componentNames= requireContext
    .keys()
    .map((file) => file.replace(/(^./)|(\.vue$)/g, ""));

let components= {};

componentNames.forEach((component) => { //component represents the component name
    components[component] = defineAsyncComponent(() => //import each component dynamically
        import("@/components/components/" + component + ".vue")
    );
});
export default defineComponent({
    name: "App",
    data() {
        return {
            componentNames,// you need this if you want to loop through the component names in template
         
        };
    },
    components,//ES6 shorthand of components:components or components:{...components }

});

узнайте больше о require.context

Если у вас возникли проблемы с разрешением «require.context», вам может потребоваться импортировать @types/webpack-env и изменить tsconfig, чтобы включить эти типы: github.com/rails/webpacker/issues/1276

Robert 21.03.2021 15:04

К вашему сведению, строка import("@/components/components/" + component + ".vue") заставляет Webpack загружать все модули, соответствующие шаблону. См. также stackoverflow.com/a/42804941/885922 и webpack.js.org/api/module-methods/…

xlm 22.09.2021 13:39

Другие вопросы по теме