Vue 一个网站如何实现两个菜单路由

2023-10-30

极少有这种奇怪的需求,去年遇到的,一直没有整理,现在有时间整理了,尴尬的是项目的登录密码忘了。。。没办法调试了。。但是大体的思路是这样的

需求

网站原本有一个菜单列表,现在用户希望点击某行数据的时候,弹出一个新的页面,同时左侧加载一个新的菜单。之前的菜单对应的是项目列表,新菜单对应的是单个项目的各项信息明细。

思路

面对上面这个问题,首先要整理思路:

  1. 数据问题:
    在提出这个需求之前,这就是一个再正常不过的管理端,所以路由也就是针对一个系统一个菜单的路由,即登录成功后从接口抓一下就完事了。因为不想改动太多,所以第二个菜单依旧在之前的菜单管理页面进行添加,但是可以规定一下某个字段只能包含某某某字符,方便我们分离出来;
  2. 分离问题(两个接口的就不用管分离了):
    什么时候分离?数据抓过来之后,绑定到页面上之前都可以(这里建议在菜单数据转化为路由前分离,转化之后再分离好像遇到个奇怪问题,具体的忘了);
  3. 路由问题:
    一般情况下,我们只会进行一次new VueRouter()(至于new两次会怎么样,也没试过),添加路由时也是分开的。
  4. 显示问题:
    弹出的新页面使用第二个菜单目录,意味着我们的母版页面需要新的(什么是母版页面,包含整个页面显示内容的组件);

步骤

  1. 首先熟悉当前项目的路由相关的代码:加载位置,是否格式化数据等;

  2. 先写个固定路由,这些路由可以使用,但不会影响当前目录,所以登录页面的路由在哪里,这些路由就可以写在哪里(当时没主要到有个hidden字段。。。)
    在这里插入图片描述

  3. 如果样式和传递参数的方式相同的话,可以直接复用之前的目录组件;

  4. 复制出来一个新的母版页面,分离路由数据:

computed: {
	menuRoutes() {
		const parentMenu = this.$router.options.routes.filter(val => {
			return val.name === 'singleProject'
		})
		return parentMenu[0].children
	}
}

到这里,静态路由已经实现,接下来是静态路由转为动态路由

  1. 删除之前写好的固定路由,写入到菜单表中;
  2. 分离方式进行变更(store中有个一路由的module,需要提前在里面格式化一下数据,新增minMenuRoutes属性,用于放置分离的数据,然后在使用的页面再拿出来)
		// 这是store里的数据分离,忘记当时是什么原因,让我有重写了一个filterTargetRoutes方法。。。
        init(context) {
            return new Promise(async resolve => {
                if (context.state.menuRoutes.length <= 0) {
                    let routes = await asyncRoutes.getRoutes()
                    // 修改开始
                    let newTargetRoute = routes.filter(val => {
                        return val.name === 'singleProject'
                    })
                    routes = routes.filter(val => {
                        return val.name !== 'singleProject'
                    })
                    // 修改结束
                    routes = filterAddRoutes(routes)
                    let addRoutes = []
                    addRoutes.push(mainRoute)
                    addRoutes = filterAddRoutes(addRoutes)
                    addRoutes[0].children = addRoutes[0].children.concat(routes)
                    addRoutes.push(endRoute)
                    // 修改开始
                    newTargetRoute = filterTargetRoutes(newTargetRoute)
                    addRoutes.push(...newTargetRoute)
                    // 修改结束
                    router.addRoutes(addRoutes)
                    context.commit('setRoutes', routes)
                    // 修改开始
                    context.commit('setMinRoutes', newTargetRoute)
                    // 修改结束
                }
                resolve()
            })
        },
// 这里脑抽了,我也不明白为什么当时明明已经在store筛选过一次了,这里还要再筛选一遍。。。
// 难道是怕里面还有个“doubleProject”  ??????
// routes是为了直接定位到store下的routes.js这里
...mapState('routes', {
    menuRoutes: (state) => {
        const parentMenu = state.minMenuRoutes.filter((val) => {
            return val.name === 'singleProject'
        })
        return parentMenu[0].children
    }
}),

静态路由转动态路由,两者的区别是动态路由刚从数据库抓过来后,其实只是一个数组,所以需要对其进行转化:格式化方式如下:

