当前位置: 首页 > 知识库问答 >
问题:

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

齐建安
2023-03-14

给定开放天气地图当前天气数据API,我试图将当前天气数据拉入我的React.js应用程序使用ajax,提取给定城市的当前温度值,然后在我的组件中呈现该值。

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

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对象,这意味着数据已经绑定,可以在我的渲染函数中访问。然而,当我试图获取温度时,我期望它类似于this.state.data.main.temp,我得到了“数据未定义”的错误然后,我想能够设置这个值在我的城市对象在id: 5391997,为每12个城市。

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

更新^^这是我目前遇到的问题。

共有2个答案

邵沛
2023-03-14

data上设置state之前,。状态数据定义。您可以通过不渲染中的任何内容来修复此问题。状态数据直到它被定义,或者在getInitialState中设置data:{}

邵麒
2023-03-14

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

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,或者其他一些可以给你模型或商店概念的库?),返回的“数据”应该以某种方式转换/标准化为平面结构,然后作为道具传递给城市组件(并且只有有意义的/你关心的道具)。这样,City组件就可以不知道它的数据来自哪里。理论上,你应该能够用来自另一个来源、多个来源、虚拟数据等的一些数据来呈现一个城市。但是我不会去为你写所有的代码;)

 类似资料:
  • 我们是两个想在学校项目中使用开放天气图的学生。为了创建从应用程序接收到的关于天气的信息的模型,我们必须创建一个模型,就像Open weather map使用的模型一样。收到的json字符串如下所示: {“coord”:{“lon”:103.85,“lat”:1.29},“weather”:[{“id”:803,“main”:“Clouds”,“description”:“broken clouds

  • 本文向大家介绍ajax获取用户所在地天气的方法,包括了ajax获取用户所在地天气的方法的使用技巧和注意事项,需要的朋友参考一下 使用ajax获取用户所在地的天气,供大家参考,具体内容如下 1.要获取用户归属地的天气,首先得获取用户所在的市区,这里先获取用户的IP,通过IP获取IP的归属地,从而得到用户地址。 2.因为阿里云提供了通过城市名(city)或者城市编号(cityId) 即可获取天气的AP

  • 利用三种不同的解析方法(json,xml,plist)解析天气,另外,本demo还演示了定位获取当前位置天气、两种http方式(POST与GET)获取天气的功能。 [Code4App.com]

  • 抬手即可在天气手表表盘中查看当天的每小时预报以及明天的 3 小时预报和后天的 6 小时预报。提供的其他天气信息包括风速、风向、湿度和降水概率。 只能在天气手表表盘中查看天气信息。在时间视图中,向左或者向右滑动以找到天气信息。 要使用天气功能,您需要在手机上安装 Flow 应用程序并与手表配对。您还需要开启定位服务 (iOS) 或定位设置 (Android) 才能获取天气信息。 今日预报 预报位置

  • 抬手即可在天气手表表盘中查看当天的每小时预报以及明天的 3 小时预报和后天的 6 小时预报。提供的其他天气信息包括风速、风向、湿度和降水概率。 只能在天气手表表盘中查看天气信息。在时间视图中,向左或者向右滑动以找到天气信息。 要使用天气功能,您需要在手机上安装 Flow 应用程序并与手表配对。您还需要开启定位服务 (iOS) 或定位设置 (Android) 才能获取天气信息。 今日预报 预报位置

  • 在我的react应用程序中,我有这个app.js文件 我的login.js中有这个链接(还有一些与问题无关的东西) 因此,当用户单击该链接时,它将打开一个子页面,其域为我将如何相应地更新我的UI并打开一个类似于login.js的新文件,在这里我可以构造下一个视图