Reactjs 在React.js onClick中切换一个元素

Reactjs 在React.js onClick中切换一个元素,reactjs,toggle,Reactjs,Toggle,我有一个info按钮,它应该在单击事件时打开特定的描述元素——info是从Firebase获得的。但是,myOnclick事件会触发所有兄弟元素,我只需要切换/取消切换一个特定的元素。我错过了什么,做错了什么 代码如下: import React, { Component } from "react"; import firebase from "../../firebase"; //从数据库获取并在第页上呈现的数据 export default cla

我有一个info按钮,它应该在单击事件时打开特定的描述元素——info是从Firebase获得的。但是,myOnclick事件会触发所有兄弟元素,我只需要切换/取消切换一个特定的元素。我错过了什么,做错了什么

代码如下:

import React, { Component } from "react";
import firebase from "../../firebase";
//从数据库获取并在第页上呈现的数据

export default class Tour extends Component {
  constructor() {
    super();
    this.state = {
      tours: [],
      showInfo: false,
    };
  }
//切换信息的按钮

   handleInfo = () => {
        this.setState({
          showInfo: !this.state.showInfo,
        });
      };
//组件没有安装

 componentDidMount() {
    const dbRef = firebase.database().ref();

    dbRef.on("value", (snapshot) => {
      // checking changes in db
      const data = snapshot.val();
      const newToursAarray = [];

      for (let inventoryName in data) {
        const toursObject = {
          id: inventoryName,
          tours: data[inventoryName],
          name: data[inventoryName].name,
          seats: data[inventoryName].seats,
          date: data[inventoryName].date,
          duration: data[inventoryName].duration,
          imgUrl:"https://source.unsplash.com/350x350/?" + data[inventoryName].name,
          // temporary tour info placeholder and will be removed and connetcted to real DB
          info: "Lorem ipsum dolora saepe fugiat. " +
            data[inventoryName].name,
        };
        newToursAarray.push(toursObject);
      }

      this.setState({
        tours: newToursAarray,
      });
    });
  }

  render() {
    return (
      <div className="tourlist">
        {this.state.tours.map((toursObject) => {
          return (
            <section className="tourItem">
              <header>
                <h3> {toursObject.name} </h3>
                <h5>
                  info
                  {/* button that toggles info */}
                  <span onClick={this.handleInfo}>
                    <i className="fas fa-caret-square-down"></i>
                  </span>
                </h5>
              </header>
              <ul className="inventoryItem" key={toursObject.id}>
                <li> {toursObject.date} |</li>
                <li>{toursObject.duration} hrs |</li>
                <li> {toursObject.seats} seats </li>
              </ul>
              <div className="img-container">
                {this.state.showInfo && (
                  // text that toggles when clicking on info button
                  <p className="tour-info">{toursObject.info}</p>
                )}
                <img src={toursObject.imgUrl} alt="image of the tour" />
             
              </div>
            </section>
          );
        })}
      </div>
    );
  }
}
componentDidMount(){
const dbRef=firebase.database().ref();
dbRef.on(“值”,(快照)=>{
//检查数据库中的更改
const data=snapshot.val();
常数newToursAarray=[];
for(让inventoryName输入数据){
常数toursObject={
id:inventoryName,
巡视:数据[inventoryName],
名称:数据[inventoryName]。名称,
座位:数据[inventoryName]。座位,
日期:数据[inventoryName]。日期,
持续时间:数据[inventoryName]。持续时间,
imgUrl:“https://source.unsplash.com/350x350/?“+数据[inventoryName]。名称,
//临时巡更信息占位符,将被删除并连接到real DB
信息:“Lorem ipsum dolora saepe fugiat。”+
数据[inventoryName]。名称,
};
新图尔萨雷推(toursObject);
}
这是我的国家({
旅游:纽图萨雷,
});
});
}
render(){
返回(
{this.state.tours.map((toursObject)=>{
返回(
{toursObject.name}
信息
{/*切换信息的按钮*/}
  • {toursObject.date}|
  • {toursObject.duration}小时|
  • {toursObject.座位}座位
{this.state.showInfo&&( //单击“信息”按钮时切换的文本

{toursObject.info}

)} ); })} ); } }
所以这里的问题是扩展选项都引用同一个状态。你的
州。showInfo
在你的
旅游地图之外。所以,当你在旅行中绘制地图时,你会说“如果‘showInfo’,那么就显示这一部分”,而‘showInfo’对所有东西都是一样的

我建议您存储扩展对象的
id
,然后您可以进行检查

大概是这样的:

handleInfo = (id) => {
  this.setState({
    infoToShow: id,
  });
};
<span onClick={() => this.handleInfo(tourObject.id)}>
  <i className="fas fa-caret-square-down"></i>
</span>
然后在您的
onClick
中,它看起来更像这样:

handleInfo = (id) => {
  this.setState({
    infoToShow: id,
  });
};
<span onClick={() => this.handleInfo(tourObject.id)}>
  <i className="fas fa-caret-square-down"></i>
</span>
this.handleInfo(tourObject.id)}>
显示或隐藏的逻辑可以是:

{this.state.infoToShow === tourObject.id && (
  // text that toggles when clicking on info button
  <p className="tour-info">{toursObject.info}</p>
)}
{this.state.infoToShow===tourObject.id&&(
//单击“信息”按钮时切换的文本

{toursObject.info}

)}
通过这种方式,您可以将id存储在一个可供所有循环旅行访问的位置,但它们不会相互冲突


因此,与其检查showInfo
是否为真,不如检查您要显示的
id
是否与巡演id匹配。

啊,我明白了。非常感谢@谢尔盖·丘尔金:没问题,如果这对你有帮助的话,如果你能接受并投票支持这个答案,我将不胜感激。谢谢