Как отобразить кнопку в родительском компоненте на основе дочернего действия в react js?

#javascript #reactjs

Вопрос:

У меня есть список видеокарт, когда пользователь нажимает на них, они становятся выбранными, и идентификатор каждой видеокарты переносится в массив с именем «selectedList».

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

МОЯ ГЛАВНАЯ СТРАНИЦА:

 export default function Index(data) {  const info = data.data.body.result;  const selectedList = [];    return (  lt;gt;  lt;main className={parentstyle.main_container}gt;  lt;NavBar /gt;  lt;div className={style.searchbar_container}gt;  lt;SearchBar /gt;  lt;/divgt;  lt;div className={style.card_container}gt;  {info.map((movie, i) =gt; {  return (  lt;MovieCard  movieName={movie.name}  key={i}  movieId={movie._id}  selected={selectedList}  isSelected={false}  /gt;  );  })}  lt;/divgt;  lt;/maingt;  lt;button className={style.done}gt;Let's go!lt;/buttongt;  lt;/gt;  );  }    **MOVIE CARD COMPONENT:**  export default function Index({ selected, movieName, movieId, visibility }) {  const [isActive, setActive] = useState(false);   const toggleClass = () =gt; {  setActive(!isActive);  };   const pushToSelected = (e) =gt; {  if (selected.includes(e.target.id)) {  selected.splice(selected.indexOf(e.target.id), 1);  console.log(selected);  } else {  selected.push(e.target.id);  console.log(selected);  }  toggleClass();  };   return (  lt;divgt;  lt;img  className={isActive ? style.movie_selected : style.movie}  src={`images/movies/${movieName}.jpg`}  alt={movieName}  id={movieId}  onClick={pushToSelected}  /gt;  lt;h3 className={style.title}gt;{movieName}lt;/h3gt;  lt;/divgt;  ); }  

Ответ №1:

Для этого вы можете использовать условный рендеринг:

 {selectedList.length gt; 0 amp;amp; lt;button className={style.done}gt;Let's go!lt;/buttongt;}  

Кроме того, вы должны изменить свое selectedList состояние и управлять обновлением с помощью setSelectedList функции:

 import { useState } from 'react';  export default function Index(data) {  const info = data.data.body.result;  const [selectedList, setSelectedList] = useState([]);  

Добавьте метод в свойство MovieCard как свойство:

 lt;MovieCard  movieName={movie.name}  key={i}  movieId={movie._id}  selected={selectedList}  setSelected={setSelectedList}  isSelected={false} /gt;;  

И обновите список в pushToSelected методе:

 export default function MovieCard({   selected,   setSelected,   movieName,   movieId,   visibility  }) {  const pushToSelected = (e) =gt; {  if (selected.includes(e.target.id)) {  selected.splice(selected.indexOf(e.target.id), 1);  console.log(selected);  } else {  selected.push(e.target.id);  console.log(selected);  }  setSelected([...selected]);  toggleClass();  };  

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

1. Спасибо, приятель, но я получил эту ошибку «Ошибка типа: setSelectedList не является функцией »

2. Правильно ли вы объявили состояние в Index компоненте?

3. Это сработало! Тэнлс!