как обработать событие onClick с несколькими компонентами с одинаковым именем класса в React?

#reactjs

Вопрос:

Я новичок в react.js и я хочу применить функцию переключения в поле «место», используя состояние «Открыто», и мое намерение состоит в том, что она работает только тогда, когда я нажимаю один раздел «Место», поэтому я добавил событие onClick в поле «место». но все элементы переключаются одновременно.

Я думаю, это потому, что у всех них одно и то же название класса. как я могу это исправить?

 import React, { useState, useEffect } from "react"; import { useQuery } from "@apollo/client"; import { FETCH_CITIES_QUERY } from "../../server/Data/RentQueries"; import PlaceResult from "../Rent/PlaceResult";  const CityResult = (props) =gt; {  const [placeId, setPlaceId] = useState();  const [isOpen, setIsOpen] = useState(false);    const { loading, error, data } = useQuery(FETCH_CITIES_QUERY, {  variables: { cityName: cityName },  });   const showPlaceInfo = (placeId, e) =gt; {  e.preventDefault();  setPlaceId(placeId);  setIsOpen((isOpen) =gt; !isOpen);  };   return (  lt;divgt;  {data amp;amp;  data.cities.map((city) =gt; {  return (  lt;div className="city-box"gt;  {city.places.map((place) =gt; {  return (  // this is place-box div and I added onClick event here  lt;div  className="place-box"  key={place.id}  onClick={(e) =gt; {  e.stopPropagation();  showPlaceInfo(place.id, e);  }}  gt;  lt;li className="place-name"gt;{place.name}lt;/ligt;  {isOpen amp;amp; (  lt;PlaceResult className="place-indiv" placeId={placeId} /gt;  )}  {!isOpen amp;amp; (  lt;div className="place-info-box"gt;  lt;ligt;{place.address}lt;/ligt;  {conditionCheck(city.condition)}  lt;ligt;{place.phone}lt;/ligt;  lt;/divgt;  )}  lt;/divgt;  );  })}  lt;/divgt;  );  })}  lt;/divgt;  ); };  export default CityResult;  

введите описание изображения здесь

Вот на что это похоже

Ответ №1:

Ваша переменная isOpen используется для всех городов. Если вы переключитесь isOpen на true все места-ящики откроются. Вы должны сохранить id текущий открытый город внутри переменной и сравнить его с ней, чтобы проверить, следует ли открывать текущий город в цикле for.

 import React, { useState, useEffect } from "react"; import { useQuery } from "@apollo/client"; import { FETCH_CITIES_QUERY } from "../../server/Data/RentQueries"; import PlaceResult from "../Rent/PlaceResult";  const CityResult = (props) =gt; {  const [placeId, setPlaceId] = useState();  const [openedPlaceId, setOpenedPlaceId] = useState(undefined);    const { loading, error, data } = useQuery(FETCH_CITIES_QUERY, {  variables: { cityName: cityName },  });   const showPlaceInfo = (placeId, e) =gt; {  e.preventDefault();  setPlaceId(placeId);  setOpenedPlaceId(placeId);  };   return (  lt;divgt;  {data amp;amp;  data.cities.map((city) =gt; {  return (  lt;div className="city-box"gt;  {city.places.map((place) =gt; {  return (  // this is place-box div and I added onClick event here  lt;div  className="place-box"  key={place.id}  onClick={(e) =gt; {  e.stopPropagation();  showPlaceInfo(place.id, e);  }}  gt;  lt;li className="place-name"gt;{place.name}lt;/ligt;  {openedPlaceId === place.id amp;amp; (  lt;PlaceResult className="place-indiv" placeId={placeId} /gt;  )}  {!(openedPlaceId === place.id) amp;amp; (  lt;div className="place-info-box"gt;  lt;ligt;{place.address}lt;/ligt;  {conditionCheck(city.condition)}  lt;ligt;{place.phone}lt;/ligt;  lt;/divgt;  )}  lt;/divgt;  );  })}  lt;/divgt;  );  })}  lt;/divgt;  ); };  export default CityResult;  

Таким образом, будет открыто только выбранное место.

Комментарии:

1. Я понятия не имел, как с этим справиться. Большое спасибо!