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

使用UseReducer Hook从对象数组中删除元素的问题排查

React useReducer 删除影片失败的问题修复

核心问题分析

  • 数据结构不匹配:你的初始状态里data是一个空数组,但 reducer 中却尝试访问state.data.films——数组不存在films属性,这会直接抛出Cannot read properties of undefined (reading 'films')的错误。
  • Default 分支错误重置状态:默认分支直接返回全新的初始状态,任何未匹配到 action type 的 dispatch 操作都会清空所有已有数据,导致状态丢失。

修复方案分两种场景

场景1:data字段本身就是影片数组

如果你的data直接存储的是影片对象数组,修改 reducer 如下:

const displayReducer=(state,action)=>{
    switch(action.type)
    {
        case 'REMOVE_FILM_FROM_DATA':
            return {
                ...state, 
                data: state.data.filter(item => item._id !== action.filmid)
            }
        // 默认分支返回原状态,不要重置
        default: 
            return state
    }
}

场景2:data是包含films数组的对象

如果你的data应该是一个包含films数组的对象(初始状态定义有误),需要同时修正初始状态和 reducer:

// 修正初始状态
const [displayState, dispatchDisplayState] = useReducer(displayReducer, {
        data: { films: [] }, // 改为包含films数组的对象
        searchResultData: [], 
        display: null
    })

// 修正reducer
const displayReducer=(state,action)=>{
    switch(action.type)
    {
        case 'REMOVE_FILM_FROM_DATA':
            return {
                ...state,
                // 解构原data对象,替换films为过滤后的新数组
                data: {
                    ...state.data,
                    films: state.data.films.filter(item => item._id !== action.filmid)
                }
            }
        default: 
            return state
    }
}

内容的提问来源于stack exchange,提问作者D. Rattansingh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:24:59