// routes:路由数组
export function filterAddRoutes(routes) {
    const result = []
    routes.forEach(route => {
        const tmp = { ...route }
        if (tmp.children && tmp.children.length) {
            tmp.children = filterAddRoutes(tmp.children)
        }
        if (tmp.children && tmp.children.length && !tmp.component) {
            tmp.component = () => import('@/views/home/nest')
        }
        if (tmp.children && tmp.children.length && !tmp.redirect) {
            tmp.redirect = tmp.children[0].path
        }
        result.push(tmp)
    })
    return result
}
// 这是我重写的方法
export function filterTargetRoutes(routes) {
    const result = []
    routes.forEach(route => {
        const tmp = { ...route }
        if (tmp.children && tmp.children.length) {
            tmp.children = filterAddRoutes(tmp.children)
        }
        if (tmp.children && tmp.children.length && tmp.path) {
            try {
                const path = 'modules/' + tmp.path.replace(/(^\/+|\/+$)/g, '')
                if (appLib.appUtil.isProduction()) {
                    tmp.component = () => import('@/views/' + path)
                } else {
                    tmp.component = require('@/views/' + path).default
                }
            } catch (error) {
                console.error(error.message)
                // appLib.appUtil.catchError(error)
            }
        }
        if (tmp.children && tmp.children.length && !tmp.redirect) {
            tmp.redirect = tmp.children[0].path
        }
        result.push(tmp)
    })
    return result
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue 一个网站如何实现两个菜单路由 的相关文章

  • 消息“在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调”

    我正在使用 Puppeteer 和 Jest 来运行一些前端测试 我的测试如下 describe Profile Tab Exists and Clickable settings user gt test Assert that you
  • jQuery,REAL:不是等价的运算符?

    此代码行选择任何类名不是 id 和 quantity 的 div 内的所有子输入 div item gt div not id quantity gt input live keydown function event 执行相反操作的代码行
  • 如何按照编写的顺序迭代 javascript 对象属性

    我发现了代码中的一个错误 我希望通过最少的重构工作来解决该错误 此错误发生在 Chrome 和 Opera 浏览器中 问题 var obj 23 AA 12 BB iterating through obj s properties for
  • 动画进度元素值

    我有一个progress元素 该元素如下所示 div class container div div div
  • Leaflet js虚构地图

    我是 Leaflet 的新手 我想了解如何创建完全交互式的虚构地图 我有一张图像想要转换为传单地图 该图像基本上像图表一样具有许多连接和点 我想首先将该图像转换为地图 能够将鼠标悬停在这些点上 突出显示它们并显示有关它们的信息 并且还可以在
  • 即使我可以监视其他方法,也无法监视事件处理程序

    我想使用 Jest Jasmine Enzyme 测试 React 中的事件处理程序 MyComponent js import React from react class MyComponent extends React Compon
  • jquery window.open 在 ajax 成功中被阻止

    尝试在我的 ajax 成功调用中打开一个新的浏览器窗口 但是 它被阻止为弹出窗口 我做了一些搜索 发现用户事件需要绑定到 window open 才能避免这种情况发生 我还找到了这个解决方案 您可以在 ajax 之前打开一个空白窗口 然后在
  • 是否可以使用 javascript 测试用户的浏览器/操作系统是否支持给定类型的链接?

    是否可以使用 javascript 或其他任何东西 测试用户的操作系统 浏览器是否支持给定的 url 方案 例如 大多数仅使用网络邮件的用户计算机上未设置 mailto 是否有可能以某种方式捕获单击 mailto 链接的尝试并弹出比浏览器错
  • Jquery 中的动态滚动位置

    请帮助我解决以下情况 我有 3 个页面 当滚动到达第二页时 用户滚动页面 它必须找到特定的 ID 然后触发一个函数 一旦第三页开始 另一个函数就会触发 根据要求我不应该使用任何插件
  • 如果链接包含特定文本,jQuery 将类添加到 href

    我的网站上的列表中有一些动态填充的链接 这些链接链接到文件 是否可以使用 jQuery 查看文件名是否以 pdf 结尾 并在 href 或类似的链接文本以 mp3 结尾时添加一个类 例如 我的列表中有以下链接 文件1 pdf 歌曲1 mp3
  • Javascript - 将值从下拉框传递到 Google Maps API

    我正在使用 Google 地图 API 为一家出租车公司创建报价表 目前 用户在 2 个文本框中输入出发点和接载点 API 会计算两点之间的距离以及行程费用 我正在尝试添加两个具有设定位置的下拉框 以便用户可以选择这些位置之一或使用文本框输
  • Google Chrome 106 可拖动导致元素消失

    使用拖放元素时 绝对定位元素中包含的大多数其他元素都会从屏幕上消失 如果我调整窗口大小 这些元素会出现 但在开始拖动时会再次消失 我在最新版本的 Google Chrome 106 和 Beta 版本 107 0 5304 18 以及现在的
  • 使用 JS 合并具有相同值的相邻 HTML 表格单元格

    我已经为此苦苦挣扎了一段时间 我有一个根据一些 JSON 数据自动生成的表 该数据可能会有所不同 我想合并第一列中具有相同值的相邻单元格 例如此表中的 鱼 和 鸟 table tr td fish td td salmon td tr tr
  • 如何将送货地址复制到帐单地址

    我想知道是否可以将送货地址复制到帐单地址 当用户单击与送货地址相同的复选框时 送货地址值将被复制到账单输入字段 我完成了大部分部分 但我不确定如何将选择菜单 状态 值复制到帐单地址 我真的很感谢任何帮助 My code document r
  • JS用正则表达式替换数字

    我有元素的标识符 如下所示 form book 1 2 3 我想要的是用其他值替换该标识符中的第二个数字 我将函数 match 与以下正则表达式一起使用 var regexp d d d 但它返回我包含的数组 1 2 3 2 因此 当我尝试
  • 单击关闭按钮后不显示 Google 一键登录 UI

    我正在尝试按照本指南使新的谷歌一键登录工作 https developers google com identity one tap web https developers google com identity one tap web
  • 为什么“tbody”不设置表格的背景颜色?

    我在用 tbody 作为 CSS 选择器来设置background color在一个表中 我这样做是因为我有多个 tbody 表内的部分 它们具有不同的背景颜色 我的问题是 当使用border radius在细胞上 细胞不尊重backgro
  • 如何在 javascript 正则表达式中匹配平衡分隔符?

    我原以为这个问题是不可能的 据我所知 Javascript 的正则表达式既没有递归插值 也没有漂亮的 NET 平衡组功能 但问题就在那里 如问题 12 所示正则表达式 alf nu http regex alf nu 匹配平衡对 lt an
  • 如何在打字稿文件中导入没有定义文件的js库

    随着我们的项目变得越来越大 我想从 JavaScript 切换到 TypeScript 以帮助进行代码管理 然而 我们使用许多库作为 amd 模块 我们不想将其转换为 TypeScript 我们仍然想将它们导入 TypeScript 文件
  • 在 GWT 中,在任何主机页标记上添加事件处理程序

    我想为任何标签添加 MouseOver 事件处理程序 举个例子 我想为旧版 HTML 页面中的每个锚点页面添加事件处理程序 继GWT指南 http code google com webtoolkit doc 1 6 DevGuideUse

随机推荐

  • pytorch学习之---squeeze()和unsqueeze()函数功能及使用

    首先这个squeeze单词啥意思 1 squeeze 1 和squeeze 1 作用 两者的效果一样 都是给张量tensor降维 但不是啥张量都可以用这两个函数来降维 它只能降维一种情况下张量的维度 就是我的张量tensor是一个n 1维度
  • Linux(Centos 7)命令集(查看进程,杀死进程,查看日志,安装wget命令,安装netstat)

    查看进程 以zookeeper为例 ps ef grep zookeeper 查看进程 同时去掉当前的grep进程 ps ef grep java grep v grep 显示出所有的java进程 去处掉当前的grep进程 杀死进程 使用k
  • 2024 机器学习/深度学习/Python数据分析可视化/必过毕业设计选题

    深度学习 机器学习篇 1 基于机器学习的反电信诈骗系统 数据集 互联网公开渠道获取 技术 决策树 SVM算法 Django MySQL 功能 短信展示 诈骗短信判断 短信分析可视化 数据集管理 2 基于机器学习的垃圾短信过滤识别系统 数据集
  • 从端口号找到对应的Docker

    1 通常一台主机上会运行多个docker 如果有些docker端口号占用了 导致其它对应服务无法运行 这是可使用以下方法 通过端口号找到对应docker 1 根据提示占用的端口号portM找到占用端口号的进程 例如 查找占用443端口号的进
  • 操作系统原理——第六章:页面置换算法

    文章目录 1 功能与目标 2 实验设置与评价方法 3 局部页面置换算法 3 1 最优页面置换算法 OPT optimal 3 2 先进先出算法 FIFO 3 3 最近最久未使用算法 LRU Least Recently Used 3 4 时
  • gpg昨天成功后,今天又不行了

    echo test gpg2 clearsign BEGIN PGP SIGNED MESSAGE Hash SHA256 test gpg 签名时失败 No pinentry gpg stdin clear sign failed No
  • 3.3.Perl数据类型-数组

    3 3 Perl数据类型 数组 B站视频教程 菜鸟学生信 1 定义 一组有序的标量数据 数组中可以存储无限多的元素 数组变量 列表直接量 1 1 数组定义 array zhangsan 3 14 李四 36 undef undef wang
  • 西门子S7-200 SMART功能分享

    SIMATIC S7 200 SMART 是西门子公司经过大量市场调研 为中国客户量身定制的一款高性价比小型 PLC 产品 结合西门子 SINAMICS 驱动产品及 SIMATIC 人机界面产品 以 S7 200 SMART 为核心的小型自
  • labview串口打开之后visaclose不起作用关闭不了老是占用的问题

    labview串口打开之后visaclose不起作用关闭不了老是占用的问题 最近在做一个数据接收的上位机 用串口发送接收数据 之前有用过labview 整体操作相当简单 于是就打算用labview做一个 但是之前做labview的时候就有一
  • Java Socket实现基于NIO的TCP通信

    一 NIO的引入 对于BIO通信时 服务端ServerSocket会在accept方法 和read方法发生堵塞 导致别的请求无法进入 当然可以使用多线程处理 如果请求很多 就会有很多线程 消耗太大 NIO服务端ServerSocketCha
  • 【C++】C++中的继承

    1 继承的概念及定义 1 1继承的概念 继承 inheritance 机制是面向对象程序设计使代码可以复用的最重要的手段 它允许程序员在保持原有类特性的基础上进行扩展 增加功能 这样产生新的类 称派生类 继承呈现了面向对象程序设计的层次结构
  • 前端校招笔试题(一)

    下面这些是一些经常碰到的笔试题 但是跟前端是没什么关系的 就是属于那种做技术岗都要会的那种 一般都是选择题或者填空题 二叉树遍历 前序遍历 前序遍历首先访问根结点然后遍历左子树 最后遍历右子树 在遍历左 右子树时 仍然先访问根结点 然后遍历
  • 家里摄像头密码忘记找回

    密码忘记找回 在生活中 摄像头随处可见 他们应用在很多方面 已经成了我们必备的工具 那他们可能有存在漏洞 今天我对我的忘记密码家庭摄像头将进行找回 开始 第一步 确定目标 我家的摄像头 88 248 xx xx 80 第二步 进行登录 我忘
  • MyBatisPlus 使用LambdaQueryWrapper 构建查询条件提示:Didn‘t start with ‘is‘, ‘get‘ or ‘set‘

    今天在研发功能时 进行单表查询条件编写时 产品经理在需求文档中写一句 提供等于备案时间的查询功能 本项目的基础架构时 SpringBoot SpringBoot Alibaba Cloud MyBatis 3 MyBatis Plus 在D
  • preprocessing.LabelBinarizer()返回的结果不是one-hot怎么解决?

    先来看一个符合预期的代码 输出one hot编码 from sklearn import preprocessing lb preprocessing LabelBinarizer lb fit transform range 0 3 输出
  • sudo 出现unable to resolve JD 解决方法

    Ubuntu环境 假设这台机器名字叫abc 机器的hostname 每次执行sudo 就出现这个警告讯息 sudo unable to resolve host abc 虽然sudo 还是可以正常执行 所以就直接从 etc hosts 设定
  • 【大数据】图解 Hadoop 生态系统及其组件

    图解 Hadoop 生态系统及其组件 1 HDFS 2 MapReduce 3 YARN 4 Hive 5 Pig 6 Mahout 7 HBase 8 Zookeeper 9 Sqoop 10 Flume 11 Oozie 12 Amba
  • text文本框, textarea文本域 框内提示文字

    首先要用到两个事件 一个是onfocus 光标落在文本框发生的事件 一个是onBlur 光标失去焦点的时候发生的事件
  • SpringBoot 生成 PDF文件

    文章目录 前言 一 使用步骤 1 添加iText依赖 2 创建一个Controller 总结 前言 在Spring Boot应用程序中生成PDF需要使用第三方库 本例中我们将使用iText库 它是一个用于生成PDF文件的Java库 下面是一
  • Vue 一个网站如何实现两个菜单路由

    极少有这种奇怪的需求 去年遇到的 一直没有整理 现在有时间整理了 尴尬的是项目的登录密码忘了 没办法调试了 但是大体的思路是这样的 需求 网站原本有一个菜单列表 现在用户希望点击某行数据的时候 弹出一个新的页面 同时左侧加载一个新的菜单 之