2017-05-02 2 views
0

Um mehr über react-native zu erfahren, versuche ich eine einfache Anwendung zu erstellen.Wie kann ich setState in reaktionsnativen nach dem Abrufen neuer Daten verwenden?

Diese Anwendung druckt zunächst "HELLO WORLD", danach ersetzt sie diesen Text durch den Inhalt einer JSON-Datei, die sie abruft (in meinem Test enthält sie {'Goodbye': 'World'}).

import React, { Component } from 'react'; 
import { 
    AppRegistry, 
    Text, 
    View, 
} from 'react-native'; 

class FetchTextTest extends React.Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     content: "HELLO WORLD", 
    }; 
    fetch('http://echo.jsontest.com/goodbye/world').then(function(response) { 
      response.json().then(function(data) { 
      this.setState({content: JSON.stringfy(data)}); 
     }); 
    }); 
    } 
    render() { 
    return (
     <Text>{this.state.content}</Text> 
    ) 
    } 
} 

AppRegistry.registerComponent('FetchTextTest',() => FetchTextTest); 

Dies funktioniert, dass es HALLO WORLD zeigt und holt dann die json, aber ich schaffte es nicht, um es zu bekommen, die neue Nachricht anzuzeigen. Stattdessen bekomme ich diesen Fehler:

Possible unhandles Promise Rejection (id: 0): TypeError: undefined is not a function (evaluating 'this.setState 

Ich fühle mich wie ich es falsch mache. Soll ich setState nicht innerhalb des Konstruktors aufrufen? Bekomme ich nicht den richtigen Kontext?

Was ist der erwartete Weg?

+0

Wie Sie Daten von URL zu holen verwaltet? Hast du benutzt npm Fetch-js? –

+0

Ich bin mir nicht sicher, was Sie meinen, ich hole die Datei von meinem lokalen Rechner. Ich habe diesen Teil weggelassen, weil ich fühlte, dass "http: //localhost/test-file.json" für niemanden hilfreich wäre, aber die Abrufoperation funktioniert gut. – user1090729

+0

Wenn dies ein Problem ist, habe ich die URL für eine, die außerhalb meiner lokalen Maschine funktioniert geändert. – user1090729

Antwort

5

Sie können es tun, wie die

import React, { Component } from 'react'; 
import { 
    AppRegistry, 
    Text, 
    View, 
} from 'react-native'; 

export default class App extends Component { 
     constructor(props) { 
     super(props); 
     this.state = { 
      content: "", 
     }; 
     } 

     componentDidMount(){ 
     fetch('http://echo.jsontest.com/goodbye/world') 
      .then((response) => response.json()) 
      .then((responseJson) => { 
      this.setState({content: responseJson}); 
      }) 
      .catch((error) => { 
      console.error(error); 
      }); 
     } 

     render() { 
     return (
      <Text>{this.state.content.goodbye}</Text> 
     ) 
     } 
    } 

AppRegistry.registerComponent('FetchTextTest',() => FetchTextTest); 

expo link

+0

Das sollte funktionieren – MattyK14

+0

Danke, das hat perfekt funktioniert. Könntest du mir bitte helfen zu verstehen * warum * es funktioniert? Liegt es daran, dass ich setState nicht innerhalb des Konstruktors aufrufen kann? Oder liegt es vielleicht daran, dass Pfeilfunktionen den Kontext anders handhaben als die, die ich verwendete? – user1090729

Verwandte Themen