【问题标题】:react-redux - connected component not rerendering on state changereact-redux - 连接的组件不会在状态更改时重新渲染
【发布时间】:2017-09-27 04:04:50
【问题描述】:

我有一个组件,我通过 connect 传递了一个带有 mapStateToProps 参数的组件,以将一个道具 this.props.mainBuffer 从我的商店映射到我的状态树的一部分。当我更新状态的那部分时,只有组件没有呈现。 (我意识到 redux 的问题通常不是一成不变地改变状态,但我觉得我已经做到了)。

我的根(也是唯一的)reducer 看起来像:

function rootReducer(state = {}, action) {

    switch (action.type) {
        case NEW_BUFFER:
            return Object.assign({}, {mainBuffer: action.samples})
        default:
            return state;
    }
}

而connect组件是这样连接的:

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

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

【问题讨论】:

  • 你在 rootReducer 中尝试过 console.log(action) 吗?检查您的 dispatch 方法是否被调用。
  • reducer 肯定在运行 NEW_BUFFER 案例,我已经运行了 redux 开发工具,我看到每个动作调度的状态变化差异
  • 酷。 WaveformVisualizer 里的道具呢?
  • 如何更新action.samples ?值或参考值是否在变化?
  • 你能发布你的组件代码吗?

标签: reactjs redux


【解决方案1】:

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

【讨论】:

  • 在我发表这篇文章时,这是我的代码所处的状态。但最后是的,使用正确的其他代码组合,添加{} 就成功了。但我有一个问题。如果mapStateToProps 正在查看state.mainBuffer,该组件是否仍会被触发?换句话说,Object.assign(state, {mainBuffer: action.samples} 不会更改 mainBuffer 属性,react-redux 正在监视浅比较? (假设action.samples每次都是一个新对象?
  • connect 还会查看根状态对象本身是否已更改。如果根对象与之前的引用相同,那么它甚至不会重新运行该组件的 mapState 函数。类似地,combineReducers 将返回之前的父状态对象,如果它认为切片缩减器都没有返回新的东西。我在The Tao of Redux, Part 1 - Implementation and Intent 中谈到了这种不变性行为。
  • 在某一时刻,我的 NEW_BUFFER 减速器是 return { mainBuffer: actions.samples },我没有看到组件重新渲染。该代码是不可变的更新吗?
  • 可能是。取决于action.samples 的来源。例如,如果该数组与该状态中已存在的数组相同,则您已重用现有数组引用,而不是创建新数组引用。
  • 这只是向我展示了我对 JS 引用语义的理解是多么不透明。假设action.samples 是同一个参考。我仍然认为获得与mainBuffer 的值相同的对象的新实例化对象将被redux 视为更改。无论如何,每次动作调度生成的数组肯定是一个不同的对象,因为每次生成数组时,函数都以var newBuffer = []
猜你喜欢
  • 2020-03-03
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-22
相关资源
最近更新 更多