繁体   English   中英

另一个动作后React Redux调度操作

[英]React Redux dispatch action after another action

我有一个异步操作,从REST API获取数据:

export const list = (top, skip) => dispatch => {
    dispatch({ type: 'LIST.REQUEST' });

    $.get(API_URL, { top: top, skip: skip })
        .done((data, testStatus, jqXHR) => {
            dispatch({ type: 'LIST.SUCCESS', data: data });
        });
};

同步操作,更改skip状态:

export const setSkip = (skip) => {
    return {
        type: 'LIST.SET_SKIP',
        skip: skip
    };
};

top = 10, skip = 0初始状态top = 10, skip = 0 在组件中:

class List extends Component {
    componentDidMount() {        
        this.list();
    }

    nextPage() {
        let top = this.props.list.top;
        let skip = this.props.list.skip;

        // After this 
        this.props.onSetSkip(skip + top);

        // Here skip has previous value of 0.
        this.list();
        // Here skip has new value of 10.
    }

    list() {
        this.props.List(this.props.list.top, this.props.list.skip);
    }

    render () {
        return (
            <div>
                <table> ... </table>
                <button onClick={this.nextPage.bind(this)}>Next</button>
            </div>
        );
    }
}

当按钮第一次接着点击时,的值skip它采用异步动作没有变化。 如何在同步操作后发送操作?

如果您使用的是redux thunk ,则可以轻松地将它们组合在一起。 它是一个中间件,可以让动作创建者返回一个函数而不是一个动作。

如果您不需要链接动作创建者并且只需要运行它们,那么您的解决方案现在可能已经适用于您。

this.props.onList(top, newSkip);
this.props.onSetSkip(newSkip);

如果您需要链接(以同步方式调用它们)或等待第一个调度操作的数据,这就是我建议的。

export function onList(data) {
  return (dispatch) => {
          dispatch(ONLIST_REQUEST());
    return (AsyncAPICall)
    .then((response) => {
      dispatch(ONLIST_SUCCESS(response.data));
    })
    .catch((err) => {
      console.log(err);
    });
  };
}

export function setSkip(data) {
      return (dispatch) => {
              dispatch(SETSKIP_REQUEST());
        return (AsyncAPICall(data))
        .then((response) => {
          dispatch(SETSKIP_SUCCESS(response.data));
        })
        .catch((err) => {
          console.log(err);
        });
      };
    }

export function onListAndSetSkip(dataForOnList) {
  return (dispatch) => {
     dispatch(onList(dataForOnList)).then((dataAfterOnList) => {
       dispatch(setSkip(dataAfterOnList));
     });
  };
}

您可以直接从reducer调用该函数,而不是在同步操作后调度操作吗?

所以它遵循这个流程:

同步动作调用 - >减速器调用--->案例功能(减速器)--->案例功能(减速器)

而不是通常的流程,这可能是你的:

同步动作呼叫 - >减速器呼叫

按照本指南拆开减速器 ,看看减速器是什么情况。

如果您要调度的操作有副作用,那么正确的方法是使用Thunks然后您可以在操作后调度操作。

Thunk的示例:

export const setSkip = (skip) => {
    return (dispatch, getState) => {

        dispatch(someFunc());
        //Do someFunc first then this action, use getState() for currentState if you want
        return {
            type: 'LIST.SET_SKIP',
            skip: skip
        };
    }
};

感谢您的回复,但我这样做了:

let top = this.props.list.top;
let skip = this.props.list.skip;
let newSkip = skip + top;

this.props.onList(top, newSkip);
this.props.onSetSkip(newSkip);

首先,我计算新skip并使用此新值调度异步操作。 然后我发送一个syns动作,更新skip状态。

还要检查出redux-sequence-action

dispatch({type:'LIST.SUCCESS',data:data,skip: 同步动作后你想要的值 });

暂无
暂无

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

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