如何应对redux中的状态变化并发出另一个动作?

时间:2016-06-29 22:59:49

标签: reactjs redux react-redux

有人可以给我提供有关如何使用react-redux执行以下操作的线索:

组件A调度更新状态(异步)的操作

组件B(不是A的子组件)需要能够检测到状态何时发生变化并发送另一个动作。

我的问题是当我尝试在组件B中执行调度操作2时,状态仍处于初始状态且未更新。

我也尝试在componentWillUpdate中调度动作2,但是,它会创建一个无限循环,因为第二个动作也会更新状态(也是异步)

这或多或少看起来如此:

//----- Component A
class ComponentA extends React.Component {
  constructor(props) {
    super(props);
    this.props.dispatch(loadEvents()); // loadEvents is async and will   update state.eventsState
  }
}

const mapStateToProps = function (state) {
  return {
    eventsState: state.eventsState,
  };
};

export default connect(mapStateToProps)(ComponentA);


//----- Component B
class ComponentA extends React.Component {
  constructor(props) {
    super(props);
    props.dispatch(getEventUsers(props.eventsState.eventId)); // the eventsState is in initial state here (empty)...where do I call getEventUsers?
  }

  componentWillUpdate(nextProps) {
    nextProps.dispatch(getEventUsers(props.eventsState.eventId)) // Creates an infinite loop, getEventUsers also updates state
  }
}

const mapStateToProps = function (state) {
  return {
    eventsState: state.eventsState,
  };
};

export default connect(mapStateToProps)(ComponentA);

1 个答案:

答案 0 :(得分:3)

在不查看Redux代码的情况下,我说组件B在构造函数中获取空数据,因为它几乎在组件A的同时实例化,并且此时启动了异步请求by Component构造函数仍在进行中。

当异步请求完成时,您的Redux应该触发包含接收数据的操作。然后,您的reducer将这些数据置于状态,这反过来会改变连接组件的道具并迫使它们重新渲染。

只有在props.eventState.eventId存在且已更改时才应调度getEventUsers。