Как я могу добавить данные в ожидающее действие?

Я использую промежуточное ПО Axios, Redux и Redux Promise.

У меня есть следующий создатель действий:

return {
        type: 'FETCH_USERS',
        payload: axios.get('http://localhost:8080/users',
            {
                params: {
                    page
                }
            }
        )
    }

В моем редукторе для FETCH_USERS_PENDING действие, я хотел бы сохранить запрошенный URL в моем состоянии. Как я могу это сделать?

2 ответа

Вы хотите использовать "meta" переменную redux-обещания-промежуточного программного обеспечения. Вот так:

return {
  type: 'FETCH_USERS',
  meta: { url: 'http://localhost:8080/users' },
  payload: axios.get('http://localhost:8080/users', config)
}

Вы могли бы передать это в своих параметрах, но это не будет возвращено, пока страница не будет выбрана. Это означает, что он не будет возвращен во время FETCH_USERS_PENDING.

И я вполне уверен, что если вы включите непосредственно в возвращаемый объект (например, как предложил Лукас), он будет удален из этапа FETCH_USERS_PENDING.

Вот этап FETCH_USERS_PENDING из промежуточного программного обеспечения redux-обещания:

  /**
   * First, dispatch the pending action. This flux standard action object
   * describes the pending state of a promise and will include any data
   * (for optimistic updates) and/or meta from the original action.
   */
  next({
    type: `${type}_${PENDING}`,
    ...(data !== undefined ? { payload: data } : {}),
    ...(meta !== undefined ? { meta } : {})
  });

Как вы можете видеть на этом этапе, промежуточное программное обеспечение возвращает добавленный атрибут "type" и проверяет атрибуты "data" и "meta". Если они присутствуют, они передаются в рамках действия.

Вот исходный код избыточного-обещающего-промежуточного программного обеспечения, если вы хотите изучить его дальше.

Просто передайте URL в действии:

return {
  type: 'FETCH_USERS',
  url: 'http://localhost:8080/users',
  payload: axios.get('http://localhost:8080/users', {
    params: {
      page
    }
  }
}

и получить доступ к нему в редукторе с action.url, Или вы можете оставить действие как есть и получить к нему доступ в решении обещания:

action.payload.then(function(response) {
  var url = response.config.url;
});
Другие вопросы по тегам