首页 > 其他分享 >乾坤(qiankun)结合vue入门

乾坤(qiankun)结合vue入门

时间:2022-09-06 21:02:46浏览次数:88  
标签:child1 vue 入门 router qiankun 应用 home import

前言

注意事项

  • 主应用和各个微应用之间挂载id(app)命名尽量保持不同,避免挂载被覆盖,同时也方便调试
  • 微应用路由应该和主应用注册微应用的路由相同

主应用

main.js

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';

//主应用 配置
import "./qiankunconfig"

Vue.config.productionTip = false


Vue.use(ElementUI);
new Vue({
    router,
    store,
    render: function (h) {
        return h(App)
    }
}).$mount('#app')

qiankunconfig

import { registerMicroApps } from 'qiankun';


//微应用配置
registerMicroApps([
    {
        //名称不能重复
        name: 'embedChild',
        entry: '//localhost:8080',
        //挂载在主应用的dom id
        container: '#father-child',
        //与微应用匹配的路由
        activeRule: '/home/child1',
    },
    {
        name: 'embedChild2',
        entry: '//localhost:8080',
        container: '#father-child',
        activeRule: '/home/child2',
    },
]);

//在主应用路由页mounted start
// start();

vue-router路由配

import Vue from 'vue'
import VueRouter from 'vue-router'
import home from '@/views/Index/home'


Vue.use(VueRouter)

const routes = [
    {path: '/', redirect: '/home'},
    {
        path: '/home/*',
        name: 'home',
        component: home,
        children:[
            {path: '/child2', name: 'child2'},
            {path: '/child1', name: 'child1'},
        ]
    },
    {
        path: '/home',
        name: 'home',
        component: home,
    },
    // {path: '/father', name: 'father', component: father},

]

const router = new VueRouter({
    mode:'history',
    routes
})

export default router

app.vue

直接挂router-view

<template>
  <div>
    <router-view/>
  </div>
</template>

home.vue

主应用聚合页面

<template>
  <el-container>
    <el-header>Header</el-header>
    <el-container>
      <el-aside width="200px">
        <el-menu
            default-active="2"
            class="el-menu-vertical-demo">
          <el-menu-item index="2">
            <i class="el-icon-menu"></i>
            <span slot="title"><router-link to="/home/child1">子模块1</router-link></span>
          </el-menu-item>
          <el-menu-item index="3">
            <i class="el-icon-document"></i>
            <span slot="title"><router-link to="/home/child2">子模块2</router-link></span>
          </el-menu-item>
        </el-menu>
      </el-aside>
      <el-main>
        <div id="father-child">
        </div>
      </el-main>
    </el-container>
  </el-container>
</template>

<script>
import {start} from 'qiankun';

export default {
  mounted() {
    //避免重复加载
    if (!window.qiankunStarted) {
      window.qiankunStarted = true;
      start();
    }
  },
  data() {
    return {}
  },
  created() {
  },
  methods: {},
}
</script>

<style lang='less' scoped>
.el-header, .el-footer {
  background-color: #B3C0D1;
  color: #333;
  text-align: center;
  line-height: 60px;
}

.el-aside {
  background-color: #D3DCE6;
  color: #333;
  text-align: center;
  line-height: 700px;
}

.el-main {
  background-color: #E9EEF3;
  color: #333;
  text-align: center;
  line-height: 160px;
}

body > .el-container {
  margin-bottom: 40px;
}

.el-container:nth-child(5) .el-aside,
.el-container:nth-child(6) .el-aside {
  line-height: 260px;
}

.el-container:nth-child(7) .el-aside {
  line-height: 320px;
}
</style>

微应用

main.js

import Vue from 'vue'
import './public-path';

export {bootstrap, mount, unmount, update} from './qiankunconfig'
import {render} from './qiankunconfig'

Vue.config.productionTip = false

 // 独立运行时挂载dom
if (!window.__POWERED_BY_QIANKUN__) {
    render();
}



qiankunconfig

注意:微应用需要在自己的入口 js (通常就是你配置的 webpack 的 entry js) 导出 bootstrap、mount、unmount 三个生命周期钩子,以供主应用在适当的时机调用。

import Vue from 'vue';
import router from "@/router";
import App from "@/App";


let instance = null
export const render = () => {
    instance = new Vue({
        router,
        render: h => h(App)
    }).$mount('#child1Root');
}

