【问题标题】:Run an AJAX call on a click event - using React.js在点击事件上运行 AJAX 调用 - 使用 React.js
【发布时间】:2015-10-26 18:50:51
【问题描述】:

我正在创建一个网络应用程序,该应用程序将对 OpenWeather API 进行 AJAX 调用以获取城市的天气数据 - 基于用户单击的城市。

我在前端使用 React,在后端使用 Node.js/Express,但在实现如何根据用户点击进行 API 调用的正确设置时遇到了麻烦。

如何重构我的代码以使其基于点击?

这是我目前所拥有的(JSBIN:http://bit.ly/1WedsL2)——目前被硬编码为“伦敦”:

 var data = [
    {name: "London"},
    {name: "Tokyo"},
    {name: "NYC"}
];

var MusicBox = React.createClass({
    render: function() {
        return (
            <div className="musicBox">
                <h1>This is the music box</h1>
                <CityList data={this.props.data} />
            </div>
        );
    }
});

var CityList = React.createClass({
    getInitialState: function() {
        return {data: []};
    },
    componentDidMount: function() {
        $.ajax({
            url: 'http://api.openweathermap.org/data/2.5/weather?q=London,uk&appid=bd82977b86bf27fb59a04b61b657fb6f',
            method: 'GET',
            success: function(result) {
                this.setState({data: result});
            }.bind(this)
        });
    },
    render: function() {
        var cityNodes = this.state.data.map(function(city) {
            return (
                <City info={city} />
            );
        });
        return (
            <div className="cityList">
                {cityNodes}
            </div>
        );
    }
});

var City = React.createClass({
    render: function() {
        return (
            <div className="city">
                <h2 className="cityName">
                    {this.props.info.name}
                </h2>
                {this.props.children}
            </div>
        );
    }
});

var CityInfo = React.createClass({
    getInitialState: function() {
        return {data: {}};
    },
    componentDidMount: function() {
        $.ajax({
            url: 'http://api.openweathermap.org/data/2.5/weather?q=London,uk&appid=bd82977b86bf27fb59a04b61b657fb6f',
            method: 'GET',
            success: function(result) {
                this.setState({data: result});
            }.bind(this)
        });
    },

    render: function() {
        return (
            <div>
                <h3>{this.state.data.name}</h3>
            </div>
        );
    }
});


ReactDOM.render(
    <MusicBox data={data} />,
    document.getElementById('content')
);

【问题讨论】:

  • 你在哪里做点击检查?

标签: javascript jquery ajax reactjs


【解决方案1】:

您想要做的是有一个用户可以点击的按钮。这将用于您的 ajax 请求,而不是在 componentDidMount 中。

在你的渲染中添加一个按钮

<button onClick={this.loadCityInfo} data-city={this.props.info.name}>{this.props.info.name}</button>

你的函数应该是这样的

loadCityInfo: function(e){
    var city = $(e.currentTarget).data('city');
    // now make your ajax request with the city's name passed to pull out the correct data
}

【讨论】:

  • 感谢 John - 我重构了我的代码,为我的 City Info 组件中的每个城市添加了按钮,正如您所提到的。截至目前 - 我没有更多错误,但是我的页面没有呈现城市名称,也没有进行 API 调用......我错过了其他东西吗? bit.ly/1PQcTHk
  • @YNinNY 所以我看到的第一件事是你没有在任何地方使用 CityInfo ......而且你的其他 jsbin 也没有加载任何东西。你确定你设置正确吗?
  • @YNinNY 查看您的 jsbin,您有一些语法错误。要我给你看吗?
  • 我刚刚开始工作 - 按钮 + API 调用!!就像你提到的,我有一个额外的组件,我没有使用 (City),所以我删除了它并用 City Info 替换它。感谢您帮助我走上正轨:)
  • @YNinNY 确定。您还有其他一些问题,例如 data.map 需要为 this.props.data.map 并且您在另一部分使用 day 而不是 name 导致它无法呈现:) 很高兴我能提供帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 2013-07-26
相关资源
最近更新 更多