繁体   English   中英

React无法识别Reducer中的状态变化

[英]React doesn't recognize state change in reducer

我有一个进行API调用,然后通过reducer更新状态的组件。 问题是,这不能很好地工作,因为组件中的数据没有得到更新,这就像反应没有注意到状态改变而从未重新渲染组件一样,但是我不确定这是否是真正的问题在这里。 因此该组件如下所示:

class MyComponent extends Component {
  componentDidMount() {
    // ajax call
    this.props.loadData(1);
  }

  render() {
    return (
      <Grid>
        <MySecondComponent
          currentData={this.props.currentData}

        />
      </Grid>
    );
  }
}

const mapStateToProps = state => ({
  reducer state.myReducer,
  currentData: state.myReducer.currentData
});

const mapDispatchToProps = dispatch => {
  return {
    loadData: () => {
      HttpClient.getData(id, (data) => {
        dispatch(
          action_loadCurrentData(
            data
          )
        );
      });
    },
  };
};

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

我在这里做两件事:在安装组件后立即发出API调用,然后在获取数据后立即分发action_loadCurrentData

此操作如下所示:

//行动

export function action_loadCurrentData(
  data
) {
  return {
    type: 'LOAD_CURRENT_DATA',
    payload: {
      currentData: data,
    }
  };
}

和减速器:

//减速器

const defaultState = {

};

const reducer = (state = defaultState, action) => {
  switch (action.type) {
    case 'LOAD_CURRENT_DATA':
      state = {
        ...state,
        currentData: {
          myData: {
            ...state.currentData.myData,
             0: action.payload.currentData
          }
        }
      };
    }
};

export default myReducer;

因此,这里的问题this.props.currentData ,我传递给MySecondComponent最终将为空,好像我根本没有设置数据一样。 但是,如果我在调试器中停止执行并花几秒钟的时间,数据将被正确填充,因此我不确定在这里做错了什么吗?

不要重新分配状态,而是返回新创建的对象

 const reducer = (state = defaultState, action) => {
  switch (action.type) {
    case 'LOAD_CURRENT_DATA':
      return {
        ...state,
        currentData: {
          myData: {
            ...state.currentData.myData,
             0: action.payload.currentData
          }
        }
      };
    }
};

减速器需要返回新的状态对象,该对象必须是与先前状态不同的实例以触发组件更新。

根据redux文档

reducer是一个纯函数,它接受上一个状态和一个动作,然后返回下一个状态

在减速器中永远不应该做的事情:

  • 改变其论点 ;
  • 执行副作用,例如API调用和路由转换;
  • 调用非纯函数,例如Date.now()或Math.random()。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM