Redux 状态发生了变化,为啥不触发重新渲染? (Redux 传奇)

Posted

技术标签:

【中文标题】Redux 状态发生了变化,为啥不触发重新渲染? (Redux 传奇)【英文标题】:Redux state has changed, why doesn't it trigger a re-render? (Redux-saga)Redux 状态发生了变化,为什么不触发重新渲染? (Redux 传奇) 【发布时间】:2022-01-13 17:08:39 【问题描述】:

我正在使用 react + redux + redux saga

我在渲染页面时遇到了问题(GET 调用) 调用应该是这样的:

    构造函数 渲染() componentDidMount 渲染()

但我刚刚到达componentDidMountmapDispatchToProps 正在调度操作,API 调用正在工作,通过它从服务器获取响应并将数据更新到状态。 但是它在某处丢失了,我的组件甚至没有重新渲染。 直到减速器,我正在获取要返回的数据action.items

itemReducer.js

const itemReducer = (state = initialState, action) => 
  switch (action.type) 
    case types.GET_ALL_ITEMS_SUCCESS:
      console.log("itemReducer-----", action.items); //getting the data over here
      return action.items;
    default:
      return state;
  
;

itemPage.js(组件)

class ItemsPage extends React.Component 
      componentDidMount() 
        this.props.loadItems();
      

     render() 
        const  items  = this.props; // not even it renders, so not getting data
        ...
        return (<div>...</div>);
     


const mapStateToProps = (state) => 
  return 
    items: state.items,
  ;
;

const mapDispatchToProps = (dispatch) => 
  return 
    loadItems: () => dispatch(loadAllItemsAction()),
  ;
;

export default connect(mapStateToProps, mapDispatchToProps)(ItemsPage);

请给一些建议,提前致谢 :D

【问题讨论】:

【参考方案1】:

您需要了解 render/componentDidMount 的调用并不像预期的那样线性。当所有子级都mount 时,componentDidMount 会触发。这并不意味着 render() 已经完成了。

阅读此处了解更多信息: https://github.com/facebook/react/issues/2659

【讨论】:

【参考方案2】:

您发布的代码没有问题。为了确保我几乎复制粘贴了您共享的代码,填写了缺失的部分并且它工作得很好: https://codesandbox.io/s/3tuxv?file=/src/index.js

我猜可能有问题的是您的项目没有存储在 state.items 中,而是在一些不同的路径下,或者您可能缺少 react-redux 提供程序,但是如果没有看到更多代码就不可能肯定地说.

【讨论】:

感谢 @martin-kadlec,您的 sn-p 帮助我找到了丢失的部分,即 items: itemReducer,我丢失了密钥 items

以上是关于Redux 状态发生了变化,为啥不触发重新渲染? (Redux 传奇)的主要内容,如果未能解决你的问题,请参考以下文章

尽管状态发生了变化,但自定义钩子不会触发组件重新渲染

React Redux Store 更新,但组件不重新渲染

为啥 useState 不触发重新渲染?

Vuex 全局状态更改不会触发 Nuxt 中 v-for 循环中的重新渲染组件

在 Redux 状态下更新单个值

状态对象发生变化时更新上下文