在React-Redux

时间:2017-06-01 20:23:55

标签: reactjs redux react-redux

我有以下Axios请求:

componentDidMount() {
    axios.post('http://localhost:3030/api/weather/refresh').then(response => {
      store.dispatch(refreshWeather(response))
    });
  }

这会向Redux发送一个调度,用于以常见模式提供表示容器。

我的问题是 - 我怎样才能做到这一点axios.post()请求可以在应用程序的其他组件或部分中重复使用?我已将其导入到导入的外部文件中,但是有更好的方法来构建我的项目,以便将所有axios请求组合在一起吗?

我有以下mapDispatchToProps:

const mapDispatchToProps = (dispatch, ownProps) => {    
  return {
    onClickRefresh: () => {
      dispatch(refreshWeather(arr))
    }
  }
}

我希望运行与componentDidMount()相同的请求,但不确定如上所述的重复使用的最佳方法。

由于

3 个答案:

答案 0 :(得分:2)

您可以通过应用redux-thunk中间件并使用中间方法执行请求来实现此目的。

const REFRESH_WEATHER = 'REFRESH_WEATHER';

export const requestWeather = () => dispatch => {
    axios.post('http://localhost:3030/api/weather/refresh').then(response => {
        dispatch(refreshWeather(response));
    });
};

const refreshWeather = (response) => {
    return {
        type: REFRESH_WEATHER,
        response,
    };
}

如果您发现自己制作了大量重复的类似请求,可以构建自己的api中间件来处理任何请求。

答案 1 :(得分:1)

Redux中的模式是使用Async Action Creator,这样它就可以像任何其他Action Creator一样重复使用并映射到你的道具。

official docs中有一个很好的例子说明了这一点。

答案 2 :(得分:1)

config.js

module.exports = {
  API_URL: 'http://localhost:3030/api',
};

makeRequest.js

import axios from 'axios';
import { API_URL } from './config';

module.exports = (path, method, ...args) => axios[method](API_URL + path, ...args);

actions.js

module.exports.refreshWeather = (newWeather) => ({
  type: 'REFRESH_WEATHER',
  payload: newWeather,
});

stories.js

import makeRequest from './makeRequest';
import { refreshWeather as refreshWeatherAction } from './actions';

module.exports.resfreshWeatherStory = (dispatch) => (
    makeRequest('/weather/refresh', 'post')
        .then(response => dispatch(refreshWeatherAction(response)));
);

YourComponent.js

...
import { refreshWeatherStory } from './stories';
...
componentDidMount() {
    refreshWeatherStory(store.dispatch);
}
...

OtherPlace.js

...
import { refreshWeatherStory } from './stories';

const mapDispatchToProps = dispatch => ({
    onClickRefesh: () => refreshWeatherStory(dispatch),
});
...

你明白了