React Redux如何从state数组中删除对象 运行无返回如何解决?
问题原因
- 数组结构错误:
DELETE_MOVEMENT分支中filter方法本身已经返回新数组,外层额外包裹的[]会把过滤结果变成二维数组,页面按原有一维数组逻辑渲染时无法正常读取对象属性,导致空白。 - 删除逻辑反向:
filter会保留回调返回真值的元素,现有逻辑会保留命中删除条件的对象,反而把需要保留的对象过滤掉。 - 属性名不匹配:示例state中对象的唯一标识属性是
name,但reducer中判断条件全部使用movementName,永远无法匹配到目标对象,更新、删除逻辑都会失效。 - 错误使用字符串代替布尔值:现有代码返回
"true"/"false"字符串,虽然非空字符串在JS中会被判定为真值,但属于不符合预期的错误写法。
修复方案
直接替换为修正后的reducer代码即可:
const initialState = []; const movementReducer = (state = initialState, action) => { switch (action.type) { case ADD_MOVEMENT: return [ ...state, action.payload ]; case UPDATE_MOVEMENT: // 统一使用name属性匹配,map本身返回新数组无需额外展开 return state.map(item => item.name === action.payload.name ? action.payload : item); case DELETE_MOVEMENT: // 去掉外层多余数组括号,保留不匹配删除条件的对象,直接返回布尔值 return state.filter(item => item.name !== action.payload.name); default: return state; } }; export default movementReducer;
注意:触发
DELETE_MOVEMENT和UPDATE_MOVEMENTaction时,payload中需要携带对应动作的name属性用于匹配。
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

