You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React JS遍历渲染手风琴组件:按日期分组展示对应时间记录

实现按日期分组的React手风琴组件解决方案

核心改造分为3步,直接适配你提到的「日期作为唯一标题、同日期所有记录放在同一内容区」需求:

  • 第一步:对原始predefined数组按日期做分组归集,把同一天的所有记录放到同一个分组下
  • 第二步:把原有的全局isActive状态改成按日期维度管理,可选择支持多手风琴同时展开、或手风琴互斥展开两种模式
  • 第三步:遍历分组后的数据渲染手风琴,每个日期对应一个手风琴项,内容区遍历渲染该日期下的全部记录

1. 数据分组代码

首先对原始数据做预处理,按日期归类:

// 分组后得到结构:{ '2024-05-20': [记录1, 记录2], '2024-05-21': [记录3] }
const groupedByDate = predefined.reduce((acc, record) => {
  const { date } = record
  if (!acc[date]) acc[date] = []
  acc[date].push(record)
  return acc
}, {})
// 转为数组方便后续遍历渲染
const dateGroups = Object.entries(groupedByDate)

2. 状态逻辑调整

方案A:支持同时展开多个日期手风琴

import { useState } from 'react'

// 状态存储所有已展开的日期集合
const [activeDates, setActiveDates] = useState(new Set())

const toggleAccordion = (date) => {
  const newActive = new Set(activeDates)
  newActive.has(date) ? newActive.delete(date) : newActive.add(date)
  setActiveDates(newActive)
}

方案B:互斥展开,一次只打开一个日期手风琴

import { useState } from 'react'

// 状态存储当前展开的日期,null为全部收起
const [activeDate, setActiveDate] = useState(null)

const toggleAccordion = (date) => {
  setActiveDate(activeDate === date ? null : date)
}

3. 渲染代码(以多开方案为例)

return (
  <>
    <div className="accordion">
      {dateGroups.map(([date, records]) => {
        const isActive = activeDates.has(date)
        return (
          <div className="accordion-item" key={date}>
            <div
              className="accordion-title"
              onClick={() => toggleAccordion(date)}
            >
              <div>{date}</div>
              <div>共{records.length}条记录</div>
              <div>{isActive ? "-" : "+"}</div>
            </div>
            {isActive && (
              <div className="accordion-content">
                {records.map((record, idx) => (
                  <div key={idx} className="record-item">
                    <span>{record.time}</span>
                    <span>painscale: {record.painscale}</span>
                    {/* 其他需要展示的记录字段按需补充 */}
                  </div>
                ))}
              </div>
            )}
          </div>
        )
      })}
    </div>
  </>
)
  • 原有代码中硬编码的时间、painscale数值都可以替换为从record对象中动态读取的字段,按需调整展示逻辑即可
  • 如果需要默认展开某个日期,初始化状态时把对应日期加入状态集合即可

内容的提问来源于stack exchange,提问作者vivek kn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:54:05