大家好! 我的React应用程序中有一个小问题: 我正在尝试使用API获取天气警报。我的App.js文件如下所示:
import React, { Component } from 'react';
import './App.css';
import $ from 'jquery';
import Alerts from './Components/Alerts';
class App extends Component {
constructor(){
super();
this.state = {
alerts:[]
}
}
getAlerts(){
$.ajax({
url: 'https://api.weather.gov/alerts/active/zone/AKZ201',
dataType: 'json',
cache: false,
success: function(data){
this.setState({alerts: data});
}.bind(this),
error: function(xhr, status, err){
console.log(err);
}
});
}
componentDidMount(){
this.getAlerts();
}
render() {
return (
<div>
<Alerts alerts={this.state.alerts} />
</div>
);
}
}
export default App;
问题是这个ajax函数在API URL的末尾添加了一个额外的参数,并且由于这个额外的参数,API URL并没有返回正确的数据。
这是我在控制台中获得的内容:
jquery.js:9600 GET https://api.weather.gov/alerts/active/zone/AKZ201?_=1527798208757 400 ()
额外参数是?_ = 1527798208757 400()
我发现这个额外的参数导致了这个问题。 我有什么想法可以删除这个参数吗?
谢谢!
答案 0 :(得分:2)
这更像是一个jQuery问题然后是一个反应。如前所述,由于您的cache: false
代码,会添加额外的时间戳。它是一种在加载资源时缓存资源的常用方法,因为附加时间戳参数会强制浏览器获取最新资源。
另外,我不知道你在反应中使用jQuery的原因,但至少对于HTTP调用,你可能想要查看Fetch API,一个与现代兼容的本地浏览器api(没有要安装的软件包)浏览器。
以下是使用fetch&amp; amp;时的方法的更现代的示例ES2017
async getAlerts = () => {
const response = await fetch('https://api.weather.gov/alerts/active/zone/AKZ201');
const alerts = await response.json();
this.setState({
alerts,
});
}
这里有一些很酷的ES2017事情。首先,是async/await
的包含,它真正有助于编写易于阅读的异步代码。如果您希望方法/函数异步执行某些操作,请指定async
作为该函数/方法的前缀。
async function() {}
我们还使用此处的箭头函数getAlerts = () => {}
将getAlerts方法绑定到维护this
的相同上下文的函数。收益?如果您想在jsx语句中使用它,则不必.bind(this)
或担心this
实际引用的内容。
<button onClick={this.getAlerts}>Update Alerts</button>
接下来我们想要获取get请求的结果,并且因为它是对某个数据库的异步调用,所以我们在await
之前添加函数调用,以获得基础promise的结果。
const response = await somePromise() //in our case, its fetch(url)
可以使用另一个异步方法调用response.json()
获取响应正文。
const alerts = await response.json();
接下来,您注意到我们正在使用对象的名称作为对象键。说{alerts}
与{alerts: alerts}
相同,但是你写的代码更少,眼睛也更容易一些!
this.setState({
alerts,
});
如果您没有ES2017,(我假设您正在使用create-react-app,其中包括启用这些功能),这里是上述相同方法的es6版本:
getAlerts = () => {
fetch('https://api.weather.gov/alerts/active/zone/AKZ201')
.then((response) => response.json())
.then((alerts) => {
this.setState({
alerts,
});
});
}
答案 1 :(得分:1)
额外_=<timestamp>
参数附加到请求网址末尾的原因是您在cache: false
电话中指定的$.ajax
选项。这是确保您收到所请求资源的非浏览器缓存版本的方法之一。
答案 2 :(得分:0)
当您设置_={timestamp}
时,Jquery会附加cache: false
。
$.ajax({
url: 'https://api.weather.gov/alerts/active/zone/AKZ201',
dataType: 'json',
cache: true,
success: function(data){
console.log(JSON.stringify(data))
},
error: function(xhr, status, err){
console.log(err);
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>