Skip to content

渲染器

PC端

注册路由

将新添加的低代码配置页面添加到路由表中

javascript
[
  {
    path: "demo1",
    name: "demo1",
    meta: {
      micro: true, // 这里用于标注该页面为微应用页面
    },
    component: () => import("../views/BlankPage/index.vue"), // 这里由于页面需要渲染为微应用中的页面,所以component指向一个空div组件
  },
];

渲染器渲染

在 vue 工程中的布局组件中,会存在<router-view>用于展示原工程的页面。

1、在 template 中添加用于挂载微应用的 div

2、在 data 中创建变量用于标识是否已加载过微应用,初始值为 false

3、监听$route 路由变化,当未加载微应用时进行微应用加载

4、添加 loadMicro 方法用于加载微应用,注意:loadMicroApp 中的 props 需传递如下信息:

(1)routerData:新添加页面的所有路由信息数据,只包含 name 和 path 属性即可

(2)getPage:获取页面信息方法,该方法需返回一个 Promise 对象,能够通过.then({ pageJson, buttonList })获取到页面 json 信息和按钮权限信息

(3)request:公共接口请求方法,该方法需返回一个 promise 类型数据,可通过.then(res)获取到接口数据

javascript
<template>
  <div>
    <keep-alive>
      <router-view :key="$route.fullPath" />
    </keep-alive>
    <!-- 微应用挂载div -->
    <div id="symaPage" v-show="$route.meta.micro"></div>
  </div>
</template>

<script>
import { loadMicroApp } from "qiankun";
export default {
  data() {
    return {
      loadSyma: false // 是否加载了微应用
    };
  },
  watch: {
    $route: {
      handler(val) {
        const { meta } = val;
        if (meta.micro) {
          if (!this.loadSyma) {
            this.loadMicro();
          }
        }
      },
      immediate: true
    }
  },
  methods: {
    // 加载微应用
    loadMicro() {
      const microApp = loadMicroApp({
        name: "vue3-micro-vite",
        entry: `${window.location.origin}/vue3microvite`,
        container: "#symaPage",
        props: {
          routerData: [
            {
              path: "/demo1",
              name: "demo1"
            },
            {
              path: "/demo2",
              name: "demo2"
            }
          ],
          getPage: this.getPage,
          request: this.request
        }
      });
      microApp.mountPromise.then(() => {
        this.loadSyma = true;
      });
    },
    getPage() {
      return new Promise(resolve => {
        // 这里调用api获取数据res,并在api调用的.then()方法中执行resolve();
       // pageJson参数为页面JSON
        // buttonList参数为按钮权限对象数组,对象中包含butCode(按钮编码)和butName(按钮名称)属性
        resolve({ pageJson, buttonList });
      });
    },
    // 接口请求方法
    request(options) {
      console.log(options);
      // options为接口请求信息对象,内有请求url、method、body等属性
      // 这里需调用工程中的公共请求方法,需返回Promise类型,即可通过.then(res)获取到res接口返回数据
      // return Promise.resolve({});
    }}
  }
};
</script>