2017-08-21 4 views
1

Ich versuche, 2 Anfragen zu erstellen und Variablen mit this.setState({}) für weitere Änderungen zu setzen.Axios mehrere Anfragen in React

Dies ist, was ich habe:

class App extends React.Component { 
 
    constructor() { 
 
    super(); 
 
    this.state = {user: false, repository :false} 
 
    } 
 

 
    componentDidMount() { 
 
    axios.all([ 
 
    axios.get('https://api.github.com/users/antranilan'), 
 
    axios.get('https://api.github.com/users/antranilan/repos') 
 
    ]) 
 
    .then(axios.spread(function (userResponse, reposResponse) { 
 
      this.setState({user : userResponse.data, repository : reposResponse.data}); 
 
     }); 
 
    } 
 
    
 
    render() { 
 
    return (
 
    <div> 
 
     {this.state.user.login} 
 
     {this.state.repository.length} 
 
    </div> 
 
    ) 
 
    } 
 
} 
 

 
ReactDOM.render(<App />, document.getElementById('app'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 
<div id="app"></div>

ich mit mehreren Fragen sah durch das, was ich zu tun versucht, aber es gab keine Lösung zu dem, was ich zu achive versuche.

+0

'.then (axios.spread' das sieht falsch aus, weil '.then 'traditionell erwartet eine Funktion als Argument, nicht das Ergebnis des Aufrufs einer Funktion –

+0

Wie sollte es aussehen? – Mac

+1

sieht aus wie axios.all und axios .spread wird sowieso nicht zu lang sein, https://github.com/mzabriskie/axios/issues/1042 –

Antwort

4

Sie haben ein bindendes Problem in Ihrem Code.

class App extends React.Component { 
 
    constructor() { 
 
    super(); 
 
    // You should use object to delineate the type 
 
    this.state = {user: {}, repository :{} } 
 
    } 
 

 
    componentDidMount() { 
 
    // Better use native Promise.all 
 
    Promise.all([ 
 
     axios.get('https://api.github.com/users/antranilan'), 
 
     axios.get('https://api.github.com/users/antranilan/repos') 
 
    ]) 
 
    // use arrow function to avoid loosing context 
 
    // BTW you don't need to use axios.spread with ES2015 destructuring 
 
    .then(([userResponse, reposResponse]) => { 
 
      this.setState({user : userResponse.data, repository : reposResponse.data}); 
 
     }); 
 
    } 
 
    
 
    render() { 
 
    const { user, repository } = this.state 
 
    return (
 
    <div> 
 
     {user && user.login} 
 
     {repository && repository.length} 
 
    </div> 
 
    ) 
 
    } 
 
} 
 

 
ReactDOM.render(<App />, document.getElementById('app'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 
<div id="app"></div>

UPDATE als @JaromandaX wies darauf hin, Sie besser mit nativer Promise.all und Destrukturierung bleiben würde.

+2

Ich würde "Promise.all" anstelle von "axios.all" empfehlen ... scheint, dass axios.all für den Papierkorb bestimmt ist - https://github.com/mzabriskie/axios/issues/1042 –

+1

@JaromandaX Aktualisiert –

Verwandte Themen