我试图了解如何使用fetch从API获取数据并使用它来创建React组件。如果这是检索,存储和使用数据的正确方法,或者如果有其他方法我可能不知道(我在文档中读到有关状态和坐标的内容但我无法理解),我有点困惑在它周围。
JS
//Data
const url = 'https://api.tfl.gov.uk/BikePoint'; // API
fetch(url)
.then((resp) => resp.json()) // Transform the data into json
.then(function(data) {
// How can I make data accessible outside this function?
})
.catch(function(error) {
console.log(JSON.stringify(error));
});
//React
const List = ({items, each}) =>
<div className = "panel panel-default">
<div className = "panel-heading"><h2>Bike points</h2></div>
<div className = "panel-body">
<ul className = "list-group">{items.map((item, key) =>
<ListItem key = {key} item = {each(item)} number={item.commonName}/>)}</ul>
</div>
</div>
const ListItem = ({item, arrival, number}) =>
<li className = "list-group-item">{number}</li>
//How can access the data here?
ReactDOM.render(<List items={data} each={ListItem} />, document.querySelector('#main'))
如果你能指出我可以帮助我理解这个概念的任何资源,我将不胜感激。提前谢谢。
答案 0 :(得分:1)
在你的示例代码中,你没有返回'resp.json()',resp.json()将返回一个promise,你需要返回它,如果它成功解析,那么你的下一个'data' .then()将填充API响应中的对象。然后,您可能希望在组件状态中设置响应数据以执行某些操作。
我用'create-react-app'创建了一个简单的反应应用来证明这一点:
import React, { Component } from 'react'; //import 'React' default export, and { Component } non-default export from react
import fetch from 'isomorphic-fetch'; // isomorphic-fetch is used for both server side and client side 'fetch' (see https://github.com/matthew-andrews/isomorphic-fetch)
// App.css was a hangover from the create-react-app, it's not really needed for this basic example
const url = 'https://api.tfl.gov.uk/BikePoint'; // API
class App extends Component { // This is the same as 'extends 'React.Component'
constructor(props) {
super(props);
this.state = {
fetchedData: null // stores the result of the fetch response body converted to a javascript object
};
}
fetchIt = () => {
console.log('fetching it');
fetch(url, { mode: 'cors' }) // Make sure fetch is cross-origin, it's not by default (see https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS) since the target URL of the API is a different 'origin' to our react app
.then((resp) => {
console.log(resp);
return resp.json(); })
.then((data) => { // data input parameter is the result of the resolved resp.json() Promise (see https://developer.mozilla.org/en-US/docs/Web/API/Body/json)
console.log(data);
this.setState({ fetchedData: data }); // setState sets the component state with the data from the API response
})
.catch(function(error) {
console.log(JSON.stringify(error));
});
}
render() {
if(!this.state.fetchedData){ // only do the fetch if there is no fetchedData already (BTW this will run many times if the API is unavailable, or 'fetchIt() encounters an error)
this.fetchIt();
}
return (
<div>
{
this.state.fetchedData ? `fetched ${this.state.fetchedData.length} entries` : 'no data' // This is a 'ternary' expression, a simple 'if->else'
/* equivalent to:
if(this.state.fetchedData) {
return `fetched ${this.state.fetchedData.length} entries`; // this is 'javascript string interpolation'
} else {
return 'no data';
}
*
* */
}
</div>
);
}
}
export default App; // Export our component to be used by other react higher order components (parents), in this case, it's imported in 'index.js', data is only fetched when the component renders.
在这里工作github repo:https://github.com/finbarrobrien/fetchy/blob/master/src/App.js