当前位置:首页 > React

react实现折叠面板

2026-01-27 20:16:56React

React 实现折叠面板的方法

使用 useState 管理状态

通过 React 的 useState 钩子管理折叠面板的展开/折叠状态。定义一个布尔值状态变量(如 isExpanded)和对应的更新函数(如 setIsExpanded)。

import React, { useState } from 'react';

function CollapsePanel({ title, children }) {
  const [isExpanded, setIsExpanded] = useState(false);

  return (
    <div>
      <button onClick={() => setIsExpanded(!isExpanded)}>
        {title} {isExpanded ? '▲' : '▼'}
      </button>
      {isExpanded && <div>{children}</div>}
    </div>
  );
}

添加动画效果

使用 CSS 过渡或第三方库(如 react-transition-group)实现平滑的展开/折叠动画。

import { CSSTransition } from 'react-transition-group';

function CollapsePanelWithAnimation({ title, children }) {
  const [isExpanded, setIsExpanded] = useState(false);

  return (
    <div>
      <button onClick={() => setIsExpanded(!isExpanded)}>
        {title} {isExpanded ? '▲' : '▼'}
      </button>
      <CSSTransition
        in={isExpanded}
        timeout={300}
        classNames="collapse"
        unmountOnExit
      >
        <div>{children}</div>
      </CSSTransition>
    </div>
  );
}

对应的 CSS 样式:

react实现折叠面板

.collapse-enter {
  max-height: 0;
  overflow: hidden;
}

.collapse-enter-active {
  max-height: 1000px;
  transition: max-height 300ms ease-in-out;
}

.collapse-exit {
  max-height: 1000px;
}

.collapse-exit-active {
  max-height: 0;
  transition: max-height 300ms ease-in-out;
}

使用第三方库

快速实现折叠面板可以借助现成的 React 组件库,如 antdmaterial-ui

使用 antd 的 Collapse 组件:

react实现折叠面板

import { Collapse } from 'antd';

const { Panel } = Collapse;

function AntdCollapse() {
  return (
    <Collapse>
      <Panel header="标题 1" key="1">
        内容 1
      </Panel>
      <Panel header="标题 2" key="2">
        内容 2
      </Panel>
    </Collapse>
  );
}

使用 material-ui 的 ExpansionPanel:

import {
  ExpansionPanel,
  ExpansionPanelSummary,
  ExpansionPanelDetails,
  Typography,
} from '@material-ui/core';
import ExpandMoreIcon from '@material-ui/icons/ExpandMore';

function MaterialUICollapse() {
  return (
    <ExpansionPanel>
      <ExpansionPanelSummary expandIcon={<ExpandMoreIcon />}>
        <Typography>标题</Typography>
      </ExpansionPanelSummary>
      <ExpansionPanelDetails>
        <Typography>内容</Typography>
      </ExpansionPanelDetails>
    </ExpansionPanel>
  );
}

支持多面板控制

通过状态管理实现多面板的独立控制或手风琴效果(每次只展开一个面板)。

function MultiCollapsePanels() {
  const [activePanel, setActivePanel] = useState(null);

  const panels = [
    { id: 1, title: '面板 1', content: '内容 1' },
    { id: 2, title: '面板 2', content: '内容 2' },
  ];

  return (
    <div>
      {panels.map((panel) => (
        <div key={panel.id}>
          <button onClick={() => setActivePanel(activePanel === panel.id ? null : panel.id)}>
            {panel.title} {activePanel === panel.id ? '▲' : '▼'}
          </button>
          {activePanel === panel.id && <div>{panel.content}</div>}
        </div>
      ))}
    </div>
  );
}

自定义样式与交互

通过 CSS 和事件处理实现更丰富的交互效果,如悬停反馈、图标旋转等。

function StyledCollapsePanel({ title, children }) {
  const [isExpanded, setIsExpanded] = useState(false);

  return (
    <div style={{ border: '1px solid #ddd', borderRadius: '4px', margin: '8px 0' }}>
      <button
        onClick={() => setIsExpanded(!isExpanded)}
        style={{
          width: '100%',
          padding: '12px',
          textAlign: 'left',
          background: '#f5f5f5',
          border: 'none',
          cursor: 'pointer',
          display: 'flex',
          justifyContent: 'space-between',
        }}
      >
        <span>{title}</span>
        <span style={{ transform: isExpanded ? 'rotate(180deg)' : 'none', transition: 'transform 0.2s' }}>
          ▼
        </span>
      </button>
      <div
        style={{
          padding: isExpanded ? '12px' : '0',
          maxHeight: isExpanded ? '1000px' : '0',
          overflow: 'hidden',
          transition: 'all 0.3s ease',
        }}
      >
        {children}
      </div>
    </div>
  );
}

标签: 面板react
分享给朋友:

相关文章

如何react页面

如何react页面

创建 React 页面 使用 create-react-app 快速初始化项目: npx create-react-app my-app cd my-app npm start 基础页面结构 在 s…

react如何浮动

react如何浮动

使用 CSS 实现浮动 在 React 中实现浮动效果可以通过 CSS 的 float 属性完成。在组件的样式文件或内联样式中直接设置 float: left 或 float: right。…

react如何分

react如何分

React 分页实现方法 在 React 中实现分页功能可以通过多种方式完成,以下是几种常见的方法: 使用状态管理分页数据 在组件内部维护当前页码和每页数据量的状态,通过计算切片数据实现分页。…

react如何通信

react如何通信

React 组件通信方式 React 组件间的通信方式多样,具体选择取决于组件关系和场景需求。以下是常见方法: 父子组件通信 父组件通过 props 向子组件传递数据,子组件通过回调函数通知父组件…

react如何折叠

react如何折叠

在 React 中实现折叠功能 使用 useState 管理折叠状态 通过 useState 定义一个状态变量来控制折叠面板的显示与隐藏。例如: const [isCollapsed, setIsC…

react如何引入

react如何引入

引入React的方法 React可以通过多种方式引入项目,具体取决于项目需求和开发环境。以下是常见的几种方法: 通过CDN引入 在HTML文件中直接通过CDN链接引入React和ReactDOM:…