Как я могу выбрать конкретный элемент из списка массива при наведении курсора в React

#javascript #reactjs

Вопрос:

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

Компонент моей карты

 const MovieCard = ({moviesList}) => {
    const [isHover, setIsHover] = useState(false);
    const trailer =
    "https://player.vimeo.com/external/371433846.sd.mp4?s=236da2f3c0fd273d2c6d9a064f3ae35579b2bbdfamp;profile_id=139amp;oauth2_token_id=57447761";
    return (
       moviesList.map((singleMovie)=> {
           const {id , title, poster_path, overview} = singleMovie;
            return (
               <article key={id} className="card"
                onMouseEnter= {()=> setIsHover(true)}
                onMouseLeave={()=> setIsHover(false)}>
                   <img src={`${ImgPath}`   poster_path} alt={title} className="image"/>
                   {isHover amp;amp; <video src={trailer} autoPlay={true} loop></video>}
                   <div className="body-card">
                   <h1>{title}</h1>
                   <p>{`${overview.substring(0,200)}...`}</p>
                   </div>
                   
               </article>
            )
       })
          
    )
}
 

экспорт карты MovieCard по умолчанию

Ответ №1:

Вместо boolean флага вы можете хранить id и, честно говоря, эта функциональность должна быть у отдельного Card пользователя, и вы должны отображать ее Card в цикле.

Вот как вы можете это сделать в той же реализации.

 const MovieCard = ({moviesList}) => {
    const [selected, setSelected] = useState(null);
    const trailer =
    "https://player.vimeo.com/external/371433846.sd.mp4?s=236da2f3c0fd273d2c6d9a064f3ae35579b2bbdfamp;profile_id=139amp;oauth2_token_id=57447761";
    return (
       moviesList.map((singleMovie)=> {
           const {id , title, poster_path, overview} = singleMovie;
            return (
               <article key={id} className="card"
                onMouseEnter= {()=> setSelected(id)}
                onMouseLeave={()=> setSelected(null)}>
                   <img src={`${ImgPath}`   poster_path} alt={title} className="image"/>
                   {selected === id amp;amp; <video src={trailer} autoPlay={true} loop></video>}
                   <div className="body-card">
                   <h1>{title}</h1>
                   <p>{`${overview.substring(0,200)}...`}</p>
                   </div>
                   
               </article>
            )
       })
          
    )
} 

Ответ №2:

Ваш компонент movieCard на самом деле не является компонентом movieCard. Потому что вы берете список фильмов в качестве реквизита, так что это компонент movieCardList. Вместо этого вы можете создать компонент movieCard, который отображает один элемент movieCard, и внутри этого компонента вы можете отдельно показывать видео с дорожкой.

     const movieCard =({movie} ) ={
  const handleTrailerShow = () =>{} 
return <div onSomeEvent={handleTrailerShow} >
  .... 
 </div>
}
 

И в вашем основном компоненте

 const movieCardList =({movieList} ) ={
    return movieList.map(movie=>
<MovieCard movie={movie} />

 }