动态子页面

<router-view></router-view>显示子页面的内容

main.vue
<template>
<a-layout id="components-layout-demo-top-side">
<the-header-view></the-header-view>
<a-layout style="padding: 24px 0; background: #fff">
<the-sider-view></the-sider-view>
<a-layout-content :style="{ padding: '0 24px', minHeight: '280px' }">
<!-- <p>会员总数: {{ count }}</p>-->
<!-- <button @click="handleCount">Refresh Count</button>-->
<router-view></router-view>
</a-layout-content>
</a-layout>
<!-- <a-layout-content style="padding: 0 50px">-->
<!-- <a-breadcrumb style="margin: 16px 0">-->
<!-- <a-breadcrumb-item>Home</a-breadcrumb-item>-->
<!-- <a-breadcrumb-item>List</a-breadcrumb-item>-->
<!-- <a-breadcrumb-item>App</a-breadcrumb-item>-->
<!-- </a-breadcrumb>-->
<!-- -->
<!-- </a-layout-content>-->
<!-- <a-layout-footer style="text-align: center">-->
<!-- Ant Design 2018 Created by Ant UED-->
<!-- </a-layout-footer>-->
</a-layout>
</template> <script>
import { defineComponent } from 'vue';
import TheHeaderView from "@/components/the-header";
import TheSiderView from "@/components/the-sider"; export default defineComponent({
components: {
TheSiderView,
TheHeaderView,
},
setup() {
return {
};
},
});
</script> <style>
#components-layout-demo-top-side .logo {
float: left;
width: 120px;
height: 31px;
margin: 16px 24px 16px 0;
background: rgba(255, 255, 255, 0.3);
} .ant-row-rtl #components-layout-demo-top-side .logo {
float: right;
margin: 16px 0 16px 24px;
} .site-layout-background {
background: #fff;
}
</style>

实现效果:



其中header和sider是先前封装的组件

router中显示的就是子页面http://localhost:9001/welcome的内容

给header和sider组件添加menu

menu
<a-menu-item key="/welcome">
<router-link to="/welcome">
<coffee-outlined /> &nbsp; 欢迎
</router-link>
</a-menu-item>
<a-menu-item key="/passenger">
<router-link to="/passenger">
<user-outlined /> &nbsp; 乘车人管理
</router-link>
</a-menu-item>
header
<template>
<a-layout-header class="header">
<div class="logo" />
<div style="float: right; color: white;">
您好:{{member.mobile}} &nbsp;&nbsp;
<router-link to="/login" style="color: white;">
退出登录
</router-link>
</div>
<a-menu
v-model:selectedKeys="selectedKeys1"
theme="dark"
mode="horizontal"
:style="{ lineHeight: '64px' }"
>
<a-menu-item key="/welcome">
<router-link to="/welcome">
<coffee-outlined /> &nbsp; 欢迎
</router-link>
</a-menu-item>
<a-menu-item key="/passenger">
<router-link to="/passenger">
<user-outlined /> &nbsp; 乘车人管理
</router-link>
</a-menu-item>
</a-menu>
<!-- <div>{{member.mobile}}</div>-->
</a-layout-header>
</template> <script>
import {defineComponent, ref} from 'vue';
import store from "@/store"; export default defineComponent({
name: "the-header-view",
setup() {
let member = store.state.member;
return {
selectedKeys1: ref(['2']),
member
};
},
});
</script> <!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped> </style>
sider
<template>
<a-layout-sider width="200" style="background: #fff">
<a-menu
v-model:selectedKeys="selectedKeys2"
v-model:openKeys="openKeys"
mode="inline"
style="height: 100%"
>
<a-menu-item key="/welcome">
<router-link to="/welcome">
<coffee-outlined /> &nbsp; 欢迎
</router-link>
</a-menu-item>
<a-menu-item key="/passenger">
<router-link to="/passenger">
<user-outlined /> &nbsp; 乘车人管理
</router-link>
</a-menu-item>
<a-sub-menu key="sub1">
<template #title>
<span>
<user-outlined />
subnav 11
</span>
</template> </a-sub-menu>
<a-sub-menu key="sub2">
<template #title>
<span>
<laptop-outlined />
subnav 2
</span>
</template>
<a-menu-item key="5">option5</a-menu-item>
<a-menu-item key="6">option6</a-menu-item>
<a-menu-item key="7">option7</a-menu-item>
<a-menu-item key="8">option8</a-menu-item>
</a-sub-menu>
<a-sub-menu key="sub3">
<template #title>
<span>
<notification-outlined />
subnav 3
</span>
</template>
<a-menu-item key="9">option9</a-menu-item>
<a-menu-item key="10">option10</a-menu-item>
<a-menu-item key="11">option11</a-menu-item>
<a-menu-item key="12">option12</a-menu-item>
</a-sub-menu>
</a-menu>
</a-layout-sider>
</template> <script>
import {defineComponent, ref} from 'vue'; export default defineComponent({
name: "the-sider-view",
setup() { return {
selectedKeys2: ref(['1']),
openKeys:ref(['sub1'])
};
},
});
</script> <!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped> </style>

