当前位置:首页 > 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 样式:

.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 组件:

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

学习 React 的步骤 理解基础概念 React 是一个用于构建用户界面的 JavaScript 库。学习 React 之前,建议掌握 JavaScript 的基础知识,包括 ES6+ 语法(如箭头…

vue实现收起展开面板

vue实现收起展开面板

实现收起展开面板的方法 在Vue中实现收起展开面板的功能可以通过多种方式完成,以下是几种常见的方法: 使用v-show或v-if控制显示隐藏 通过Vue的指令v-show或v-if可以轻松实现面板的…

如何生成react代码

如何生成react代码

使用 Create React App 生成项目 安装 Node.js 后,通过命令行工具运行以下命令创建新项目: npx create-react-app my-app cd my-app np…

如何优化react

如何优化react

优化 React 性能的方法 使用 React.memo 或 PureComponent 对于函数组件,使用 React.memo 进行记忆化,避免不必要的重新渲染。类组件可以使用 PureCompo…

react如何收录

react如何收录

React 收录方法 React 的收录主要涉及搜索引擎优化(SEO)和预渲染技术。由于 React 是单页应用(SPA),默认情况下内容由 JavaScript 动态生成,可能导致搜索引擎爬虫难以收…

react如何调试

react如何调试

调试 React 应用的方法 使用 React Developer Tools React Developer Tools 是 Chrome 和 Firefox 的浏览器扩展,可以检查组件树、状态和…