我的项目使用Laravel和Vue (由Laravel-Mix编译)。它有这样的结构:

我想要的是检查组件是否存在于覆盖的程序文件夹中并加载它的块,如果不是默认到components文件夹。最后会有多个程序文件夹。程序名称设置到Vuex商店自动取款机中。我知道其中的一部分可以通过Vue标签实现。但这需要显式声明组件,我希望避免这种情况,因为最终每个组件都需要一个巨大的导入列表。
发布于 2019-10-30 17:13:31
有一种方法可以做到这一点。你做的方法是通过Webpack的块分割。使用Dynamic Import -通过函数导入组件,该函数返回新的Promise,并且在组件的路径中有类似'/components/${res}'的内容。首先,我们创建一个Promise来尝试加载我们的默认组件:
export default function _getDefaultComponent(res){
return new Promise((resolve, reject) => {
import(
/* webpackChunkName: "js/chunk/[request]" */
@/components/${res}
)
.then((component) => {
resolve(component);
})
.catch((error) => {
reject(error);
});
}之后,我们创建覆盖函数,如下所示:
import _getDefaultComponent from "@/helpers/_getDefaultComponent";
import { program } from "@/store/program";
export default function _getComponent(res){
return new Promise((resolve, reject) => {
let programName = program.state.programName;
import(
/* webpackChunkName: "js/chunk/program/[request]" */
@/@program/${programName}/components/${res}
)
.then((component) => {
resolve(component);
})
.catch((error) => {
_getDefaultComponent(res)
.then((component) => {
resolve(component);
})
.catch((error) => {
console.error(No Component with the name ${res}, error:, error);
reject(error);
});
});
});
}我们现在要做的是获取程序的名称(在本例中来自Vuex ),如果失败,我们尝试查找程序文件夹中的组件,如果失败,则返回到默认组件,如果失败,也会使用试图解决的组件名称来控制错误。最后,使用它导入是这样的:
import _getComponent from "@/helpers/_getComponent";之后,我们在你的组件中如下所示:
components:{
Component: () => _getComponent('Component')
}https://stackoverflow.com/questions/58539762
复制相似问题