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

ReactJS中如何实现内容的独立切换/显示?

解决方案:让每个卡片独立控制展开/收起状态

你的问题核心是所有卡片共享了同一个show状态,所以点击任意卡片都会触发全部卡片的显示/隐藏。下面提供两种更合理的实现方式:

方式1:提取独立的Card组件(推荐)

把每个卡片封装成独立组件,让每个组件自己管理展开状态,这是React组件封装的最佳实践,代码更易维护和复用。

import { useState } from 'react';
import styles from './App.module.css';

// 独立的Card组件
function Card({ title, content }) {
  const [show, setShow] = useState(false);

  const handleToggle = () => {
    setShow(!show);
  };

  return (
    <div className={styles.card_container} onClick={handleToggle}>
      <h3>{title}</h3>
      {show && (
        <div>
          <p>{content}</p>
        </div>
      )}
    </div>
  );
}

function App() {
  const [loaded, setLoaded] = useState(true);

  return (
    <div className={styles.App}>
      {loaded && (
        <div className={styles.cards_container}>
          <Card title="Title" content="Some text" />
          <Card title="Title" content="Some text" />
          <Card title="Title" content="Some text" />
        </div>
      )}
    </div>
  );
}

export default App;

方式2:在父组件中用状态对象跟踪每个卡片的状态

如果需要在父组件统一管理所有卡片的展开状态,可以用一个对象来记录每个卡片的id对应的展开状态:

import { useState } from 'react';
import styles from './App.module.css';

function App() {
  const [loaded, setLoaded] = useState(true);
  // 用对象存储每个卡片的展开状态,key是卡片id,value是布尔值
  const [showStates, setShowStates] = useState({
    card1: false,
    card2: false,
    card3: false
  });

  const handleToggle = (cardId) => {
    setShowStates(prev => ({
      ...prev,
      [cardId]: !prev[cardId]
    }));
  };

  return (
    <div className={styles.App}>
      {loaded && (
        <div className={styles.cards_container}>
          <div className={styles.card_container} onClick={() => handleToggle('card1')}>
            <h3>Title</h3>
            {showStates.card1 && (
              <div>
                <p>Some text</p>
              </div>
            )}
          </div>
          <div className={styles.card_container} onClick={() => handleToggle('card2')}>
            <h3>Title</h3>
            {showStates.card2 && (
              <div>
                <p>Some text</p>
              </div>
            )}
          </div>
          <div className={styles.card_container} onClick={() => handleToggle('card3')}>
            <h3>Title</h3>
            {showStates.card3 && (
              <div>
                <p>Some text</p>
              </div>
            )}
          </div>
        </div>
      )}
    </div>
  );
}

export default App;

两种方式的适用场景

  • 方式1适合卡片逻辑独立、不需要父组件干预的场景,代码更简洁,组件复用性强。
  • 方式2适合需要在父组件对所有卡片状态做统一操作的场景(比如一键展开/收起所有卡片)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 01:58:17