react-redux数组中的更新项不会重新渲染

问题描述:

我有一个reducer,它在对象中返回一个包含数组的对象。我渲染数组中的项目列表,当用户单击该项目时,我想重新渲染数组(至少是项目)。我创建了一个jsbin,显示问题:react-redux数组中的更新项不会重新渲染

https://jsbin.com/fadudeyaru/1/edit?js,console,output

要重现该问题,请单击+或 - 按钮几次创造历史。然后点击其中一个历史项目。您会注意到控制台日志会注意到该事件并更新状态,但该列表不会重新呈现。这可以通过点击列表中的项目之后再次单击+/-按钮来验证。之后你会看到它正确渲染。

问题是为什么react-redux不会导致重新呈现?我需要做些什么来强制这个问题?

在此先感谢。

+0

IIRC,从reducer返回一个对象只做一个浅拷贝...也许该数组没有得到更新? – Kryten

+0

不,它正在更新中...您可以在console.log输出中以及通过选择一些历史记录项目然后单击+或 - 按钮... – Ben

redux中的状态是不可变的。这意味着reducer应该为每个突变创建一个新的状态。优选地,当存在阵列时应该进行深度克隆。以下代码为您的代码提供了一个大致的深度克隆。尝试像lodash/deepClone这样的实用程序,以获得更简单的解决方案。

const counter = (state = {count:0, history:[]}, action) => { 
    let {count} = state; 
    let history = [...state.history]; 

    switch (action.type) { 
    case 'SELECT': 
     history[action.i].selected = true; 
     break; 
    case 'INCREMENT': 
     history.push({count,selected:false}); 
     count++; 

     break; 
    case 'DECREMENT': 
     history.push({count,selected:false}); 
     count--; 
     break; 
    default: 
     break; 
    } 
    console.log("count reducer: ", {count,history}) 
    return {count,history}; 
} 
+0

这看起来不起作用:https: //jsbin.com/buruvak/edit?js,console,output – Ben

+0

@Ben我已经更新了代码。这一个工程。最好使用lodash/deepClone来处理克隆的对象。 – vijayst