Vue3 动态子页面和菜单栏同步

news/2024/11/16 18:35:46/文章来源:https://www.cnblogs.com/yubaibaibubai/p/18396500

动态子页面

<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>

实现效果:
image
其中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-menuv-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-menuv-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>

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

为解决这个问题,在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-menuv-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-menuv-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>

效果:
image
image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/792141.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dedecms用户账号或密码错误怎么办?织梦网站常见故障

用户登录问题原因:用户账号或密码错误,数据库中用户信息缺失。 解决方法:检查用户账号和密码是否正确。 确认数据库中用户信息完整。通过这些详细的错误及解决方法,可以帮助更好地诊断和解决DedeCMS中的常见问题。如果还有其他具体问题,请提供更多细节以便进一步排查。扫码…

dedecms插件或模板引起的错误怎么办?织梦网站常见故障

原因:第三方插件或自定义模板存在兼容性问题。 解决方法:禁用插件逐一排查。 更换默认模板测试。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascript等。承接:企业仿站、网站修改、网站改版、BUG修复、问题…

dedecms文件或目录权限问题怎么办?织梦网站常见故障

原因:文件或目录权限设置不正确。 解决方法:设置正确的文件权限(通常是644)和目录权限(通常是755)。chmod -R 755 /path/to/your/website chmod -R 644 /path/to/your/website/*files*扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP…

网站出现报错时如何检查缓存和临时文件

清除织梦网站的缓存文件。通常缓存文件位于 /data/cache 和 /data/temp 目录下。rm -rf /path/to/your/website/data/cache/* rm -rf /path/to/your/website/data/temp/*扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3…

Pytest解决报告日志等相对路径问题

我们在使用pytest搭建测试框架时,有时候为了方便会将生成报告/日志等参数直接作为默认参数配置在pytest.ini中,如 pytest.ini [pytest] addopts = -v --html=reports/report.html --alluredir=reports/allure_resultslog_file = logs/test.log需要 pip install pytest pytest…

体验通义灵码 @workspace:轻松分析项目结构,结合代码仓库理解工程、查询问答等

近期,通义灵码上线新能力:@workspace,基于本地代码库的 RAG 技术,让灵码深度感知你的代码库,更懂你的需求,一起结对编程。国际市场研究机构 Gartner 发布业界首个 AI 代码助手魔力象限,阿里云进入挑战者象限。通义灵码在产品功能和市场应用等方面表现位列国际前列,在国…

程序运行异常: Undefined constant"PAGE

遇到 Undefined constant "PAGE" 的错误提示,通常是因为在代码中使用了一个未定义的常量。这可能是由于以下几个原因导致的:拼写错误:常量名称拼写错误。 命名空间问题:常量所在的命名空间没有正确引入。 配置文件或环境变量未正确加载。解决方法检查常量拼写:确…

Linux keepalive

安装1,安装 https://www.cnblogs.com/lfxx/p/17876757.htmlhttps://www.cnblogs.com/wangchengshi/p/10912177.html 2,linux keepalived 日志,如何重定向Keepalived日志的输出路径https://blog.csdn.net/weixin_39935571/article/details/116731816https://www.cnblogs.com/mj…

pbootcms模板如何输出当前页面的完整url地址

在 PbootCMS 中,如果你需要在模板的内容页中调用当前页面的完整 URL,可以结合使用 {pboot:httpurl} 和 {content:link} 来实现。这样可以确保生成的 URL 是完整的,并且包含了当前页面的路径。 示例代码 假设你需要在模板的内容页中调用当前页面的完整 URL,可以使用以下代码…

PbootCMS调用标题和摘要字数限制的方法

在 PbootCMS 中,可以使用不同的参数来控制内容的截取和显示。特别是针对中文和英文字符的不同长度问题,提供了 len=* 和 lencn=* 参数来分别处理普通长度截取和中文字符长度截取。 常用参数说明len=*:用于普通长度截取,每个字符按一个单位计算。 例如:[list:title len=10]…

svg - 需要重置样式颜色时,需要开启设置 fill: currentColor

需要在class 样式 添加fill: currentColor; 例子如下 本文来自博客园,作者:岑惜,转载请注明原文链接:https://www.cnblogs.com/c2g5201314/p/18396449响应开源精神相互学习,内容良币驱除劣币

Vue从首页跳转到其他页面,分页异常,点击搜索分页正常

项目有个功能是首页点击模块跳转到对应的页面,但是分页异常,只显示第一页的数据,但是点击搜索按钮,分页正常 1.查看返回数据,没有异常,后端没有问题 2.查看方法页面加载顺序错误,到分页未能成功显示 改成下图所示,分页正常