/**
 * bootstrap 只会在微应用初始化的时候调用一次,下次微应用重新进入时会直接调用 mount 钩子,不会再重复触发 bootstrap。
 * 通常我们可以在这里做一些全局变量的初始化,比如不会在 unmount 阶段被销毁的应用级别的缓存等。
 */
export async function bootstrap() {
    console.log('child1-bootstrap');
}



/**
 * 应用每次进入都会调用 mount 方法,通常我们在这里触发应用的渲染方法
 */
export async function mount(props) {
    console.log(`child1-mount-props:${JSON.stringify(props)}`);
    render(props)
}


/**
 * 应用每次 切出/卸载 会调用的方法,通常在这里我们会卸载微应用的应用实例
 */
export async function unmount(props) {
    console.log(`child1-unmount-props:${JSON.stringify(props)}`);
    instance.$destroy();
}



/**
 * 可选生命周期钩子,仅使用 loadMicroApp 方式加载微应用时生效
 */
export async function update(props) {
    console.log(`child1-update-props:${JSON.stringify(props)}`);
}


router配置

import Vue from 'vue'
import VueRouter from 'vue-router'

import child1 from "@/components/childFirst";
import child2 from "@/components/childSeconde";

Vue.use(VueRouter)

const routes = [
    {path: '/', redirect: '/child1'},
    {
        path: '/child1',
        name: 'child1',
        component: child1
    },

    {
        path: '/child2',
        name: 'child2',
        component: child2
    },
]

const router = new VueRouter({
    mode: 'history',
    base: window.__POWERED_BY_QIANKUN__  ? '/home' : '/',
    routes
})

export default router

标签:child1,vue,入门,router,qiankun,应用,home,import
From: https://www.cnblogs.com/cyh1282656849/p/16663275.html

相关文章

  • Vue3——provide 与 inject
    作用:实现祖与后代组件间通信套路:父组件有一个provide选项来提供数据,后代组件有一个inject选项来开始使用这些数据,两个函数联合起来能实现祖孙组件间通信具体写......
  • 【前端学习笔记】Vue 3.0 带来的变化
    主要变化更小的体积和更快的速度API设计的一致性增强Typescript支持开放更多底层APICompositionAPI(Vue2则是OptionsAPI)原先学过一点react,对rea......
  • vue3对比vue2获取通过refs获取组件数据
    vue21、组件设置ref标识<van-calendarref="calendarRef">2、在mounted中读取exportdefault{mounted(){//获取日历当前选择的时间constdat......
  • vuex源码分析
      什么是vuex是一个专为Vue.js应用程序开发的状态管理模式。什么是状态管理模式,vue根据data的变化会渲染模板,vuex则是把一些数据集中进行管理方便在vue组件中使......
  • react hook入门
    useState的使用  代码constSearch=(props:any)=>{//useState()采用一个初始state作为参数,也可以像这样使用一个空字符串。//使用state进行交互,......
  • Vue 中使用 moment 转换日期和时间
    Vue中使用moment转换日期和时间阳光的男夹克于2021-12-0113:31:45发布806收藏3分类专栏:Vue2文章标签:vue版权Vue2专栏收录该内容63篇文章3订阅订阅专栏......
  • Docker入门之简单操作
    目录1Docker启动容器1.1基于镜像新建容器并启动1.1.1拓展知识:执行dockerrun后,Docker都干了些啥1.1.2以daemon守护态方式运行容器1.2启动终止状态的容器2Docker查......
  • 创建 vue项目的详细步骤
    以vue2为例一、创建并初始化项目1、vscode打开一个空文件夹,打开终端2、终端运行:vuecreate【项目名】##注意项目名不要用驼峰标识,可以用“-”连接3、按上下键选择......
  • vue3项目的创建与初始化(vite)
    node:16版本npm:8版本一、创建1.以下代码:注意my-vue-app为即将创建项目的名字,可以自行更改#npm6.xnpmcreatevite@latestmy-vue-app--templatevue#npm......
  • vue3——toRaw 与 markRaw
    toRaw:作用:将一个由reactive生成的响应式对象转为普通对象。使用场景:用于读取响应式对象对应的普通对象,对这个普通对象的所有操作,不会引起页面更新。markRaw:作......