如何在React中创建折叠展开列表

丹尼尔·史密斯

我尝试React (v 16.5)使用以下条件创建折叠并展开侧面菜单-

页面加载时,第一项(圆形)将处于展开视图中。一个项目可以一次展开,例如,如果用户单击第二个项目(“规范”),则第一个项目将折叠。我还希望在收起/展开事务期间进行一些CSS动画处理,例如平稳地向下/向上调整每个项目的主体部分并更改箭头图标。我的方法是在每个项目(sidebar-nav-menu-item)上动态添加/删除CSS类,例如-

sidebar-nav-menu-item item-active

因此,当一个项目处于展开视图时,它应该像上一类,而item-active当其处于折叠视图时将其删除默认情况下,div当项目处于折叠模式时,应通过CSS隐藏body (sidebar-nav-menu-item-body)。

import React, { Component } from 'react';

className SidebarNavs extends React.Component{
    constructor(props) {
       super(props);
    }

    render() {
        return(
            <div className="sidebar-nav">
                <div className="sidebar-nav-menu">

                    <div className="sidebar-nav-menu-item" data-id="circulars">
                        <div className="sidebar-nav-menu-item-head" onClick={this.handleExpandCollaps}>
                            <div className="sidebar-nav-menu-item-head-title">Circulars</div>
                            <div className="sidebar-nav-menu-item-head-help">
                                <button type="button" className="btn-help" onClick={this.moreInfoClick}>View more info</button>
                            </div>
                            <div className="sidebar-nav-menu-item-head-icon">
                                <i className="fa fa-caret-down" aria-hidden="true"></i>
                            </div>
                        </div>
                        <div className="sidebar-nav-menu-item-body">BODY CONTENT HERE</div>
                    </div>

                    <div className="sidebar-nav-menu-item" data-id="specifications">
                        <div className="sidebar-nav-menu-item-head" onClick={this.handleExpandCollaps}>
                            <div className="sidebar-nav-menu-item-head-title">Specifications</div>
                            <div className="sidebar-nav-menu-item-head-help">
                                <button type="button" className="btn-help" onClick={this.moreInfoClick}>View more info</button>
                            </div>
                            <div className="sidebar-nav-menu-item-head-icon">
                                <i className="fa fa-caret-down" aria-hidden="true"></i>
                            </div>
                        </div>
                        <div className="sidebar-nav-menu-item-body">BODY CONTENT HERE</div>
                    </div>


                    <div className="sidebar-nav-menu-item"  data-id="wo">
                        <div className="sidebar-nav-menu-item-head" onClick={this.handleExpandCollaps}>
                            <div className="sidebar-nav-menu-item-head-title">Work Orders</div>
                            <div className="sidebar-nav-menu-item-head-help">
                                <button type="button" className="btn-help" onClick={this.moreInfoClick}>View more info</button>
                            </div>
                            <div className="sidebar-nav-menu-item-head-icon">
                                <i className="fa fa-caret-down" aria-hidden="true"></i>
                            </div>
                        </div>
                        <div className="sidebar-nav-menu-item-body">BODY CONTENT HERE</div>
                    </div>

                </div>
            </div>
        )
    }
}

export default SidebarNavs;

CSS:

.sidebar-nav-menu-item{
   display:block;
}
.sidebar-nav-menu-item-body{
   display:none;
}
.sidebar-nav-menu-item.item-active .sidebar-nav-menu-item-body{
   display:block;
}
ravibagul91

您应该使用状态变量来显示可折叠项处于活动状态/非活动状态。

我对您的代码做了一些修改,以使其符合您的要求。

class App extends Component {
  constructor() {
    super();
    this.state = {
        activeCollapse: 'circulars'
    };
  }

  handleExpandCollaps = (name) => {
    if (this.state.activeCollapse === name) {
        this.setState({ activeCollapse: '' })
    } else {
        this.setState({ activeCollapse: name })
    }
  }

