记一个“奇葩”需求的实现

简介: 记一个“奇葩”需求的实现

1、前言


我们这边没有专门的产品经理,UI对产品的设计基本具有决定权,说实话,是有那么一点可怖的(前后改了很多次,差一点就改回原版了,我自己都觉得不好意思了🤣)。


🤔有没有一种可能:我们UI体验过的产品少,缺少对产品以及用户行为的认识。设计出来的东西看似很华丽,其实缺失很多场景下的分析,不切合实际,这也正是产品经理需要做的工作之一。大多数人说的“用户体验”或许只是主观的、想当然的(俺也一样😮)。


自从接触互联网开始我就在有意的学习怎么做产品,期间还考虑过转产品,永远不要拿业余的跟专业的比,没什么可比性,不成熟。继续保持思考、学习。


下面记录一下我觉得比较有意思的、会引起思考的需求,所用技术:vuevue-routerelement-ui


2、需求:


导航菜单(el-menu组件)竖向展示的

  1. 鼠标移入一级菜单展示下面的子菜单,移出则收起来(手风琴模式,正常状态下只保持一个菜单处于展开状态,手动鼠标悬浮展开的不算)


  1. 选中某个子菜单时高亮对应的一级菜单,并且当鼠标移出高亮的这个菜单模块时不折叠,但是可以点击一级菜单进行折叠(注意:跟第一条有区别)


3、问题:


  1. element-ui的导航组件子菜单打开的触发方式可以通过 menu-trigger 参数控制,但是,只在菜单是水平展示(horizontal)的情况下生效。嘶~! 我不禁暗想🤔:垂直模式滑动展开真的会有系统这么做吗?(只能自己修改了)


  1. unique-opened 参数可以控制是否只保持一个子菜单展开,但是在没有子菜单的情况下失效(需要手动修改)


4、思路分析:


导航菜单使用递归el-submenu组件实现


  1. 鼠标滑动展开关闭需求:


  • el-submenu 组件编写鼠标移入移出事件(mouseentermouseleave),拿到indexPath,调用openclose方法打开或者折叠菜单(注意:没有子菜单的一级菜单鼠标移入移出不做处理)


  1. 只保持一个菜单处于展开状态


  • 先配置 unique-opened 参数为 false ,以保证 openedMenus 只有一个( openedMenusel-menu内部维护的属性, 可以自行打印看一下)

image.png

一开始我想在子菜单展开折叠的回调事件(openclose)里写逻辑判断,但是不知道什么原因回调事件不触发(注意:open方法open事件不一样,组件三大要素:属性、事件、方法),所以我就考虑在select回调事件里写逻辑了

  • 在菜单激活的select回调事件中,让上一个打开的菜单调用close方法关闭。(这里需要记录上次打开菜单的index,这里我使用sessionStorage记录)


5、代码展示:


只展示代码片段,仅供参考


sessionStorage使用自己封装的,之前文章有写过,感兴趣的可以看一下这里

  • el-submenu 组件
menuEnter() {
  // isNest 是否还有子菜单 true:没有子菜单 false:有子菜单
  if (!this.isNest && this.item.alwaysShow) {
    // basePath: 一级菜单
    this.$emit('handleOpen', this.basePath)
  }
}
menuLeave() {
  // 存在子菜单,并且不是打开状态的菜单,鼠标离开的时候需要合起来
  if (!this.isNest && !this.curMenuIsOpened) {
    // basePath: 一级菜单
    this.$emit('handleClose', this.basePath)
  }
}
  • el-menu 组件
