gpt4 book ai didi

javascript - 使用 Ajax 在 React 中打开天气数据

转载 作者:行者123 更新时间:2023-11-29 19:21:21 24 4
gpt4 key购买 nike

鉴于 Open Weather Map current weather data API ,我正在尝试使用 ajax 将当前天气数据拉入我的 React.js 应用程序,提取给定城市的当前温度值,然后在我的组件中呈现该值。

我正在使用的测试 JSON 数据位于以下网址: http://api.openweathermap.org/data/2.5/weather?id=5391997&units=imperial

var CityGrid = React.createClass({
componentDidMount: function() {
$.ajax({
url: 'http://api.openweathermap.org/data/2.5/weather?id=5391997',
// ^^ this should get a variable where id=5391997 is set
dataType: 'json',
success: function(data) {
this.setState({temp: data.main.temp});
}.bind(this),
error: function(xhr, status, err) {
console.error(this.props.url, status, err.toString());
}.bind(this)
});
},
getInitialState:function(){
return{
cities:[
{
name: "San Francisco",
id: 5391997,
temp: 50, // << this should receive value from ajax call
UTCOffset:-7,
address: 999 Nathan Lane,
phone: 555-5555
},
// 12 more city objects in this array, removed for brevity
]}
},
render: function() {
console.log(this.state.temp); // << this returns the right temp
// for San Francisco, because I hardcoded the value into the url
return(
<div className="city-grid">
{this.state.cities.map(function(city,i){
return(
<CityRow key={i} name={city.name} temp={city.temp}
UTCOffset={city.UTCOffset} address={city.address}
phone={city.phone}/>
);
})}
</div>
);
}
});

module.exports = CityGrid;

我的问题:

  1. 如何提取临时值?在我的渲染函数中,console.log 返回 JSON 对象,这意味着数据已经绑定(bind)并且可以在我的渲染函数中访问。但是,当我尝试获取温度(我希望它类似于 this.state.data.main.temp)时,我收到“数据未定义”的错误。然后,我希望能够为 12 个城市中的每一个城市在 id: 5391997 的城市对象中设置此值。

更新 ^^ 这已解决:@dkurbz 建议在我的 ajax 成功方法中将状态设置为临时,对我来说效果很好。

  1. 我还面临着如何为每个城市设置唯一的 url 的挑战。在我的 ajax 调用中,有 id=5391997,我想从城市对象中获取它并将我的 ajax url 更改为类似 'baseURl' + this.props.id + '&units=imperial '.我完全不知道该怎么做。

更新 ^^ 这是我目前卡住的地方。

最佳答案

这可能有一些错误,但我认为它应该让你非常接近。

var React = require("react");
var $ = require("jquery");

var City = React.createClass({
propTypes: {
id: React.PropTypes.string.isRequired,
units: React.PropTypes.string
},

getInitialState: function () {
return {
data: {},
fetching: false
};
},

getDefaultProps: function () {
return {
units: "imperial"
};
},

render: function () {
return (
<div class="city">
{this.state.fetching ? "Downloading data..." : this.state.data.main.temp}
</div>
);
},

componentWillMount: function () {
$.ajax({
url: "http://api.openweathermap.org/data/2.5/weather?id="+this.props.id+"&units="+this.props.units,
dataType: "json",
beforeSend: function () {
this.setState({fetching: true});
},
success: function (data) {
this.setState({data: data});
},
error: function (xhr, status, err) {
console.error(xhr, status, err.toString());
},
complete: function () {
this.setState({fetching: false});
},
context: this
});
}
});

var CityGrid = React.createClass({
propTypes: {
cityIds: React.PropTypes.array.isRequired
},

renderCity: function (cityId) {
return <City id={cityId} />;
},

render: function () {
return (
<div class="city-grid">
{this.props.cityIds.map(this.renderCity)}
</div>
);
}
});

话虽这么说……这不是正确的解决方案。 ajax 调用应该移到组件之外(你有没有研究过 Flux,或者其他一些会给你模型或商店概念的库?),然后返回的“数据”应该被转换/规范化为一个平面以某种方式构建,然后作为 props 传递给 City 组件(并且只有有意义/你关心的 props)。这样,City 组件就可以不知道其数据来自何处。从理论上讲,您应该能够使用来自另一个来源、多个来源、虚拟数据等的一些数据来渲染一个城市。但我不打算去为你编写所有这些代码;)

关于javascript - 使用 Ajax 在 React 中打开天气数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32898002/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com