2017-08-14 9 views
0

太字のArrow関数を使用してもこのエラーが発生しますが、setStateを使用する場合はこのコンテキストをバインドします。誰でも助けてくれますか?React - 未定義のプロパティ 'state'を読み取ることができません

export default class App extends Component { 

constructor(props) { 
    super(props); 
    this.state = { 
     query: '', 
     items: [], 
     repos: [] 
    }; 
} 

search(term) { 
    this.setState({ 
     query: term 
    }); 
    const clientId = '12489b7d9ed4251ebbca'; 
    const secret = 'ff53ac9a93aaa9e7cddc0c009d6f068302866ff2'; 

    function fetchUser() { 
     return axios.get(`https://api.github.com/users/${this.state.query}/repos?client_id=${clientId}client_secret=${secret}`); 
    } 

    function fetchRepos() { 
     return axios.get(`https://api.github.com/users/${this.state.query}?client_id=${clientId}client_secret=${secret}`); 
    } 

    axios.all([fetchUser(), fetchRepos()]) 
     .then(axios.spread((items, repos) => { 
      this.setState({ 
       items: items.data, 
       repos: repos.data 

      }); 
      console.log(state); 
     })); 

} 
+0

エラーが発生しているコード行を確認できますか? – webdeb

+0

fetchUserで失敗していました。私はこの変数を追加するだけです。 const query = this.state.query; ありがとうございました! –

+1

私の答えには、親が 'this'を再利用するため、矢印関数を使うべきです。 – webdeb

答えて

1

エラーメッセージから、thisが未定義であることが明らかです。これはおそらく、search()search()でそれを使用しているため、thisは完全に無意味になります。あなたのコンストラクタ関数の最後に次の行を追加し、この試みを修正するには:

 this.search = this.search.bind(this); 

今すぐあなたの検索機能でthisを使用することができるはずです。

0

setStateは同期していません。設定後に状態の値を使用する場合は、オブジェクトの後にsetState内にコールバックを用意する必要があります。

これは、私はそれを行うだろうかです:

onSearch(term) { 
    this.setState({ query: term },() => { 
    console.log(this.state.query); 
    this.search(); 
    }); 
} 

search() { 
    // now you can be sure, that this.state.query is set and use it.. 

    // Use arrow functions, as they will reuse the parent scope. 
    const fetchUser =() => { 

    } 
} 
+2

コールバックを待つのではなく、キーワードとして検索関数に渡したいと思います。 – Sulthan

+0

おそらく、UIで用語を必要としない場合は、もちろんそれを忘れることができます。反対側では、OPのように(状態からの)同じパラメタのセットを使って再度クエリを実行したい場合があります。この場合は、状態に依存する単一のメソッド検索を行う方がよいでしょう。クエリパラメータを変更するときは、最初に状態を更新してから検索を実行する必要があります。 Btw、setState +コールバックのデモンストレーションが便利だと分かりました – webdeb

+0

タグ/カテゴリなどの複雑な検索フォームについて考えています。 Reactでは、すべての変更に 'onTags'、' onCategories'、 'onSearchTerm'のような別のイベントハンドラがあります。したがって、あなたの状態が更新された後も、あなたは引き続き単一の 'search'メソッドを呼び出すことができます。 – webdeb

0

fetchUserからのエラーは私はあなたがsearch機能で正しいthisを持っていると思われる場合。

const fetchUser =() => { 
     return axios.get(`https://api.github.com/users/${this.state.query}/repos?client_id=${clientId}client_secret=${secret}`); 
    } 

それとも

const fetchUser = function(){ 
     return axios.get(`https://api.github.com/users/${this.state.query}/repos?client_id=${clientId}client_secret=${secret}`); 
    }.bind(this); 

と同じfetchReposのために:だから、fetchUserfetchReposをバインドする必要があります。

+0

@Dennis、この回答は役に立ちましたか? – Andrew

関連する問題