// 登录系统的时候,记录展开的菜单信息,
// 在 mounted 里面获取 openedMenus ,并记录信息
mounted() {
  // 获取当前展开的菜单 - array
  // 手风琴模式,只有一个展开菜单
  // openedMenus 是内部属性
  const {openedMenus = []} = this.$refs.menuRef;
  if (openedMenus && openedMenus.length > 0) {
    // 获取展开菜单的 index
    const index = openedMenus[0];
    sessionStorage.put('preActiveMenu', index)
  }
}
methods: {
  handleOpen(indexPath) {
    // 调用 open 方法, 打开close,
    this.$refs.menuRef.open(indexPath);
  }
  handleClose(indexPath) {
    // 调用 close 方法, 关闭close
    this.$refs.menuRef.close(indexPath);
  }
  handlerSelect(index, indexPath) {
    // 1. 获取上次激活的菜单信息
    const _preActiveMenu = sessionStorage.get('preActiveMenu') || '';
    if (_preActiveMenu) {
      // 如果存在,则关闭该菜单,再打开新的
      this.$refs.menuRef.close(_preActiveMenu);
    }
    // 2. 记录这次激活的菜单信息
    if (indexPath.length > 0) {
      sessionStorage.put('preActiveMenu', indexPath[0])
    }
  }
}


6、最终效果展示:


image.png


总结


用了UI框架之后就不可避免的会跟产品设计风格向左,这就需要在框架基础之上进行修改。框架也是由一个个组件组成的,抓住组件设计的三要素:属性、事件、方法,了解框架组件背后的工作原理,就可以轻松的进行修改啦🎉🎉

目录
相关文章
|
4月前
|
缓存 Java 应用服务中间件
2021年9月28日,老是遇到一些非常奇葩的问题。就离谱、好好的一个web项目就莫名奇妙坏了。
开发者在使用IDEA 2020编辑器搭建的SSM框架图书管理系统中,遇到删除功能异常问题,经过一系列尝试后发现是IDEA编译缓存导致的,最终通过重新编译项目解决了问题。
|
监控 关系型数据库 MySQL
C#程序发布时,一定要好好地保护,不然你会后悔的
C#程序发布时,一定要好好地保护,不然你会后悔的
98 0
|
SQL 存储 监控
聊聊那些年遇到过的奇葩代码
无论是开发新需求还是维护旧平台,在工作的过程中我们都会接触到各种样式的代码,有时候会碰到一些优秀的代码心中不免肃然起敬,但是更多的时候我们会遇到很多奇葩代码,有的时候骂骂咧咧的吐槽一段奇葩代码后定睛一看作者,居然是几个月以前自己的写的,心中难免浮现曹操的那句名言:不可能,绝对不可能。
聊聊那些年遇到过的奇葩代码
|
存储 机器学习/深度学习 监控
我是傻x,被迫看了 1 天源码,千万别学我!
大家好,我是零一,之前一直很忙,业余时间的输入和输出都 24k铝合金人眼可见 得下降,这不最近上海疫情严重么,算了一下居家办公也已经将近 1个月了,这才有些许时间学习,所以最近也是一直在鼓捣点新东西,不为别的,主要是想再多输入一些新的知识
182 0
我是傻x,被迫看了 1 天源码,千万别学我!
|
JavaScript 前端开发
不看后悔系列!原来代码还可以这么写!
不看后悔系列!原来代码还可以这么写!
|
Web App开发 搜索推荐 开发者
上了学这么久,我才知道他们为什么可以这么爽(上)
目录 前情提要 安装插件 1.下载链接 2.安装 遇到无法拖进去怎么办? 3.新的体验
上了学这么久,我才知道他们为什么可以这么爽(上)
|
数据安全/隐私保护 索引 Python
这下女友总算满意了!
上次跟女友介绍了正则表达式的基本语法,以及在 Python 中如何使用。结果她还不满意,说传说中的正则表达式就这么简单?当然不是,今天就来跟大家一起介绍下正则表达式更多的使用技巧。
167 0
|
物联网 大数据 数据库
产品:“嘘,这事千万别让开发知道”
作为2019年首场最受瞩目的云计算开发者大会,阿里云火力全开。本次开发者大会聚焦开源大数据、IT基础设施云化、数据库、云原生、物联网五大主力方向。
2207 0
无语中。。。。。。
      甲说:我有一个笔记本,我用着挺好,但是呢这个本本有一点毛病,麻烦你来修理一下,我最近实在是太忙了,没有时间,当然不会让你白修的,我支付维修费。       乙说:我有一个笔记本,我用着挺好,我打算卖给你,但是呢,这个本本有一点小毛病,如果你能修理好呢,我在买回来,然后我在卖。
641 0

相关实验场景

更多