实现效果:





但是,这时的header和sider的菜单显示并不同步,还会出现菜单与内容不符的问题

为解决这个问题,在header和sider中分别编写watch,监视地址的router地址的变化

watch
const selectedKeys = ref([]);

    watch(() => router.currentRoute.value.path, (newValue) => {
console.log('watch', newValue);
selectedKeys.value = [];
selectedKeys.value.push(newValue);
}, {immediate: true});
header
<template>
<a-layout-header class="header">
<div class="logo" />
<div style="float: right; color: white;">
您好:{{member.mobile}} &nbsp;&nbsp;
<router-link to="/login" style="color: white;">
退出登录
</router-link>
</div>
<a-menu
v-model:selectedKeys="selectedKeys"
theme="dark"
mode="horizontal"
:style="{ lineHeight: '64px' }"
>
<a-menu-item key="/welcome">
<router-link to="/welcome">
<coffee-outlined /> &nbsp; 欢迎
</router-link>
</a-menu-item>
<a-menu-item key="/passenger">
<router-link to="/passenger">
<user-outlined /> &nbsp; 乘车人管理
</router-link>
</a-menu-item>
</a-menu>
<!-- <div>{{member.mobile}}</div>-->
</a-layout-header>
</template> <script>
import {defineComponent, ref, watch} from 'vue';
import store from "@/store";
import router from "@/router"; export default defineComponent({
name: "the-header-view",
setup() {
let member = store.state.member;
const selectedKeys = ref([]); watch(() => router.currentRoute.value.path, (newValue) => {
console.log('watch', newValue);
selectedKeys.value = [];
selectedKeys.value.push(newValue);
}, {immediate: true}); return {
selectedKeys,
member
};
},
});
</script> <!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped> </style>
sider
<template>
<a-layout-sider width="200" style="background: #fff">
<a-menu
v-model:selectedKeys="selectedKeys"
v-model:openKeys="openKeys"
mode="inline"
style="height: 100%"
>
<a-menu-item key="/welcome">
<router-link to="/welcome">
<coffee-outlined /> &nbsp; 欢迎
</router-link>
</a-menu-item>
<a-menu-item key="/passenger">
<router-link to="/passenger">
<user-outlined /> &nbsp; 乘车人管理
</router-link>
</a-menu-item>
<a-sub-menu key="sub1">
<template #title>
<span>
<user-outlined />
subnav 11
</span>
</template> </a-sub-menu>
<a-sub-menu key="sub2">
<template #title>
<span>
<laptop-outlined />
subnav 2
</span>
</template>
<a-menu-item key="5">option5</a-menu-item>
<a-menu-item key="6">option6</a-menu-item>
<a-menu-item key="7">option7</a-menu-item>
<a-menu-item key="8">option8</a-menu-item>
</a-sub-menu>
<a-sub-menu key="sub3">
<template #title>
<span>
<notification-outlined />
subnav 3
</span>
</template>
<a-menu-item key="9">option9</a-menu-item>
<a-menu-item key="10">option10</a-menu-item>
<a-menu-item key="11">option11</a-menu-item>
<a-menu-item key="12">option12</a-menu-item>
</a-sub-menu>
</a-menu>
</a-layout-sider>
</template> <script>
import {defineComponent, ref, watch} from 'vue';
import router from "@/router"; export default defineComponent({
name: "the-sider-view",
setup() {
const selectedKeys = ref([]); watch(() => router.currentRoute.value.path, (newValue) => {
console.log('watch', newValue);
selectedKeys.value = [];
selectedKeys.value.push(newValue);
}, {immediate: true}); return {
selectedKeys,
openKeys:ref(['welcome'])
};
},
});
</script> <!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped> </style>

效果:



