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

ReactJS中如何实现多个独立的read more/read less折叠展开功能

问题原因

你当前的代码仅声明了一个全局的readMore状态,所有分类项共用这一个状态控制展开/收起,所以只要状态变化,所有分类都会同步切换。

解决方案

可以用「存储当前展开项的索引」的方式实现独立控制,如果你需要支持多个分类同时展开,也可以改用Set/对象存储多个展开项标识。以下是单条展开的修正代码:

import React, { useState, useEffect } from 'react';
import axios from 'axios';
// 别忘了导入你项目中使用的Link组件

export function FullReport(props) {
  // 替换原来的全局readMore状态,用expandedIndex存当前展开的分类索引,null代表无展开项
  const [expandedIndex, setExpandedIndex] = useState(null);
  const [categories, setCategories] = useState([]);
   
  useEffect(() => {
      try {
        axios.get(`/getReportDetails`)
          .then((response) => {
            const serverData = response.data.data;
            setCategories(serverData.categoryDetails || []);
          });
      } catch (e) {
        console.error(e)
      }
    // 修复原代码依赖数组语法错误,留空代表只在组件挂载时执行一次请求即可
  }, []);

  return (
    <div>
      {categories.map((sitems, ssindex) => {
        // 对应当前项是否处于展开状态
        const isExpanded = expandedIndex === ssindex;
        return (
          <React.Fragment key={ssindex}>
            <p>{sitems.name}</p>
            <p>
              {!isExpanded && sitems?.description?.substring(0, 201)}
              {isExpanded && sitems?.description}
              {sitems?.description?.length > 201 && (
                <Link
                  to="#"
                  className="read-more-link"
                  onClick={(e) => {
                    e.preventDefault();
                    // 点击时判断:如果当前项已经展开则收起,否则展开当前项
                    setExpandedIndex(isExpanded ? null : ssindex);
                  }}
                >
                  {isExpanded ? "...Read Less" : "...Read More"}
                </Link>
              )}
            </p>
          </React.Fragment>
        )
      })}
   </div>
  )
}

如果你需要支持多个分类同时展开,只需要把状态改为Set类型即可:

// 初始化存储展开项的Set
const [expandedSet, setExpandedSet] = useState(new Set());

// 点击事件修改为
onClick={(e) => {
  e.preventDefault();
  const newSet = new Set(expandedSet);
  if (newSet.has(ssindex)) {
    newSet.delete(ssindex);
  } else {
    newSet.add(ssindex);
  }
  setExpandedSet(newSet);
}}

// 判断展开的逻辑改为
const isExpanded = expandedSet.has(ssindex);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:45:10