React js:错误 TypeError - 无法读取未定义数组的属性
在 API 请求后将船队的实时数据传递到表中之前,我想尝试注入样本数据,实际上我对它们进行了硬编码。目标是:如果我可以读取样本数据,那么 API 几乎肯定会将数据显示到我正在寻找的所有船只的表中。
但是调试器提示
ErrorTypeError - 无法正确读取未定义变量的属性
,而
Console
提示:
Response { type: "opaque", url: "", redirected: false, status: 0, ok: false, statusText: "", headers: Headers, body: null, bodyUsed: false }
ErrorTypeError: 这是未定义的
,如果有用的话,我还会附上我的桌面屏幕截图:
下面是我使用的代码:
import React, { Component } from 'react';
import styled from 'styled-components';
import GoogleMapReact from 'google-map-react';
const resultArea = document.getElementById('result');
let out = '';
const fetchConfig = {
method: 'GET',
mode: 'no-cors'
};
const MapContainer = styled.div`
// some components
`;
class BoatMap extends Component {
constructor(props) {
super(props);
this.state = {
buttonEnabled: true
};
this.updateRequest = this.updateRequest.bind(this);
}
updateRequest() {
const url =
'http://data.aishub.net/ws.php?username=My_KEY&format=1&output=json&compress=3&latmin=12.11&latmax=48.95&lonmin=-124.97&lonmax=-58.95';
console.log(url);
fetch(url, fetchConfig)
.then(function(data) {
console.log(data);
return this.dummyData; // <-- Can't read this
})
.then(function(jsonObject) {
const boatData = JSON.parse(jsonObject);
for (boat in jsonObject) {
const boatInfo = [
// parsing data from the API after confirming with hardcoded dummyData
];
boatOut(boatInfo);
console.log(boatInfo);
}
resultArea.innerHTML = out;
})
.catch(function(e) {
console.log('Error' + e);
});
this.setState({
buttonEnabled: false
});
setTimeout(() => {
this.setState({ buttonEnabled: true });
});
}
dummyData = [
{
ERROR: false,
USERNAME: 'My_KEY',
FORMAT: 'HUMAN',
LATITUDE_MIN: 20.5,
LATITUDE_MAX: 30.8,
LONGITUDE_MIN: -15,
LONGITUDE_MAX: 18.6,
RECORDS: 14
},
[
{
MMSI: 566619000,
TIME: '2020-01-25 19:51:38 GMT',
LONGITUDE: -14.84344,
LATITUDE: 28.282,
COG: 15.7,
SOG: 11.3,
HEADING: 16,
ROT: 0,
NAVSTAT: 0,
IMO: 9529504,
NAME: 'NORD SUMMIT',
CALLSIGN: 'S6RW5',
TYPE: 70,
A: 174,
B: 26,
C: 20,
D: 12,
DRAUGHT: 12.1,
DEST: 'NO SAU',
ETA: '02-02 12:00'
},
{
MMSI: 236446000,
TIME: '2020-01-25 19:51:28 GMT',
LONGITUDE: -14.83202,
LATITUDE: 28.64639,
COG: 38,
SOG: 12.1,
HEADING: 38,
ROT: 3,
NAVSTAT: 0,
IMO: 9291561,
NAME: 'KEY BAY',
CALLSIGN: 'ZDIJ4',
TYPE: 83,
A: 82,
B: 18,
C: 1,
D: 19,
DRAUGHT: 6.1,
DEST: 'CASABLANCA',
ETA: '01-27 15:00'
}
]
];
render() {
return (
<div className="google-map">
<GoogleMapReact
bootstrapURLKeys={{ key: 'My_KEY' }}
center={{
lat: 42.4,
lng: -71.1
}}
zoom={11}
<button className="btn-next-request" onClick={() => this.updateRequest()}>
Time to Next API Request
</button>
</GoogleMapReact>
</div>
);
}
}
我目前所做的:
1) 我尝试直接在 dummyDaya 组件上解决问题,尝试手动解析它。但是 API 已经给出了我在
updateRequest()
函数中包含的模板文件作为答案。什么都没显示。
2) 我不确定为什么我无法读取两个容器的数据,因为我复制/粘贴了这两个数据的 API 答案。从技术上讲,应该可以毫无问题地注入。
3) 我现在正在尝试调查根据
官方文档
,
dummyData
在传递数据时不应携带(并且不知道是否应该擦除)请求的初始值的可能性。我指的是
dummyData
数组的以下部分:
dummyData = [
{
ERROR: false,
USERNAME: 'My_KEY',
FORMAT: 'HUMAN',
LATITUDE_MIN: 20.5,
LATITUDE_MAX: 30.8,
LONGITUDE_MIN: -15,
LONGITUDE_MAX: 18.6,
RECORDS: 14
},
[ …...
感谢您指出解决此问题的正确方向。
使用
arrow
函数访问
this
作为组件引用/实例。
function
有自己的 this,这会产生误导
fetch(url, fetchConfig)
.then((data) => {
console.log(data);
return this.dummyData; // <-- Can't read this
})
同样适用于此处代码中的所有此类函数
首先,如果您希望通过
fetch
返回响应,则需要调用
Body.json()
来返回
Response
流。
fetch(url, fetchConfig)
.then((data) => {
return data.json();
}).then((data) => {
console.log(data);
// do the rest here
});
接下来,如果您希望引用
this
,则需要使用箭头函数,
fetch(url, fetchConfig)
.then((data) => {
return this.dummyData;
}).then((data) => {
console.log(data);
// do the rest here
});
为 dummyData 创建状态。
constructor(props) {
super(props);
this.state = {
buttonEnabled: true,
dummyData : [], // Create state for dummyData
};
this.updateRequest = this.updateRequest.bind(this);
}
然后从您的 url 获取数据(我使用了
async await
)并将其设置为 dummyData。
const request = async () => {
const url = 'http://data.aishub.net/ws.php? username=My_KEY&format=1&output=json&compress=3&latmin=12.11&latmax=48.95&lonmin=-124.97&l onmax=-58.95';
const response = await fetch(url, fetchConfig);
const json = await response.json();
this.setState(dummyData : json);
}
request();