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

React中FAQ列表点击问题仅展开对应答案的实现问题

嗨,这个问题我太熟了!你现在的问题根源在于整个Faqs组件只共用了一个isHidden状态,所有FAQ条目都盯着这个状态看——不管你点哪个问题,状态一更新,所有答案自然就一起显示/隐藏了。给你两种靠谱的解决办法:

方案一:拆独立子组件(推荐,组件化更清晰)

把每个FAQ条目做成独立的子组件,让每个条目自己管理自己的显示隐藏状态,互不干扰。

首先写一个单独的FaqItem组件:

class FaqItem extends Component {
  constructor(props) {
    super(props);
    this.state = { isHidden: true };
    // 绑定this上下文,避免点击时this指向错误
    this.toggleHidden = this.toggleHidden.bind(this);
  }

  toggleHidden() {
    // 用prevState确保拿到最新的状态值(因为React状态更新是异步的)
    this.setState(prevState => ({
      isHidden: !prevState.isHidden
    }));
  }

  render() {
    const { question, answer } = this.props;
    return (
      <div className="faq-item">
        <button onClick={this.toggleHidden} className="faq-question">
          {question}
        </button>
        {/* 根据当前条目的isHidden状态决定是否显示答案 */}
        {!this.state.isHidden && (
          <div className="faq-answer">
            {answer}
          </div>
        )}
      </div>
    );
  }
}

然后在原来的Faqs组件里循环渲染这个子组件:

class Faqs extends Component {
  render() {
    // 假设你的FAQ数据是通过props传进来的数组,每个元素包含question和answer
    return (
      <div className="faqs-container">
        {this.props.faqs.map((faq, index) => (
          <FaqItem 
            key={index} 
            question={faq.question} 
            answer={faq.answer} 
          />
        ))}
      </div>
    );
  }
}
方案二:用状态对象管理每个条目(不新增组件的情况下)

如果不想拆分子组件,可以在Faqs组件里用一个对象来记录每个条目的隐藏状态,通过索引或唯一ID来区分不同条目。

class Faqs extends Component {
  constructor(props) {
    super(props);
    // 初始化状态:给每个FAQ条目设置默认隐藏
    const initialHiddenStates = {};
    this.props.faqs.forEach((_, index) => {
      initialHiddenStates[index] = true;
    });
    this.state = { hiddenStates: initialHiddenStates };
    this.toggleHidden = this.toggleHidden.bind(this);
  }

  toggleHidden(index) {
    // 更新对应索引条目的隐藏状态
    this.setState(prevState => ({
      hiddenStates: {
        ...prevState.hiddenStates,
        [index]: !prevState.hiddenStates[index]
      }
    }));
  }

  render() {
    return (
      <div className="faqs-container">
        {this.props.faqs.map((faq, index) => (
          <div key={index} className="faq-item">
            <button 
              onClick={() => this.toggleHidden(index)} 
              className="faq-question"
            >
              {faq.question}
            </button>
            {/* 根据当前索引对应的hiddenStates值决定是否显示答案 */}
            {!this.state.hiddenStates[index] && (
              <div className="faq-answer">
                {faq.answer}
              </div>
            )}
          </div>
        ))}
      </div>
    );
  }
}

两种方案都能解决你的问题,第一种更符合React组件化的设计思想,后期维护和扩展也更方便;第二种适合不想新增组件的场景,用索引就能快速区分每个条目。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 02:23:43