来自组件 react/redux 的多个调度调用

Multiple dispatch calls from component react/redux

我真的不知道为什么我不能让它工作。所有的证据都反对它......情况是这样的:

我有一个数据网格和一个搜索面板。更改搜索面板时,搜索参数会更新并用于更新数据网格。

触发链的是用户更改搜索面板时。在我的组件中,我通过以下方式处理搜索面板更改:

  getPhotos(key, value) {
    const change = [{ key: key, value: value},{ key: 'page', value: 1}]
    this.props.dispatch(updateSearchParams(change))

    console.log('payload.searchParams', this.props.searchParams);

    this.props.dispatch(
      getPhotos(
        { context:this.props.params.context,
          searchParams: this.props.searchParams }
      )
    );
  }

因此,对动作创建者的两次分派调用构成了组件。问题是 searchparams 没有及时更新 getPhotos 调用,所以网格没有相应更新。

我认为调度调用是同步的——因此一个接一个。我猜这是从组件到 action creator,再到 store 和 reducer 的往返过程 "screwing"。 第一次调用不涉及任何异步调用。

"right" 这样做的方法是什么?请具体说明组件、action creator 和 reducer 中的内容。

谢谢

dispatch 是同步的(除非你使用像 redux-thunk 这样的中间件)。但是在 this.props.dispatch(updateSearchParams(change)) 之后,您的组件需要更新(重新渲染)或者 this.props.searchParams 仍然是旧组件。

您可以在componentWillReceiveProps(nextProps)中写this.props.dispatch(getPhotos(...)),这样您就可以访问新道具(nextProps)


如果您正在使用 redux-thunk 并且两个动作 updateSearchParamsgetPhotos 总是绑定在一起,您可以为它们创建另一个聚合动作创建器。

const updateSearchParams = change => dispatch => {
  // return a promise here
  // or use callback style etc. whatever you prefered
}

const updateSearchParamsAndGetPhotos = (change, context) => dispatch => {
  dispatch(updateSearchParams(change))
    .then(res => {
      dispatch(getPhotos({
        context,
        searchParams: res.data.searchParams
      }))
    })
}

所以现在在发送单个操作后,您的组件应该会收到新照片。

我一开始就错了

搜索参数不应进入商店。我可以单独处理组件中的 - 在组件的状态下。 这简化并消除了我上面描述的问题。

当然,可能存在搜索参数需要对其他组件可用的情况。在那种情况下,我会用 thunk 寻求上面的 @CodinCat 答案。它有效,我在实现之前就设法实现了它。

谢谢