1、样式

@import "../../styles/varibles";.app-sidebar {overflow: hidden;width: 180px;> ul > li {position: relative;font-size: $font-lg;border-bottom: $border;border-right: $border;border-left: $border;&:first-child {border-top: $border;border-top-right-radius: $border-radius;border-top-left-radius: $border-radius;}&:last-child {border-bottom-right-radius: $border-radius;border-bottom-left-radius: $border-radius;}}.active {border-left: 3px solid $primary-color;background-color: $item-active-bg-color;a {font-weight: bold;}}.nav-item {.item-name {margin-right: 30px;height: 50px;line-height: 50px;}.anticon {position: absolute;height: 50px;line-height: 50px;left: 7px;font-size: $font-sm;color: $title-color;}}&.is-open {.anticon {color: $primary-color;}.nav-item-content {color: $title-color;font-weight: bold;}}&:hover {.anticon,.nav-item-content {color: $primary-color;}}&:active {.nav-item-content {color: $primary-color;font-weight: bold;}}.sub-menu {border-top: none;font-size: $font-sm;.item-name {height: 40px;line-height: 40px;}.child-nav-item.active {.item-name {color: $primary-color;font-weight: bold;}}}
}

2、js文件

import React from "react";
import {withRouter} from "react-router-dom";
import {Icon} from "antd";
import _ from "lodash";
const menus = [];
const currentState = '';class Sidebar extends React.Component {componentDidMount() {const defaultNavItem = this.getDefaultNavItem();if (defaultNavItem === undefined) {this.props.history.replace('/forbidden');return;}this.setActiveNavItem(defaultNavItem);this.openNavItem(defaultNavItem);if (this.hasChildItems(defaultNavItem)) {this.setActiveChildNavItem(defaultNavItem.childItems);}}getDefaultNavItem() {const currentState = currentState;return _.find(menus, function (navItem) {if (navItem.state === currentState || _.some(navItem.childItems, {state: currentState})) {return navItem;}})}setActiveNavItem(navItem) {if (this.hasChildItems(navItem)) {this.clearParentActiveStatus();}else {this.clearActiveStatusWithChildItems();navItem.isActive = true;if (!!navItem.state) {this.props.history.replace(navItem.state);}}}setActiveChildNavItem(childNavItems) {const currentState = currentState;this.clearActiveStatusWithChildItems();if (_.isArray(childNavItems)) {childNavItems.forEach(function (navItem) {navItem.isActive = navItem.state === currentState;});}else {childNavItems.isActive = true;}}openNavItem(navItem) {navItem.isOpen = this.hasChildItems(navItem);this.forceUpdate();}onOpenNavItem(navItem) {if (this.hasChildItems(navItem)) {navItem.isOpen = !navItem.isOpen;}else {navItem.isOpen = false;}this.forceUpdate();}clearParentActiveStatus() {menus.forEach(function (navItem) {navItem.isActive = false;})}clearActiveStatusWithChildItems() {menus.forEach(function (navItem) {navItem.isActive = false;navItem.childItems.forEach(function (childItem) {childItem.isActive = false;})})}hasChildItems(navItem) {return !!navItem.childItems && navItem.childItems.length > 0;}menuIcon(navItem) {return <Icon type={navItem.isOpen ? 'caret-down' : 'caret-right'}/>
    }openOrActiveClass(navItem) {const basic = "nav-item";const openClass = navItem.isOpen ? "is-open" : "";const activeClass = navItem.isActive ? "active" : "";return basic + " " + openClass + " " + activeClass;}activeClass(navItem) {const basic = "child-nav-item";const activeClass = navItem.isActive ? "active" : "";return basic + " " + activeClass;}render() {return (<aside className="app-sidebar"><ul className="list-unstyled menu">{menus.map((navItem, index) => {return (<li key={'li_'+index} className={this.openOrActiveClass(navItem)}><span key={'span' + index}className="item-name nav-item-content"onClick={() => {this.setActiveNavItem(navItem);this.onOpenNavItem(navItem)}}>{this.hasChildItems(navItem) ? this.menuIcon(navItem) : null}{navItem.name}</span>
                                   {navItem.isOpen ?<ul key={'subMenu_ul'} className="list-unstyled sub-menus">{navItem.childItems.map((childItem, itemIndex) => {return (<li key={'submenu_li_' + itemIndex}className={this.activeClass(childItem)}onClick={() => {this.setActiveChildNavItem(childItem);this.setActiveNavItem(childItem)}}><a className="item-name">{childItem.name}</a></li>
                                                       )})}</ul> : null
                                   }</li>
                           )})}</ul></aside>
        )}
}export default withRouter(Sidebar);

3、数据

[{"description": "userCanGetMenus","request": {"method": "GET","uri": "/api/menus"},"response": {"status": 200,"json": {"id": "DEMO0000","fatherId": "00000000","state": "process","name": "运营流程","childItems": [{"id": "DEMO1000","fatherId": "DEMO0000","state": "/process.personal-task-pool","name": "个人任务池","childItems": []},{"id": "DEMO2000","fatherId": "DEMO0000","state": "/process.common-task-pool","name": "公共任务池","childItems": []},{"id": "DEMO1000","fatherId": "DEMO0000","state": "/process.launch","name": "流程发起","childItems": []},{"id": "DEMO1000","fatherId": "DEMO0000","state": "/process.search","name": "流程查询","childItems": []}]}}}
]

