vue antd的menu组件使用

    • 实现效果
  • 记录实现的主要几步
    • 1、数据处理
    • 2、布局
    • 3、功能实现,搜索标题则当前菜单高亮,右侧则显示对应的内容
    • 用到menu菜单时,需要注意它的api
    • 右侧显示content内容

实现效果


注:我这里的输入框,搜索的时候是只支持搜索标题,支持模糊搜索

记录实现的主要几步

1、数据处理

在写静态页面的时候需要写假数据,会与后台沟通,这个地方菜单后期会返回什么样的数据结构,有的后台会以前端为准,你想要什么样的数据结构就给你什么样的结构,但这里后台按照他自己的来,直接给前端返回了一个扁平化的数据结构,意思是要自己处理成自己要的结构,没办法,你只得自己处理数据了。
沟通后,后台后面会返回下面这样的数据结构

 data() {return {// 后台后面会返回的数据结构list: [ {id: 1,parentId: 0,fileType: 'dir',fileName: '文件夹1'},{id: 2,parentId: 1,fileType: 'dir',fileName: 'api'},{id: 5,parentId: 1,fileType: 'dir',fileName: '文件夹2'},{id: 3,parentId: 2,fileType: 'file',fileName: '获取视频抽帧结果',fileContent:'### 引用 Blockquotes\n\n> 引用文本 Blockquotes\n\n引用的行内混合 Blockquotes\n\n> 引用:如果想要插入空白换行`即<br />标签`,在插入处先键入两个以上的空格然后回车即可,[普通链接](https://www.mdeditor.com/)。'},{id: 6,parentId: 2,fileType: 'file',fileName: '根据租户和客户获取物联网产品列表',fileContent:'# 技术文档一级标题名称过长是否影响右边导航展示\n## 服务发布\n### 服务api\n#### 未公开api\n# 根据租户和客户\n###### 获取物联网产品\n\n1. 开发者可以管理的部分主要分为 showcore 轮播图、\n2. 桌面推荐、\n3. 应用模板(适用于带屏设备上的内容展示)和\n4. app 轮播图和内容推荐(适用于控制app上的内容展示)。\n5. 开发者可以根据自身的需求在相应位置进行配置,并通过接入接口(link)来实现前端展示。[百度](https://www.xfyun.cn/?ch=bd05&renqun_youhua=478960&bd_vid=11991992860660649978)![车辆违停](https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=724715456,995074424&fm=15&gp=0.jpg)\n6. ![0NL~UOVXQEBWDKMRXU.png](http://10.40.204.55:80/group1/M00/00/19/CijMN1_sHmuAVP0aAAGeIkymU_g515.png)'},{id: 4,parentId: 0,fileType: 'dir',fileName: '文件夹2'},{id: 7,parentId: 4,fileType: 'file',fileName: '文件',fileContent: '我是文件'}],apilist:[]//这里存放处理后的数据selectedKey: [],//展开的api    openKeys: [0] /*当前展开的菜单*/,

fileType值为dir代表是文件夹,而fileType值为file代表是文件夹下面的子文件,只有值为file时filecontent才会有内容.
这个地方所以要处理成三级菜单的才能符合需求。
鉴于我原生的不是很好,所以网上搜索了下参考了网上的写法

   // 将后台返回的扁平化数据处理成树形结构toTree(data) {let result = []if (!Array.isArray(data)) {return result}data.forEach((item) => {delete item.children})let map = {}data.forEach((item) => {map[item.id] = item})data.forEach((item) => {let parent = map[item.parentId]if (parent) {;(parent.children || (parent.children = [])).push(item)} else {result.push(item)}})this.apilist = result}

这里是封装的一个方法,等到获取接口数据后直接调用这个方法将获取到的值传递过去,最后处理完后将值赋值给apilist这个数组

2、布局

数据处理好了,这个时候就可以布局了
这里用的antd 的menu菜单这个组件

  <a-menustyle="width: 214px":default-open-keys="['1']":open-keys.sync="openKeys":mode="mode"@openChange="onOpenChange":defaultSelectedKeys="defaultSelectedKeys"v-model="selectedKey"><template v-for="item in apilist"><!-- 第一层 --><template v-if="item.children"><a-sub-menu :key="item.id"><span slot="title"><span>{{ item.fileName }}</span></span><template v-for="subitem in item.children"><!-- 第二层 --><template v-if="subitem.children"><a-sub-menu :key="subitem.id" :title="subitem.fileName"><template v-for="sub3 in subitem.children"><!-- 第三层 --><template v-if="sub3.children"><!-- <a-menu-item :key="sub3.id" @click="setKey(sub3)">{{ sub3.fileName }}</a-menu-item> --><a-sub-menu :key="sub3.id" :title="sub3.fileName"><template v-for="sub4 in sub3.children"><a-menu-item:key="sub4.id"@click="setKey(sub4)">{{ sub4.fileName }}</a-menu-item></template></a-sub-menu></template><!-- 第三层 --><template v-else><a-menu-item :key="sub3.id" @click="setKey(sub3)">{{ sub3.fileName }}</a-menu-item></template></template></a-sub-menu></template><!-- 第二层 --><template v-else><a-menu-item :key="subitem.id" @click="setKey(subitem)">{{ subitem.fileName }}</a-menu-item></template></template></a-sub-menu></template><!-- 第一层 --><template v-else><a-menu-item:key="item.id"@click="setKey(item)":class="item.fileType == 'file' ? 'actstyle' : ''">{{ item.fileName }}</a-menu-item></template></template></a-menu>

不会布局的童鞋,可以仔细看下这个注释,每次遍历第一层的时候都会判断有没有children,有就怎样,没有就怎样,如果有就遍历它并判断它还有咩有children属性,有就再接着遍历和判断,每次key绑定时要注意要绑定当前数据的id

3、功能实现,搜索标题则当前菜单高亮,右侧则显示对应的内容

每次点击菜单时,判断它是dir还是file,因为dir是没有content值的,
如果是file就将直接赋值到页面上,并将当前的菜单高亮,这里的selectedkey就是当前高亮的值的id

setKey(item) {if (item.fileType == 'file') {let activeid = item.idthis.editorValue = item.fileContentthis.filename = item.fileNamethis.list.forEach((item, index) => {if (item.id == activeid) {this.selectedKey = [activeid]}})this.findParent(item.id)  } else if (item.fileType == 'dir' && item.children) {if (item.children[0].children) {this.editorValue = item.children[0].children[0].fileContentthis.filename = item.children[0].children[0].fileNamethis.selectedKey = [item.children[0].children[0].id]this.openKeys=[]this.findParent(item.children[0].children[0].id)} else {this.editorValue = item.children[0].fileContentthis.filename = item.children[0].fileNamethis.selectedKey = [item.children[0].id]this.openKeys=[]this.findParent(item.children[0].id)}}else {this.editorValue = item.fileContentthis.filename = item.fileNamethis.selectedKey = [item.id]this.findParent(item.id)}},

如果是dir,还要判断它有没有children,没有就取children的值,有就取children的children的值

这里封装的findparent方法,是为了在搜索菜单的时候不仅当前菜单要高亮,同时它的前面的父级都要展开,否则搜索到了三级菜单时,没有展开前面的菜单,你就看不见它了

   // 根据元素ID遍历树形结构,查找到所有父元素ID,目的为了展开findParent(idx) {let pid = []this.list.forEach((item) => {if (idx === item['id']) {pid = item['parentId']this.findParent(pid)this.openKeys.push(pid)}})},

用到menu菜单时,需要注意它的api

高亮的api selectedKey: []
展开的api openKeys: [0] 当前展开的菜单
这两个api绑定的一般都是它的id

右侧显示content内容

这里我用到的是mavon-editor,可以自行搜索下它的使用方法,这里就不做介绍了, “mavon-editor”: “^2.9.1”,这里我用的是这个版本的。

  <mavon-editorv-model="editorValue":toolbarsFlag="false":editable="true":subfield="false":defaultOpen="'preview'"class="mavon_editor":toolbars="toolbar_settings":navigation="true"
/>

vue antd的menu组件使用相关推荐

  1. Vue之单文件组件的数据传递,axios请求数据及路由router

    1.传递数据 例如,我们希望把父组件的数据传递给子组件. 可以通过props属性来进行传递. 传递数据三个步骤: 步骤1:在父组件中,调用子组件的组名处,使用属性值的方式往下传递数据 <Menu ...

  2. Vue第二天学习总结—— Vue全家桶之组件化开发(组件化开发思想、组件注册、Vue调试工具用法、组件间数据交互传递、组件插槽、基于组件的案例——购物车)

    (一) 组件化开发思想 1. 现实中的组件化思想体现 组件化即是对某些可以进行复用的功能进行封装的标准化工作 标准:要想组件能够成功组合在一起,每个组件必须要有标准 分治:将不同的功能封装到不同的组件 ...

  3. Vue生命周期及组件

    目录 Vue 生命周期钩子 钩子函数的由来 生命周期钩子函数 生命周期图示 钩子函数测试 添加组件展示: 组件数据更新: 没建任务, 没有任务销毁, 看不到实际的效果. 创建定时任务销毁定时任务 Vu ...

  4. 关于vue中表单和组件的笔记

    关于vue中表单和组件的笔记 今天内容 表单 文本 多行文本 单选框 多选框 下拉选择框 修饰符 .lazy .number .trim 案例:用户注册 搭建界面 定义数据 绑定数据 绑定事件 组件 ...

  5. vue 定义全局弹框_VUE路由拦截:Vue自定义全局弹窗组件

    前言 在任何一个平台中,如果需要增加用户黏度,除了用户需要的基本内容外,用户登录注册提交信息也是非常重要的一环,可以了解用户基本信息,用户喜欢等. 抛出前后端混合开发外,vue可以轻松的实现路由拦截. ...

  6. vue树形结构html,怎么在vue中利用递归组件实现一个树形控件

    怎么在vue中利用递归组件实现一个树形控件 发布时间:2021-06-11 17:26:48 来源:亿速云 阅读:81 作者:Leah 本篇文章为大家展示了怎么在vue中利用递归组件实现一个树形控件, ...

  7. vue实现简单表格组件

    本来想这一周做一个关于vuex的总结的,但是由于朋友反应说还不知道如何用vue去写一个组件,所以在此写写一篇文章来说明下如何去写vue页面或者组件.vue的核心思想就是组件,什么是组件呢?按照我的理解 ...

  8. 【Vue】Vue中的父子组件通讯以及使用sync同步父子组件数据

    前言: 之前写过一篇文章<在不同场景下Vue组件间的数据交流>,但现在来看,其中关于"父子组件通信"的介绍仍有诸多缺漏或者不当之处, 正好这几天学习了关于用sync修饰 ...

  9. vue 改变domclass_基于 vue 开发甘特图组件的心路历程(兼设计分享)

    语雀原文 有更好的排版体验~ 这篇文章主要讲述笔者开发 v-gantt 甘特图组件的经过. 起源 公司项目有个甘特图的需求. 笔者考察了世面上 常见的甘特图组件 后,本着 我上我也行 的心态,以及考虑 ...

  10. Vue.js 单文件组件

    单文件组件 介绍 在很多 Vue 项目中,我们使用 Vue.component 来定义全局组件,紧接着用 new Vue({ el: '#container '}) 在每个页面内指定一个容器元素. 这 ...

最新文章

  1. Python使用tkinter构建一个多元回归预测模型GUI界面(接受用户输入数据并给出模型推理结果)
  2. .vimrc文件中的leader是什么?
  3. 项目管理 - 学习总目录
  4. 互联网移动支付技术_安全架构图(安全技术/安全协议/加密技术)——转载图片...
  5. 深入剖析Redis系列(四) - Redis数据结构与全局命令概述
  6. 基于Windows8与Visual Studio2012开发内核隐藏注册表
  7. 【干货】奢侈品线上消费圈层洞察-阿里妈妈.pdf(附下载链接)
  8. 计蒜客2019蓝桥杯省赛 B 组模拟赛(一)轻重搭配|
  9. 护士如何预防职业病:下肢静脉曲张-健康小常识
  10. 在Swift中向数组添加元素
  11. shell手册--笨鸟杰作
  12. linux scp 遇到空格
  13. 计算机重置指令,如何利用指令重置Win7网络设置
  14. 计算机组成原理知识点总结白中英,计算机组成原理知识点总结.pdf
  15. BMFONT 字体制作
  16. maya如何查看资源大纲_干货|Maya入门到精通完全自学教程大纲(建模篇)
  17. php快递100查询,php采集快递100的快递查询api
  18. 【神器】yololib 飘云修改版 -- 给iOS APP 添加导入表注入--你懂的
  19. win10输入法不能切换_Win10升级后中英文输入法无法切换?一个简单设置,10秒轻松搞定...
  20. 伊云谷数字科技 首家登兴柜的云端数字服务公司

热门文章

  1. Day3 函数 参数 变量 递归——python学习之路
  2. echarts 实现区域划分 折线图
  3. 一条机器“龙”,堪称史上最快异形机器人!
  4. python 头条新闻机器人_荐GitHub:今日头条机器人
  5. C++规范编码引涉语法点之(8)trivial和non-trivial构造/析构/复制/赋值函数 及POD类型
  6. 李纳斯将注册 Linux 商标 用 Linux 名称将收费
  7. Hexo+GithubPage搭建Fan主题的博客(7)配置自定义域名
  8. 用python进行数据分析(一:数据理解)
  9. VMware ESX Server常用命令行
  10. B站2020年每周必看热门视频数据盘点(数据分析)