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

如何避免单个组件状态变更时触发整个列表重渲染?

React 卡片列表组件实现方案

嘿,我看你已经有了Card组件的初步代码,我帮你把它整理完善,还补充了对应的卡片列表父组件,这样就能实现你想要的“卡片列表”效果了:

import React, { Component } from 'react';

// 单张卡片组件
class Card extends Component {
  constructor(props) {
    super(props);
    this.state = { 
      activeTab: 1 
    };
  }

  setActiveTab = (activeTab) => {
    this.setState({ activeTab });
  }

  render() {
    const { activeTab } = this.state;
    // 接收父组件传递的单条卡片数据
    const { cardData } = this.props;

    return (
      <div className="card">
        <ul className="nav nav-tabs card-header-tabs">
          <li className="nav-item" key={1} onClick={() => this.setActiveTab(1)}>
            <button className={`nav-link ${activeTab === 1 ? 'active' : ''}`}>
              标签1
            </button>
          </li>
          <li className="nav-item" key={2} onClick={() => this.setActiveTab(2)}>
            <button className={`nav-link ${activeTab === 2 ? 'active' : ''}`}>
              标签2
            </button>
          </li>
        </ul>
        <div className="card-body">
          {/* 根据激活标签切换显示内容 */}
          {activeTab === 1 && <div className="card-text">{cardData.contentTab1}</div>}
          {activeTab === 2 && <div className="card-text">{cardData.contentTab2}</div>}
        </div>
      </div>
    );
  }
}

// 卡片列表父组件,负责数据获取与批量渲染卡片
class CardList extends Component {
  constructor(props) {
    super(props);
    this.state = { 
      cardListData: [] 
    };
  }

  componentDidMount() {
    // 模拟接口请求获取数据,实际项目替换为真实API调用
    const mockCardData = [
      { id: 1, contentTab1: '卡片1标签1内容', contentTab2: '卡片1标签2内容' },
      { id: 2, contentTab1: '卡片2标签1内容', contentTab2: '卡片2标签2内容' },
      { id: 3, contentTab1: '卡片3标签1内容', contentTab2: '卡片3标签2内容' }
    ];
    this.setState({ cardListData: mockCardData });
  }

  render() {
    const { cardListData } = this.state;
    return (
      <div className="row gap-4">
        {/* 遍历数据数组,渲染多个Card组件 */}
        {cardListData.map(cardItem => (
          <div className="col-md-4" key={cardItem.id}>
            <Card cardData={cardItem} />
          </div>
        ))}
      </div>
    );
  }
}

export default CardList;

关键细节说明:

  • Card组件:内部维护activeTab状态实现标签切换,通过props接收父组件传递的单条卡片数据,保证组件的复用性。
  • CardList组件:在生命周期componentDidMount中完成数据获取(示例用模拟数据),通过map方法将数据批量转换为Card组件,实现列表渲染。
  • 样式部分用了常见的Bootstrap类名,如果你没引入Bootstrap,直接替换成自定义CSS类即可适配你的项目样式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:54:07