当前位置: 首页 > 面试题库 >

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

羿易安
2023-03-14
问题内容

我尝试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;
}

问题答案:

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

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

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

演示版



 类似资料:
  • 问题内容: 我已经成功创建了一个函数来切换我的各个行以使用以下方式打开和关闭: 和 有关更多代码,请参见plunkr。请注意,“菜单”中的展开/折叠按钮。 但是,我现在想不出一种方法来打开和关闭所有行。我希望能够以某种方式在行上运行for循环,然后在需要时调用toggle,但是我这样做的尝试失败了。在下面看到它们: 关于如何正确切换所有行的任何想法? 问题答案: 将该指令与和指令结合使用,我们可以

  • 了解如何在 Dreamweaver 中折叠和展开代码以查看文档的各个部分而无需滚动。 您可以折叠和展开代码片段,以便无需滚动即可查看文档的不同部分。 例如,若要查看 head 标签中所有应用于页面下方较远处的一个 div 标签的 CSS 规则,请折叠 head 标签和 div 标签之间的所有代码,以便同时看到这两部分代码。 您可以选择要折叠的代码部分进行折叠。还可以在 HTML、PHP、XML 以

  • 问题内容: 我有一个带JSplitPane的JFrame,它是OneTouchExpandable。我想记住JSplitPane在JFrame上的最后一个Divider位置,如果重新打开JFrame,则恢复该位置。 它工作正常,但是如果用户通过oneTouchExpandable UI- Widget展开一侧,则我仅将’int’-Position放置在dispose上,然后再次将’int’-Pos

  • 我有一个带有多个视图保持器的RecyclerView适配器。每个ViewHolder都有一个标题TextView和一个嵌套的RecyclerView,工作正常。但我想实现一个扩展/折叠函数,这样嵌套的RecyclerView就可以隐藏,直到单击标题为止。我使用此方法RecyclerView展开/折叠项目。它可以工作,但当我单击标题以展开嵌套的RecyleView时,recyclerview不会填充

  • 展开或折叠代码 操作步骤: 菜单栏:Code —> Folding —> Expand 快捷键: Mac: command + “+” Windows\/Linux: Ctrl + "+" 展开或折叠代码 操作步骤: 菜单栏:Code —> Folding —> Collapse 快捷键: Mac: command + “-” Windows\/Linux: Ctrl + "-" 展开或折叠当前代

  • 本文向大家介绍Java在Excel中创建多级分组、折叠或展开分组的实现,包括了Java在Excel中创建多级分组、折叠或展开分组的实现的使用技巧和注意事项,需要的朋友参考一下 本文介绍通过Java程序在Excel创建分组的方法,可对行或列分组进行分组并设置明细数据是否展开或折叠。设置数据分组并展开或折叠时,可通过以下方法: 方法一: 通过方法sheet.groupByRows(int firstR