2017-10-17 3 views
0

私の反応クラスでこの問題があります。自分の状態を更新しようとしていますが、このエラーが発生します。 "未定義のsetState 'プロパティを読み取れません。オンラインすべてのソリューションを試してみましたが、運、ここ'this.setState'で何が問題なのですか?

はコード

export default class PageBackground extends Component{ 
    constructor(props) { 
      super(props); 

      this.state={ 
       lat   :'nothing', 
       longi  :'' 
      }; 
      this.getLocation=this.getLocation.bind(this); 
      } 


     componentWillMount() { 
      this.getLocation(); 
     } 
     getLocation() { 

      fetch('http://freegeoip.net/json/') 
      .then((res)=>res.json()) 
      .then(function (objec){this.setState({lat:objec.latitude,longi:objec.longitude});}) 
      .catch((err)=>console.log("didn't connect to App",err)) 
      console.log(this.state.lat) 
     } 

     render(){ 
      return(
       <p>{this.state.lat}</p> 
       ) 
      } 
     } 
+0

コンソールログは入手できますか? – buoyantair

+0

「this」は関数のコンテキスト内にあると思います。たぶんあなたは 'that = this'と' that.setState'を試してみるべきでしょう – AnkitG

+0

この非常に重大な誤りは、文字通り何百万もの重複があります。私はあなたがそれらのどれかを見つけることができなかったことに驚いています。 – Chris

答えて

5

function() { ... }構文は文脈からthisの参照を維持しないであろうではありませんしています。代わりに矢印の機能を使用します。

then(() => { 
    this.setState({lat: objec.latitude, longi: objec.longitude}) 
}) 

別のオプションは、function() { }.bind(this)を追加することです。

それとも、単にローカル変数にthisを保存し、関数内でそれを使用する:

var self = this; 
fetch('http://freegeoip.net/json/') 
     .then((res)=>res.json()) 
     .then(function (objec){self.setState({lat:objec.latitude,longi:objec.longitude});}) 
     .catch((err)=>console.log("didn't connect to App",err)) 
     console.log(this.state.lat) 

ただし、矢印の機能はこの種の問題のために正確に導入されました。

+0

ありがとうございます。これはうまくいきましたが、理由を知りたいのですか?私は矢印の機能を読んでもうまくいきません。なぜこのような状況が違うのですか? –

+0

なぜ、我々のコンストラクタでes6クラスに作成するすべてのメソッドをバインドする必要があるのでしょうか? –

+1

@ JohnAnisere最初の質問に対する答えは、矢印関数が周囲のコードから 'this 'を取得することです。したがって、' this'を手動でバインドする必要はありません。彼らはあなたが期待する方法で動作します。もう一つの質問はより複雑です。クラスメソッドが "ルース"(ファーストクラス)関数として使用されているときの問題について話しています。メソッドは自動的にインスタンスにバインドされず、手動でバインドする必要があります。 – Sulthan

1

これを試してみてください:

getLocation() { 
      var self = this; 
      fetch('http://freegeoip.net/json/') 
      .then(function (objec) { 
       console.log(objec); 
       self.setState({lat: objec.latitude, longi: objec.longitude}) 
      }) 
      .catch(function (error) { 
       console.log(error); 
      }); 
     } 
1

ここで問題となっている、あなたは別のスコープでthisをaccesssしようとしています。

function() {}をコールバックとして渡すたびに、それ自身の有効範囲が作成されます。 代わりに矢印関数を使用します。

() => { 'your code here'; } 

矢印機能は、その親のスコープを共有します。

getLocation =() => { 
    fetch('https://freegeoip.net/json/') 
     .then(res => res.json()) 
     .then((objec) => { 
      this.setState({ lat: objec.latitude, longi: objec.longitude }); 
     }) 
     .catch(err => console.log("didn't connect to App", err)); 
    console.log(this.state.lat); 
} 
+0

ありがとうございました.. –

関連する問題