Я использую Vue 3, и у меня есть динамический компонент. Для этого требуется реквизит с именем componentName, поэтому я могу отправить ему любой компонент. Это работает, вроде.
<component :is = "componentName" />
Проблема в том, что мне все еще нужно импортировать все возможные компоненты. Если я отправлю About как componentName, мне нужно импортировать About.vue.
Я импортирую все возможные компоненты, которые можно добавить в componentName. С 30 возможными компонентами это будет длинный список.
import About "@/components/About.vue";
import Projects from "@/components/Projects.vue";
Есть ли способ динамически импортировать используемый компонент?





Я уже сталкивался с такой же ситуацией в своем шаблоне , когда пытался сделать демонстрацию своих иконок, состоящих из более чем 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
К вашему сведению, строка import("@/components/components/" + component + ".vue") заставляет Webpack загружать все модули, соответствующие шаблону. См. также stackoverflow.com/a/42804941/885922 и webpack.js.org/api/module-methods/…
Если у вас возникли проблемы с разрешением «require.context», вам может потребоваться импортировать @types/webpack-env и изменить tsconfig, чтобы включить эти типы: github.com/rails/webpacker/issues/1276