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

React函数组件如何使用useState修改状态,解决点赞后movies.map报错问题

问题原因及修复方案

报错根因

你遇到的movies.map is not a function错误,本质是数组类型的movies状态被误修改为对象类型:原来你用useState初始化的movies是数组,但是在handleLike方法中调用setMovies时传入了{ movies },将状态覆盖为了{ movies: 数组 }的对象结构,对象本身不存在map方法,所以渲染时直接抛出异常。

此外handleLike中还存在另外3个编码错误,一并修正:

  • 局部变量命名和状态变量movies冲突,受const暂时性死区影响,访问会出现异常
  • 拷贝电影对象时错误写为movie[index],传入的movie是单个电影对象,不是数组,不存在index索引
  • 用indexOf匹配数组元素存在引用不一致时匹配失败的隐患,推荐用唯一id匹配更稳妥

修正后的handleLike代码

把原来的handleLike方法替换为下方代码即可:

const handleLike = (targetMovie) => {
  // 拷贝原有数组生成新数组,避免直接修改原状态
  const newMovies = movies.map(movie => {
    // 匹配到目标电影时,修改liked属性
    if (movie._id === targetMovie._id) {
      return { ...movie, liked: !movie.liked }
    }
    // 非目标电影直接返回
    return movie
  })
  // 直接传入新数组,不要包裹成对象
  setMovies(newMovies)
};

可选兼容写法

如果要保持你原来通过索引修改的写法,也可以改成下面的版本,效果完全一致:

const handleLike = (targetMovie) => {
  const newMovies = [...movies]
  const index = newMovies.findIndex(m => m._id === targetMovie._id)
  newMovies[index] = { ...newMovies[index], liked: !newMovies[index].liked }
  setMovies(newMovies)
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:18:03