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

React开发:如何在hover数组列表的指定卡片时仅播放对应影片预告片

问题根源

你的isHover状态定义在列表组件的根层级,所有遍历生成的卡片共用这一个布尔状态,只要任意卡片触发hover修改状态,全部卡片的条件渲染判断都会命中,所以所有卡片都会同时显示预告片。

解决方案1(最推荐:拆分独立卡片组件)

把单个电影卡片的逻辑抽成独立组件,每个组件自己维护自己的hover状态,互不干扰。

// 抽离独立的单张卡片组件,自己维护hover状态
const SingleMovieCard = ({singleMovie}) => {
  const [isHover, setIsHover] = useState(false);
  const {id , title, poster_path, overview} = singleMovie;
  // 后续可替换为当前电影对应的专属预告片地址,现在为示例值
  const trailer = "https://player.vimeo.com/external/371433846.sd.mp4?s=236da2f3c0fd273d2c6d9a064f3ae35579b2bbdf&profile_id=139&oauth2_token_id=57447761";
  return (
    <article className="card"
      onMouseEnter={()=> setIsHover(true)}
      onMouseLeave={()=> setIsHover(false)}>
      <img src={`${ImgPath}` + poster_path} alt={title} className="image"/>
      {/* 视频加muted属性适配浏览器自动播放规则,否则很多浏览器会拦截autoPlay */}
      {isHover && <video src={trailer} autoPlay loop muted></video>}
      <div className="body-card">
        <h1>{title}</h1>
        <p>{`${overview.substring(0,200)}...`}</p>
      </div>
    </article>
  )
}

// 原列表组件简化为遍历渲染子组件即可
const MovieCard = ({moviesList}) => {
  return (
    moviesList.map((singleMovie)=> <SingleMovieCard key={singleMovie.id} singleMovie={singleMovie} />)
  )
}
export default MovieCard
解决方案2(不拆分组件,用ID匹配)

如果不想拆分组件,可以把状态从布尔值改为当前hover的电影ID,只有当前遍历的卡片ID和存储的hover ID一致时才显示预告片。

const MovieCard = ({moviesList}) => {
  // 初始为null,存储当前hover的电影ID
  const [hoveredId, setHoveredId] = useState(null);
  const trailer = "https://player.vimeo.com/external/371433846.sd.mp4?s=236da2f3c0fd273d2c6d9a064f3ae35579b2bbdf&profile_id=139&oauth2_token_id=57447761";
  return (
    moviesList.map((singleMovie)=> {
      const {id , title, poster_path, overview} = singleMovie;
      return (
        <article key={id} className="card"
          onMouseEnter={()=> setHoveredId(id)}
          onMouseLeave={()=> setHoveredId(null)}>
          <img src={`${ImgPath}` + poster_path} alt={title} className="image"/>
          {/* 只有当前卡片ID等于hover的ID时才显示视频 */}
          {hoveredId === id && <video src={trailer} autoPlay loop muted></video>}
          <div className="body-card">
            <h1>{title}</h1>
            <p>{`${overview.substring(0,200)}...`}</p>
          </div>
        </article>
      )
    })
  )
}
export default MovieCard
额外说明

当前代码里预告片地址是写死的固定值,后续可以根据接口返回的每个电影对应预告片字段替换,就能实现不同卡片播放对应专属预告片的效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:39:03