2016-10-02 13 views
17

Jestem początkujący z reactjs/redux, nie mogłem znaleźć prostego w użyciu przykładu użycia wywołania api do pobierania danych w aplikacji redux. Sądzę, że można użyć wywołania ajax jquery, ale są tam prawdopodobnie lepsze opcje?Jak pobrać dane przez api w redux?

+0

https://github.com/argelius/react-onsenui-redux-weather/tree/master/api –

+0

Możliwy duplikat [Jak zrobić żądania HTTP w reagują-Redux?] (Http: //stackoverflow.com/questions/39794895/how-do-i-make-an-http-request-in-react-redux) –

Odpowiedz

30

JSfiddle; http://jsfiddle.net/cdagli/b2uq8704/6/

Używa redux, redux-thunk i Fetch.

Metody pobierania;

(Uwaga::.. Można zdefiniować wiele akcji np fetchPostRequest mogą być używane do wyświetlania wskaźnik załadunku lub można wysyłają różne działania w przypadku różnych kodów stanu HTTP)

użyte powyżej

function fetchPostsWithRedux() { 
    return (dispatch) => { 
    dispatch(fetchPostsRequest()); 
    return fetchPosts().then(([response, json]) =>{ 
     if(response.status === 200){ 
     dispatch(fetchPostsSuccess(json)) 
     } 
     else{ 
     dispatch(fetchPostsError()) 
     } 
    }) 
    } 
} 

function fetchPosts() { 
    const URL = "https://jsonplaceholder.typicode.com/posts"; 
    return fetch(URL, { method: 'GET'}) 
    .then(response => Promise.all([response, response.json()])); 
} 

Akcje

function fetchPostsRequest(){ 
    return { 
    type: "FETCH_REQUEST" 
    } 
} 

function fetchPostsSuccess(payload) { 
    return { 
    type: "FETCH_SUCCESS", 
    payload 
    } 
} 

function fetchPostsError() { 
    return { 
    type: "FETCH_ERROR" 
    } 
} 

W swoim reduktorze można załadować posty do stanu;

const reducer = (state = {}, action) => { 
    switch (action.type) { 
    case "FETCH_REQUEST": 
     return state; 
    case "FETCH_SUCCESS": 
     return {...state, posts: action.payload}; 
    default: 
     return state; 
    } 
} 

Możesz uzyskać dostęp do stanu i działań w ramach komponentu po podłączeniu ich;

connect(mapStateToProps, {fetchPostsWithRedux})(App); 
+0

dziękuję, dobra robota –

+0

Dziwne, używając tego dokładnego kodu otrzymuję komunikat "Uncaught (in Promise) Error: Reduktorzy nie mogą wysyłać akcji." – csilk

+0

Co robi zwracając 'Promise.all ([response, response.json()])' do? Dlaczego nie zwrócić 'response.json()'? – Rohmer

5

Utwórz akcję, w której wykonuje się żądanie do interfejsu API. Możesz użyć biblioteki takiej jak aksios lub pobranie, które zwróci obietnicę.

działania/index.js:

import axios from 'axios'; 

export const FETCH_SOMETHING= 'FETCH_SOMETHING; 
const ROOT_URL = 'http://api.youapi.com'; 

export function fetchWeather(city) { 

    const url = `${ROOT_URL}&q=${aParamYouMayNeed}`; 
    const request = axios.get(url); 

    return { 
     type: FETCH_SOMETHING, 
     payload: request 
    }; 
} 

Następnie w reduktor, zużywają wynik obietnica raz uchwala się co następuje:

reduktory/reducer_something.js:

import { FETCH_SOMETHING} from '../actions/index'; 

export default function(state = [], action) { 
    switch (action.type) { 
     case FETCH_SOMETHING: 
     return [ action.payload.data, ...state ]; 
    } 

    return state; 
} 

Kod pożyczone od Stephena Gridera. To jest jego repozytorium: https://github.com/StephenGrider/ReduxCasts/tree/master/weather/src

+0

Czy masz plunarza czy coś takiego? –

+0

Nie, ale możesz sklonować próbkę w mojej odpowiedzi (tylko ją edytować), którą przetestowałem i działa dobrze. – Franco

+0

Dlaczego nie trzeba używać '.then()' w reduktorze, aby upewnić się, że obietnica została spełniona i że 'dane' nie jest' niezdefiniowane'? – jhuang