2017-04-30 11 views
1

私は長い時間をかけて私の髪を引っ張ってきました。React.jsはjsonレスポンス、コフェッチ、アキシャルを返します

私はURLからjsonを取り出し、ブラウザで視覚的にレンダリングしようとしています。私はこの障害を乗り越えるまで、少なくともフォーマットされている必要はありません。

console.logでコンソールに表示させることができますが、私はrenderメソッドにレスポンスを得ることができません。ページ上に何かが見えるようになるまで、以下のコードに簡略化しました。

import React, { Component } from 'react'; 
// import axios from 'axios'; 

var co = require('co'); 
co(function *() { 
var res = yield fetch('https://api.stackexchange.com/2.2/search?order=desc&sort=activity&intitle=perl&site=stackoverflow'); 
var json = yield res.json(); 
console.log(res); 
}); 

class App extends Component { 

render() { 
return (
    <div className="App"> 
    INSERT JSON HERE 
    </div> 
); 
} 
} 

export default App; 

また、私は男ああ、私は素晴らしいです誰?私は素晴らしいだからaxiosを使用するつもりだ」と思ったので、私はもともとaxiosを使用して開始

fetch('https://api.stackexchange.com/2.2/search?order=desc&sort=activity&intitle=perl&site=stackoverflow') 
    .then(function(res) { 
     return res.json(); 
    }).then(function(json) { 
     console.log(json); 
    }); 

を使用して応答を取得しています。 "

axios.get('https://api.stackexchange.com/2.2/search?order=desc&sort=activity&intitle=perl&site=stackoverflow') 
    .then(function(response) { 
    console.log(response.data); 
    }); 

しかし、今日は私がすごいわけではないので、それは間違っていました。

私は何でも手に入れよう!私の元の計画には、マップを使って "アイテム"を繰り返して、そのエリアの救いに近づけるようにすれば余分なポイントが含まれていました。

+0

私は問題を見わかりません。 '{} 'を使用してdivの中に挿入すると何が問題になりますか? – Li357

+0

レンダリングメソッドの中に中かっこの中に入れようとしたすべてがエラーをスローしました。通常、ある種の「そのことは定義されていません」というエラーです。 – luskmonster

+0

'axios.get( 'https://api.stackexchange.com/2.2/search?order=desc&sort=activity&intitle=perl&site=stackoverflow') .then(function(response){ console.log(response.data) ; })catch(function(e){console.log(e)}) 'これの出力は何ですか? – kurumkan

答えて

1
import React, { Component } from "react"; 
import axios from "axios"; 

const URL = "https://api.stackexchange.com/2.2/search?order=desc&sort=activity&intitle=perl&site=stackoverflow"; 

export default class App extends Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     items: [] 
    } 
    } 

    componentDidMount() { 
    var _this = this; 
    axios.get(URL) 
    .then(function(res){ 
     _this.setState({ 
     items: res.data.items 
     }); 
    }) 
    .catch(function(e) { 
     console.log("ERROR ", e); 
    }) 
    } 

    render() { 
    const renderItems = this.state.items.map(function(item, i) { 
     return <li key={i}>{item.title}</li> 
    }); 

    return (
     <ul className="App"> 
     {renderItems} 
     </ul> 
    ); 
    } 
} 
+0

Brilliant!私は今晩とても勉強しました。 – luskmonster

+0

あなたの問題が解決した場合 - 解決策として役立つ答えにタグを付けるのが良いでしょう – kurumkan

+0

両方の解決策は未解決でした。これが私が使い終わったものです。ありがとう! – luskmonster

2

これは、Reactのコンポーネントの状態とライフサイクルを通じて実行できます。ここでは、この程度

読む:React State/Lifecycle

あなたは、コンポーネントのcomponentDidMount機能でFETCH呼び出し、コールバックは表示の状態を設定しているを配置することができます。

あなたが取得を使用した場合、コンポーネントは次のようになります。

class App extends Component { 
constructor(props) { 
    super(props); 
    this.state = { 
    data: false 
    }; 
    this.receiveData = this.receiveData.bind(this); 
} 
componentDidMount() { 
    var _self = this; 
    fetch('https://api.stackexchange.com/2.2/search?order=desc&sort=activity&intitle=perl&site=stackoverflow') 
    .then(function(res) { 
    return res.json(); 
    }).then(function(json) { 
    console.log(json); 
    _self.receiveData(json); 
    }); 
} 
receiveData(data) { 
    this.setState({data}); 
} 
render() { 
    return <div>{this.state.data}</div> 
} 
} 
+1

これは間違いなく私が行こうとしていた場所のようですが、これを実行しようとすると、コンソールで以下のエラーが表示されます。 'エラー:オブジェクトがリアクションの子として有効ではありません(見つかったもの:キー{items、has_more、quota_max、quota_remaining}のオブジェクト)。子コレクションをレンダリングする場合は、代わりに配列を使用するか、ReactアドオンのcreateFragment(オブジェクト)を使用してオブジェクトをラップします。 'App'のレンダリングメソッドを確認してください。 ' – luskmonster

+0

ああ、ええ、申し訳ありません。オブジェクトは反応要素に直接レンダリングできません。データを見るだけなら、 '' ''

JSON.stringify(this.state.data)
'' 'を出力用の文字列として出力することができます。 –

+0

私は何かを見ることができます! – luskmonster

関連する問題