  moreInfoClick = (e) => {
    e.stopPropagation();
    console.log("clicked");
  }
  render() {
    return (
      <div>
        <div className="sidebar-nav">
          <div className="sidebar-nav-menu">

            <div className={`sidebar-nav-menu-item ${this.state.activeCollapse === "circulars" ? 'item-active' : ''}`} onClick={() => this.handleExpandCollaps("circulars")} data-id="circulars" >
              <div className="sidebar-nav-menu-item-head">
                <span className="sidebar-nav-menu-item-head-title">Circulars</span>
                <span className="sidebar-nav-menu-item-head-help">
                  <button type="button" className="btn-help" onClick={this.moreInfoClick}>View more info</button>
                </span>
              </div>
              <div className="sidebar-nav-menu-item-body">BODY CONTENT HERE</div>
            </div>

            <div className={`sidebar-nav-menu-item ${this.state.activeCollapse === "specifications" ? 'item-active' : ''}`} onClick={() => this.handleExpandCollaps("specifications")} data-id="specifications">
              <div className="sidebar-nav-menu-item-head">
                <span className="sidebar-nav-menu-item-head-title">Specifications</span>
                <span className="sidebar-nav-menu-item-head-help">
                  <button type="button" className="btn-help" onClick={this.moreInfoClick}>View more info</button>
                </span>
              </div>
              <div className="sidebar-nav-menu-item-body">BODY CONTENT HERE</div>
            </div>


            <div className={`sidebar-nav-menu-item ${this.state.activeCollapse === "wo" ? 'item-active' : ''}`} onClick={() => this.handleExpandCollaps("wo")} data-id="wo">
              <div className="sidebar-nav-menu-item-head">
                <span className="sidebar-nav-menu-item-head-title">Work Orders</span>
                <span className="sidebar-nav-menu-item-head-help">
                  <button type="button" className="btn-help" onClick={this.moreInfoClick}>View more info</button>
                </span>
              </div>
              <div className="sidebar-nav-menu-item-body">BODY CONTENT HERE</div>
            </div>

          </div>
        </div>
      </div>
    );
  }
}

注意:我曾经使用CSSfont-awesome图标。希望你添加了font-awesome

演示版

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在ListView项中展开列?

在列表中展开列表

展开列表中的数字

在iOS中展开列表视图滚动

如何使用 ngFor 创建可展开/可折叠的项目列表?

展开列表将在Python中返回意外错误

如何在QTreeWidget中更改默认的展开/折叠子项?

如何在Vimdiff中展开/折叠差异部分?

如何在PrimeNG中折叠/展开多个面板?

如何在Angular 2中展开/折叠递归树视图?

如何在Virtual Treeview中隐藏展开/折叠按钮?

如何在 RecyclerView 中展开和折叠卡片?

如何在vaadin树形表中隐藏展开/折叠图标?

R-如何展开列表中的每个项目以包括最早日期和今天之间的所有日期

如何在python中按顺序打开列表中的所有链接?

如何在 IntelliJ Idea 中折叠和展开可折叠文件(XML、JSON)?

如何在Java中实现列表折叠

展开列表字典以获取列表中每个值的键排列

在 React 中折叠和展开侧面板

在 React 中展开和折叠 Div

如何在jQuery可嵌套中创建自动折叠的所有列表项?

如何在jQuery Mobile中为可折叠集创建列表分隔符

展开/折叠对象列表

在列表中解开列表

如何区分可展开列表视图行中的同一视图(例如+/-切换按钮)和选择时打开相应的组?

如何使用 NativeScript 仅展开可折叠列表中的一项

如何在面板中添加2个按钮以折叠/展开ExtJs网格中的所有组?

如何在PhpStorm中折叠/展开文件中的所有注释块?

如何在具有动态单元格高度的 UICollectionView 中实现平滑的展开/折叠动画?