2017-05-02 1 views
0

反応ネイティブについて学ぶために、私は単純なアプリケーションを構築しようとしています。新しいデータを取得した後、どのようにしてreact-nativeでsetStateを使用できますか?

このアプリケーションは、最初に "HELLO WORLD"を印刷し、その後、このテキストを取り出すjsonファイルの内容で置き換えます(テストでは{'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); 

これは、HELLO WORLDを表示してからJSONを取得し、私はそれが新しいメッセージを表示するために取得するために管理していないことで動作します。代わりにこのエラーが表示されます。

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

私は間違っているように感じます。コンストラクタ内部からsetStateを呼び出すことはしないのですか?正しい文脈が得られないのですか?

これを行うにはどのような方法がありますか?

+0

?あなたはフェッチ-jsからNPM使用しなかったようにそれを行うことができますか? –

+0

あなたが何を意味するかわからない、ローカルマシンからファイルを取得します。私は 'http://localhost/test-file.json'が他の人には役に立たないと感じたのでその部分を省略しましたが、フェッチ操作はうまく動作します。 – user1090729

+0

これが問題になる場合は、ローカルマシンの外で動作するURLを変更しました。 – user1090729

答えて

5

あなたは、あなたがURLからデータをフェッチするために管理方法

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

これはうまくいくはずです – MattyK14

+0

ありがとう、これは完全に働いた。あなたは*なぜそれが動作するのか理解してくれるのを助けてくれますか?それはコンストラクタ内からsetStateを呼び出すことができないからですか?それとも、矢印関数が私が使用していたものとは異なる方法でコンテキストを処理するからでしょうか? – user1090729

関連する問題