2016-04-15 3 views
14

Im using axios внутри моего действия. Мне нужно знать, правильно ли это сделать или нет.Как использовать axios/AJAX с redux-thunk

actions/index.js ==>

import axios from 'axios'; 
import types from './actionTypes' 
const APY_KEY = '2925805fa0bcb3f3df21bb0451f0358f'; 
const API_URL = `http://api.openweathermap.org/data/2.5/forecast?appid=${APY_KEY}`; 

export function FetchWeather(city) { 
    let url = `${API_URL}&q=${city},in`; 
    let promise = axios.get(url); 

    return { 
    type: types.FETCH_WEATHER, 
    payload: promise 
    }; 
} 

reducer_weather.js ==>

import actionTypes from '../actions/actionTypes' 
export default function ReducerWeather (state = null, action = null) { 
    console.log('ReducerWeather ', action, new Date(Date.now())); 

    switch (action.type) { 
    case actionTypes.FETCH_WEATHER: 
      return action.payload; 
    } 

    return state; 
} 

и потом объединить их в rootReducer.js ==>

import { combineReducers } from 'redux'; 
import reducerWeather from './reducers/reducer_weather'; 

export default combineReducers({ 
    reducerWeather 
}); 

И, наконец, вызывая это внутри моего контейнера React E-файл ... расслоение плотной

import React, {Component} from 'react'; 
import {connect} from 'react-redux'; 
import {bindActionCreators} from 'redux'; 
import {FetchWeather} from '../redux/actions'; 

class SearchBar extends Component { 
    ... 
    return (
    <div> 
     ... 
    </div> 
); 
} 
function mapDispatchToProps(dispatch) { 
    //Whenever FetchWeather is called the result will be passed 
    //to all reducers 
    return bindActionCreators({fetchWeather: FetchWeather}, dispatch); 
} 

export default connect(null, mapDispatchToProps)(SearchBar); 
+0

Кажется, что это хорошо, если вы используете вместе с ним промежуточное программное обеспечение redux. – Mozak

ответ

21

Я думаю, вы не должны (или, по крайней мере, не должна) поставить обещание непосредственно в магазине:

export function FetchWeather(city) { 
    let url = `${API_URL}&q=${city},in`; 
    let promise = axios.get(url); 

    return { 
    type: types.FETCH_WEATHER, 
    payload: promise 
    }; 
} 

Таким образом, вы даже не используя Redux -thunk, потому что он возвращает простой объект. На самом деле, перевождите-преобразователь, позволяет возвращать функцию, которая будет оцениваться в дальнейшей, например, что-то вроде этого:

export function FetchWeather(city) { 
    let url = `${API_URL}&q=${city},in`; 
    return function (dispatch) { 
    axios.get(url) 
     .then((response) => dispatch({ 
     type: types.FETCH_WEATHER_SUCCESS, 
     data: response.data 
     }).error((response) => dispatch({ 
     type: types.FETCH_WEATHER_FAILURE, 
     error: response.error 
     }) 
    } 
} 

Убедитесь, что правильно настроить на перевождь-Thunk промежуточного программного обеспечения. I действительно рекомендуюredux-thunk documentation и this amazing article, чтобы иметь более глубокое понимание.

+1

Я понял ответ, напишу код, как только дойду до офиса. Аналогично – STEEL

+0

вам понадобится сервер для вызова AJAX, https://github.com/steelx/ReduxWeatherApp/tree/master/server – STEEL

Смежные вопросы