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

React随机电影应用如何通过onClick按钮实现年代、类型筛选联动展示对应影片

实现步骤&修正代码

首先你需要先保留一份全量的原始电影数据,不能直接修改电影列表状态,否则多次筛选后会丢失原始数据。所有逻辑调整如下:

import { useState, useEffect } from 'react'
// 假设你的原始全量电影列表从接口获取或者提前定义,示例:
const ORIGIN_MOVIES = [/* 你的所有电影原始数据 */]

function MovieRecommend() {
  // 先声明所有状态
  const [movies, setMovies] = useState(ORIGIN_MOVIES)
  const [genre, setGenre] = useState(null)
  const [decade, setDecade] = useState(null)

  // 按要求将useEffect放在业务逻辑顶部,依赖添加genre和decade,两个筛选值变化时自动重新筛选
  useEffect(() => {
    const filteredList = ORIGIN_MOVIES.filter(movie => {
      // 类型匹配判断:genre_ids通常为数组,判断是否包含选中的类型id
      const isGenreMatch = genre ? movie.genre_ids.includes(Number(genre)) : true
      // 年代匹配判断:先提取发布完整年份,再判断是否落在选中年代的10年区间内
      const releaseYear = new Date(movie.release_date).getFullYear()
      const isDecadeMatch = decade ? releaseYear >= Number(decade) && releaseYear < Number(decade) + 10 : true
      // 两个条件同时满足才返回对应影片
      return isGenreMatch && isDecadeMatch
    })
    setMovies(filteredList)
  }, [genre, decade])

  return (
    <div>
      <div className="Genre">
        <DropdownButton title="Genres">
          <Dropdown.Item id="27" onClick={() => setGenre(27)}>恐怖</Dropdown.Item>
          <Dropdown.Item id="28" onClick={() => setGenre(28)}>动作</Dropdown.Item>
          <Dropdown.Item id="35" onClick={() => setGenre(35)}>喜剧</Dropdown.Item>
          <Dropdown.Item id="10751" onClick={() => setGenre(10751)}>家庭</Dropdown.Item>
          <Dropdown.Item id="10749" onClick={() => setGenre(10749)}>爱情</Dropdown.Item>
          <Dropdown.Item id="18" onClick={() => setGenre(18)}>剧情</Dropdown.Item>
          {/* 可选增加重置选项:<Dropdown.Item onClick={() => setGenre(null)}>全部类型</Dropdown.Item> */}
        </DropdownButton>
      </div>

      <div className="decade">
        <Dropdown>
          <div className="App container">
            <Dropdown.Toggle variant="success">
              选择年代
            </Dropdown.Toggle>

            <Dropdown.Menu>
                <Dropdown.Item onClick={() => setDecade(1980)}>1980年代</Dropdown.Item>
                <Dropdown.Item onClick={() => setDecade(1990)}>1990年代</Dropdown.Item>
                <Dropdown.Item onClick={() => setDecade(2000)}>2000年代</Dropdown.Item>
                <Dropdown.Item onClick={() => setDecade(2010)}>2010年代</Dropdown.Item>
                <Dropdown.Item onClick={() => setDecade(2020)}>2020年代</Dropdown.Item>
                {/* 可选增加重置选项:<Dropdown.Item onClick={() => setDecade(null)}>全部年代</Dropdown.Item> */}
            </Dropdown.Menu>
          </div>
        </Dropdown>
      </div>

      {/* 下方直接渲染筛选后的movies列表即可 */}
      <div className="movie-list">
        {movies.map(movie => <div key={movie.id}>{movie.title}</div>)}
      </div>
    </div>
  )
}

核心修正点

  • 新增全量原始电影常量ORIGIN_MOVIES,每次筛选都从全量数据中过滤,不会丢失原始数据
  • 修正useEffect依赖数组,添加genre和decade,两个筛选条件变化时会自动触发重新筛选
  • 修正类型匹配逻辑:适配绝大多数电影数据的genre_ids数组结构,用includes判断类型匹配
  • 修正年代匹配逻辑:从完整上映日期中提取年份,判断是否落在选中年代的10年区间内
  • 修复所有下拉选项的点击事件,正确调用状态更新方法传入对应值
  • 两个筛选条件默认设为null,未选中时默认匹配所有数据,天然支持联动筛选效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:00:00