Vue动态组件覆盖

Posted

技术标签:

【中文标题】Vue动态组件覆盖【英文标题】:Vue dynamic component overwrite 【发布时间】:2020-02-20 16:46:34 【问题描述】:

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

我想要的是检查组件是否存在于覆盖的程序文件夹中并加载它的块,如果不默认到组件文件夹。最后会有多个程序文件夹。程序名称设置在 Vuex 商店 ATM 中。 我知道其中一部分可以通过 Vue 标签来实现。但这需要明确声明组件,我想避免这种情况,因为最终每个组件都需要大量的导入列表。

【问题讨论】:

【参考方案1】:

有一种方法可以做到这一点。你这样做的方式是通过 Webpack 块拆分。使用动态导入 - 通过函数导入组件,该函数返回新的 Promises 并在组件的路径中有类似 '/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')

【讨论】:

以上是关于Vue动态组件覆盖的主要内容,如果未能解决你的问题,请参考以下文章

vuejs的组件化开发中,要怎么自定义class,覆盖原有的css样式

Vue Apollo Query 不覆盖本地数据

Vue.js 如何在组件中定义(覆盖)css 样式?

如何覆盖 Vue 组件中的作用域样式?

Laravel Nova 覆盖 vue 组件导致 [Vue 警告]:编译模板时出错

处理 vue 中的动态导入失败