2016-04-02 28 views
10

Buona sera a tutti!Gestione chiamate api in Redux con Axios

Sono un principiante assoluto in React e Redux quindi per favore abbiate pazienza se questo sembra totalmente stupido. Sto cercando di imparare come posso eseguire alcune chiamate API in Redux e non sta andando tutto bene. Quando consegno la richiesta di log dal creatore dell'azione, il valore di promessa è sempre "indefinito", quindi non sono sicuro di farlo correttamente.

Il mio obiettivo è raccogliere le informazioni dai dati all'interno dell'oggetto payload e visualizzarle all'interno del componente. Ho cercato di farlo funzionare negli ultimi giorni e sono completamente perso.

Sto usando Axios per e redux-promise per gestire la chiamata.

Qualsiasi aiuto sarà molto apprezzato.

Ecco l'output dalla console.

enter image description here

enter image description here

azione Creatore

import axios from 'axios'; 
export const FETCH_FLIGHT = 'FETCH_FLIGHT'; 

export function getAllFlights() { 

const request = axios.get('http://localhost:3000/flug'); 
console.log(request); 
    return { 
    type: FETCH_FLIGHT, 
    payload: request 
    }; 
} 

Reducer

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

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

Componente

import React from 'react'; 
import { Component } from 'react'; 
import { connect } from 'react-redux'; 
import { bindActionCreators } from 'redux'; 
import { getAllFlights } from '../actions/index'; 
import Destinations from './Destinations'; 

class App extends Component { 

componentWillMount(){ 
    this.props.selectFlight(); 
} 

constructor(props) { 
super(props); 
    this.state = { 
}; 
} 

render() { 
    return (
    <div> 
    </div> 
    ); 
} 

function mapStateToProps(state) { 
return { 
    dest: state.icelandair 
    }; 
} 

function mapDispatchToProps(dispatch) { 
return bindActionCreators({ selectFlight: getAllFlights }, dispatch); 
} 
export default connect(mapStateToProps, mapDispatchToProps)(App); 
+0

Ciò che non stava lavorando per voi? Il tuo codice sembra OK. redux-promise vuole che il carico utile sia una promessa e sembra che sia quello che stai fornendo. –

risposta

14

axios è la promessa quindi è necessario utilizzare then per ottenere il risultato. Dovresti richiedere la tua API in un file separato e chiamare la tua azione quando il risultato tornerà.

//WebAPIUtil.js 
axios.get('http://localhost:3000/flug') 
    .then(function(result){ 
    YourAction.getAllFlights(result) 
    }); 

Nel file azione sarà simile a questo:

export function getAllFlights(request) { 
    console.log(request); 
    return { 
    type: FETCH_FLIGHT, 
    payload: request 
    }; 
} 
+0

Grazie per il tuo aiuto :) – Steinar

+0

perché non contrassegnare questo come una risposta? può aiutare gli altri – Bukhari

+0

Sì, contrassegnare questo come risposta. Mentre personalmente mi piace il middleware di redux-axios, questa è davvero la migliore risposta e dovrebbe essere contrassegnata come uno per il futures sake! –

1

Penso anche che il modo migliore per farlo è redux-axios-middleware. La configurazione può essere un po 'complicato come il negozio dovrebbe essere configurato in modo simile:

import { createStore, applyMiddleware } from 'redux'; 
import axiosMiddleware from 'redux-axios-middleware'; 
import axios from 'axios'; 
import rootReducer from '../reducers'; 

const configureStore =() => { 
    return createStore(
    rootReducer, 
    applyMiddleware(axiosMiddleware(axios)) 
); 
} 

const store = configureStore(); 

E i tuoi creatori d'azione appare così:

import './axios' // that's your axios.js file, not the library 

export const FETCH_FLIGHT = 'FETCH_FLIGHT'; 

export const getAllFlights =() => { 
    return { 
    type: FETCH_FLIGHT, 
    payload: { 
     request: { 
     method: 'post', // or get 
     url:'http://localhost:3000/flug' 
     } 
    } 
    } 
} 
1

È possibile farlo con tonfo. https://github.com/gaearon/redux-thunk

È possibile inviare un'azione nel proprio then e aggiornerà lo stato quando riceve una risposta dalla chiamata axios.

export function someFunction() { 
 
    return(dispatch) => { 
 
     axios.get(URL) 
 
     .then((response) => {dispatch(YourAction(response));}) 
 
     .catch((response) => {return Promise.reject(response);}); 
 
    }; 
 
}

Problemi correlati