转载于:https://www.cnblogs.com/Nyan-Workflow-FC/p/9332280.html

react style: 二级菜单相关推荐

  1. document操作例题1-延迟注册与二级菜单

    一.倒计时10秒后可以注册 <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http ...

  2. css二级菜单会然下面遮住_JavaScript实现下拉二级菜单详解

    下拉菜单最终效果如图: 实现原理,通过绝对定位的方式,使下拉列表脱离文档流.通过js或者css来控制鼠标移入后的效果 初始时可以改变 1.display:none;使其隐藏 2.height:0px; ...

  3. HTML一级菜单和二级菜单区别,JavaScript点击一级菜单打开和关闭二级菜单

    [JavaScript点击一级菜单打开和关闭二级菜单] ``` Document #sub_menu_1,#sub_menu_2{ display: none; } ul li:hover{ curs ...

  4. CSS之实现二级菜单动态出现

    一直觉得二级菜单的出现效果仅仅有js才干控制.今天研究了一下阿里巴巴站点的首页,才发现,原来二级菜单的动态显示也能够使用CSS来控制,原来对CSS是静态的东西一直是误解它了,CSS也能够实现动态的效果 ...

  5. html与js二级菜单横排,JavaScript实现横向滑出的多级菜单效果

    本文实例讲述了JavaScript实现横向滑出的多级菜单效果.分享给大家供大家参考.具体如下: 这是一款JavaScript横向滑出的多级菜单,只用鼠标放上就可以动画出现二级菜单,整体设计精美,大气, ...

  6. 二级菜单不同方法的实现

    之前面试的时候被问到过一次,后来,在笔试的时候又遇到了,为了长点记性,就决定把这个好好写写. 第一种: 第一种是采用css来控制的:主要采用float,和position,display,hover来 ...

  7. Ionic如何实现单选二级菜单切换

    Ionic如何实现单选二级菜单切换 最近有个需求,需要做一个用户视图,数据全都从PC端系统实时取,由于这个功能在电脑浏览器展示还可以,即使菜单全部展开,只要美工稍加调整下位置也是放得下的,但是同样的功 ...

  8. Jquery垂直下拉二级菜单

    自己做了一个基于Jquery 的垂直下拉二级菜单功能,直接看图: Html的代码如下: <!DOCTYPE html> <html><head><meta c ...

  9. 用jquery插件写一个小米官网左侧二级菜单

    知识点:静态布局思路,jquery动态布局,代码格式规范,jquery插件调用, 鼠标滑动二级菜单构建. html代码: <div id="Tz_banner">< ...

最新文章

  1. 跟着 Event loop 规范理解浏览器中的异步机制
  2. install virtualenv
  3. Python 多进程、多线程启动
  4. 超出内容用省略号替代
  5. ASP.NET 动态加载WebService功能
  6. 查看Windows系统的开机、关机时间、开机时长等信息
  7. PHP常用函数大全500+
  8. 不小心删除微信聊天记录怎么恢复?不看看这几种方法怎么行
  9. Efficient Heterogeneous Collaborative Filtering without Negative Sampling for Recommendation (2020)
  10. python绘制直方图的函数_(六)pyplot基础图表函数(学习笔记)|python数据分析与展示...
  11. garch dcc用matlab,用matlab工具箱怎么对garch模型做...
  12. PHPstorm自动换行
  13. 传感器i2c与arduino连接_如何在两个Arduino开发板之间使用I2C总线进行通信
  14. 显示器连接服务器老一闪一闪,显示器黑屏一闪一闪的怎么回事_显示器黑屏一闪一闪的解决方法...
  15. 电脑运行慢?更频繁地使用它
  16. 信息通信行业政企业务主要发展方向探索
  17. C#调用SAPI实现语音合成的两种方法
  18. 苹果Mac big sur如何关闭开机提示音效?
  19. Cypress简易入门教程
  20. python unrar问题_(Python)linux命令unrar出现问题,我一辈子都搞不清原因

热门文章

  1. 启动虚拟机报错VMware Workstation cannot connect to the virtual machine
  2. js中的 substring和substr方法
  3. 关于表格前面checkbox复选框不打勾的问题
  4. 《信息处理技术员考试考前冲刺预测卷及考点解析》下午案例复习重点
  5. NPM流行包再起波澜:维护人员对俄罗斯用户发特定消息,谁来保证开源可信?...
  6. 奇安信代码安全实验室帮助微软修复高危漏洞,获官方致谢
  7. JavaScript高级编程
  8. (原創) 如何為Blog加上簡體中文(繁體中文)翻譯? (Web) (CSS) (JavaScript)
  9. HBase在共享经济互联网业务的应用
  10. 关联分析中可能的规则数的求法