Reactjs react redux-连接的组件在状态更改时不重新提交

Reactjs react redux-连接的组件在状态更改时不重新提交,reactjs,redux,Reactjs,Redux,我有一个组件,我通过connect通过mapstatetops参数将一个propthis.props.mainBuffer映射到我的存储中状态树的一个片段。更新该部分状态时,只有组件未渲染。(我意识到redux的问题通常不是一成不变地改变状态,但我觉得我已经做到了) 我的根(也是唯一一个)减速器如下所示: function rootReducer(state = {}, action) { switch (action.type) { case NEW_BUFFER:

我有一个组件,我通过
connect
通过
mapstatetops
参数将一个prop
this.props.mainBuffer
映射到我的存储中状态树的一个片段。更新该部分状态时,只有组件未渲染。(我意识到redux的问题通常不是一成不变地改变状态,但我觉得我已经做到了)

我的根(也是唯一一个)减速器如下所示:

function rootReducer(state = {}, action) {

    switch (action.type) {
        case NEW_BUFFER:
            return Object.assign({}, {mainBuffer: action.samples})
        default:
            return state;
    }
}
连接组件的连接方式如下所示:

export default connect((state) => ({
    mainBuffer: state.mainBuffer
}))(WaveformVisualizer);

我已经和react redux一起工作了几个星期了,这一直有效。通常,如果我指定状态树的一个片段
state.MainBuffer
,并确保在reducer中不可变地更新它,组件将触发渲染。但是它不再发生了,我不明白为什么。

我相信我们在Reactiflux聊天频道中解决了这个问题。列出的示例代码不太准确-实际代码执行的是
Object.assign(state,{mainBuffer:action.samples})
,这会改变现有状态。解决方案是实际传递一个新的空对象作为第一个参数,比如
object.assign({},state,{mainBuffer:action.samples})
。等效的对象扩展用法是
return{…state,mainBuffer:action.samples}

您在rootReducer中尝试过console.log(action)吗?检查您的
dispatch
方法是否被调用。reducer肯定正在运行新的缓冲区案例,我已经运行了redux开发工具,并且我看到每个操作dispatchCool上的状态更改差异。那么
WaveformVisualizer
中的道具呢?如何更新
action.samples
?值或引用是否正在更改?能否发布组件的代码?在我发布此帖子时,这是我的代码所处的状态。但最终,是的,在正确的其他代码组合的情况下,添加了
{}
,成功了。但我有一个问题。如果
mapstatetops
正在查看
state.mainBuffer
是否仍应触发该组件?换句话说,不
Object.assign(state,{mainBuffer:action.samples}
更改
mainBuffer
属性,该属性是
react redux
监视的浅层比较?(假设
action.samples
每次都是一个新对象?
connect
还会查看根状态对象本身是否已更改。如果根对象与以前的引用相同,则它甚至不会重新运行该组件的
mapState
函数。类似地,
combinereducer
将返回以前的父对象。)tate对象,如果它认为没有一个切片缩减器返回新的内容。我在中讨论了这种不变性行为。我的新缓冲区缩减器一度是
return{mainBuffer:actions.samples}
我没有看到组件重新呈现。这是一个不可变的更新吗?可能是。这取决于
操作的位置。示例
来自何处。例如,如果该数组与已处于该状态的数组相同,则您重用了现有数组引用,而不是创建了一个新的数组引用。这正好说明我的理解是多么不透明JS引用语义的定义是。比方说,
action.samples
是同一个引用。我仍然认为,新实例化的对象与
mainBuffer
的值获得相同的对象,这将被redux视为一个更改。无论如何,每次操作分派时生成的数组肯定是一个不同的对象since每次生成数组时,函数都以
var newBuffer=[]