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

React实现仅展开点击行数据:解决全量展开问题

解决表格行独立展开/收起文本的问题

你当前的问题是用了一个全局的fullText状态变量,所有表格行共享这个状态,所以点击任何一行都会触发所有行的展开/收起。要实现仅操作点击的行,有两种可行的解决思路:

思路一:将状态下沉到行级子组件

把每行的文本切换逻辑拆成独立的子组件,让每个子组件自己维护展开状态,这样各行的状态互不干扰。

示例代码:

class TextToggleRow extends React.Component {
  state = { fullText: false };

  toggleText = () => {
    this.setState(prev => ({ fullText: !prev.fullText }));
  };

  render() {
    const { data } = this.props;
    return (
      <>
        <div 
          onClick={this.toggleText} 
          className="text-primary cursor-pointer font-size-14 mt-2 px-2"
        >
          {this.state.fullText ? 'Short Text' : 'Full Text'}
        </div>
        {this.state.fullText && <span>{data?.caption}</span>}
      </>
    );
  }
}

// 父组件中渲染表格行时使用这个子组件
{tableData.map(item => (
  <tr key={item.id}>
    <td>
      <TextToggleRow data={item} />
    </td>
  </tr>
))}

思路二:在父组件中维护展开行的ID集合

如果需要在父组件统一管理所有行的展开状态(比如批量操作需求),可以用一个对象存储各行列的展开状态,键为行ID,值为布尔值。

示例代码:

// 父组件初始化状态
this.state = { expandedRows: {} };

// 切换指定行的展开状态
toggleRow = rowId => {
  this.setState(prev => ({
    expandedRows: {
      ...prev.expandedRows,
      [rowId]: !prev.expandedRows[rowId]
    }
  }));
};

// 渲染单行时的逻辑
{
  const rowId = props.data?.id;
  const isExpanded = this.state.expandedRows[rowId] || false;
  return (
    <>
      <div 
        onClick={() => this.toggleRow(rowId)} 
        className="text-primary cursor-pointer font-size-14 mt-2 px-2"
        key={rowId}
      >
        {isExpanded ? 'Short Text' : 'Full Text'}
      </div>
      {isExpanded && <span>{props.data?.caption}</span>}
    </>
  )
}

两种思路各有适用场景:子组件维护状态更解耦,适合简单的行内交互;父组件维护状态则方便全局控制,适合有批量操作需求的场景。

内容的提问来源于stack exchange,提问作者Mert Kahramantürk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:10:14