动态子页面

<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. 部分解决 | ocrmypdf对中文pdf进行ocr识别后存在多余空格

    1.问题 ocrmypdf安装采用的是在windows安装方法具体看 https://media.readthedocs.org/pdf/ocrmypdf/latest/ocrmypdf.pdf 由于 ...

  2. TIER 1: Three

    TIER 1: Three 信息收集 通过以前的练习,我们首先确认目标 IP 开放了哪些端口,比如使用 nmap 之类的工具进行扫描.本次靶机开放: 22 端口:SSH, OpenSSH 80 端口: ...

  3. Pandas库学习笔记(3)---Pandas Series

    Pandas Series Pandas Series基本操作 pandas.Series Series结构如下: pandas.Series(data, index, dtype, copy) 构造 ...

  4. Java 监听POST请求

    要监听POST请求,我们可以使用Java中的HttpServlet类.以下是一个使用Servlet API监听POST请求的完整示例.这个示例使用了Servlet 3.1规范,不需要在web.xml中 ...

  5. 界面自动化测试录制工具,让python selenium自动化测试脚本开发更加方便

    自动化测试中,QTP和selenium IDE都支持浏览器录制与回放功能,简单的来说就像一个记录操作步骤的机器人,可以按照记录的步骤重新执行一遍,这就是脚本录制.个人觉得传统录制工具有些弊端,加上要定 ...

  6. 平衡树之Splay树详解

    认识 Splay树,BST(二叉搜索树)的一种,整体效率很高,平摊操作次数为\(O(log_2n)\),也就是说,在一棵有n个节点的BST上做M次Splay操作,时间复杂度为\(O(Mlog_2n)\ ...

  7. 【Axure RP】Axure RP 9 下载安装及汉化

    本体及破解机下载: http://www.sd173.com/soft/7951.html 汉化补丁教程见: https://blog.csdn.net/weixin_74457789/article ...

  8. jax框架的官方编译版本 —— 预编译发行版本(release 列表)

    jax框架的Google官方给出的预编译版本,支持CUDA和CUDNN的,带有python版本号,CUDA版本号,CUDNN版本号的: https://storage.googleapis.com/j ...

  9. 解决CGLib动态代理测试不通过-Unable to load cache item

    1.背景 在学习aop底层时遇到的问题,做个小结 2.现象 动态代理代码如下: package com.ldp.proxy; import net.sf.cglib.proxy.Enhancer; i ...

  10. 掌握 Nuxt 3 的页面元数据:使用 definePageMeta 进行自定义配置

    title: 掌握 Nuxt 3 的页面元数据:使用 definePageMeta 进行自定义配置 date: 2024/8/11 updated: 2024/8/11 author: cmdrago ...