Vue3 动态子页面和菜单栏同步的更多相关文章

  1. Js动态获取iframe子页面的高度////////////////////////zzzz

    Js动态获取iframe子页面的高度   Js动态获取iframe子页面的高度总结 问题的缘由 产品有个评论列表引用的是个iframe,高度不固定于是引发这个总结. 方法1:父级页面获取子级页面的高度 ...

  2. 如何实现跨域获取iframe子页面动态的url

    有的时候iframe的子页面会动态的切换页面,我们在父页面通过iframe1.contentWindow.window.location只能获取同源的子页面的信息.获取跨域的子页面信息会报错. 这时可 ...

  3. 获取iframe子页面内容高度给iframe动态设置高度

    <!DOCTYPE html><html> <head> <meta charset="UTF-8" /> <meta nam ...

  4. Js动态获取iframe子页面的高度总结

    问题的缘由 产品有个评论列表引用的是个iframe,高度不固定于是引发这个总结. 方法1:父级页面获取子级页面的高度 给元素设置高度 这方法是用在父级页面里的,通过获取子级页面的高度给iframe设置 ...

  5. 关于easyUI 的tabs 在子页面增加显示tabs的一个问题

    在父页面点个链接能动态看到子页面的情况太简单,请看easyUI官网:http://www.jeasyui.com/tutorial/layout/tabs2.php现在说的是在子页面点个按钮也能触发增 ...

  6. 关于easyUI在子页面增加显示tabs的一个问题

    在父页面点个链接能动态看到子页面的情况太简单,请看easyUI官网:http://www.jeasyui.com/tutorial/layout/tabs2.php 现在说的是在子页面点个按钮也能触发 ...

  7. js里父页面与子页面的相互调用

    一.在页面里用 open 打开的子页面: 1.子页面调用父页面的方法,包括子页面给父页面传值: window.opener.methodName(); window.opener.methodName ...

  8. iframe子页面与父页面元素的访问以及js变量的访问

    1.子页面访问父页面元素  parent.document.getElementById('id')和document相关的方法都可以这样用 2.父页面访问子页面元素  document.getEle ...

  9. 动态渲染页面爬取(Python 网络爬虫) ---Selenium的使用

    Selenium 的使用 Selenium 是一个自动化测试工具,利用它可以驱动浏览器执行特定的动作,如点击.下拉等操作,同时还可以获取浏览器当前呈现的页面的源代码,做到可见即可爬.对于一些JavaS ...

  10. Thymeleaf模版--子页面单独引入CSS、JS文件

    https://blog.csdn.net/u010392801/article/details/80465800 ****************************************** ...

随机推荐

  1. Vite5+Electron聊天室|electron31跨平台仿微信EXE客户端|vue3聊天程序

    基于electron31+vite5+pinia2跨端仿微信Exe聊天应用ViteElectronChat. electron31-vite5-chat原创研发vite5+electron31+pin ...

  2. 洛谷P1095

    [NOIP2007 普及组] 守望者的逃离 题目背景 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变. 题目描述 守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上. ...

  3. 修改Jenkins默认管理员admin密码

    1.删除Jenkins目录下config.xml文件中下面代码,并保存文件. <useSecurity>true</useSecurity><authorizationS ...

  4. 5 pdf页码跳转失效

    PC端网页查看pdf时,输入非数字页码回车后,页码跳转功能失效

  5. oeasy教您玩转vim - 82 - # 函数function

    ​ 函数 function 回忆 关于宏,我们回忆一下 qa 开始录制宏 q 结束录制宏 @a 应用宏 qA 追加录制宏 控制寄存器内容其实就是控制宏 宏还有一些特性 可以多文件执行宏 可以并发运行宏 ...

  6. linux的一些常用端口

    hdfs:9870 yarn:8088 sparkMaster的端口是:8080 worker的端口是:8081 历史服务器的默认端口是: 18080

  7. 自动化测试框架开发python selenium excel POM

    自动化测试框架开发python selenium excel POM 本文主要是采用python selenium excel POM 做UI自动化测试 测试框架选用的是unittest 测试框架用的 ...

  8. telegraf 常用命令总结

    本文为博主原创,转载请注明出处: Telegraf 是一个灵活的服务器代理,用于收集和报告指标.它支持插件驱动,这意味着你可以根据需要添加或修改功能. 1.使用telegraf --help 查看te ...

  9. 为团队配置Linux环境,简单高效的项目共享方案

    前言 最近好久没写博客了,事情太多了,我还搞了个新的好玩的项目,等后续做得差不多了来写篇文章介绍一下. 在我们目前的AI项目中,团队需要共同使用一台GPU服务器来做模型训练和数据处理.为了让每个团队成 ...

  10. 【SpringBoot】Re 02 Import与自定义装配实现

    Import的注册形式: 1.使用@Import导入一个或者多个类字节对象 @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME ...