在 React JS 中解析 JSON 值并映射到组件
我已经被困了好几天试图从 Fetch API JSON 结果中将数据提取到我的组件中。作为一个 React 初学者,这对我来说是一个挑战,任何帮助我学习和解决问题的方向都是值得赞赏的。我在下面复制了以下 JSON 响应,然后是我的组件设置。
我的想法是,我没有按顺序提取正确的 JSON 键值或类似的内容。
JSON:
{
"data": [
{
"virusIndex": 2,
"temperature": 26.5,
"humidity": 58.6,
"pm25": 3,
"tvoc": 234,
"co2": 435,
"co": 0,
"airPressure": 991,
"ozone": 8.7,
"no2": 19.4,
"timestamp": 1646109873
}
],
"usersettings": {
"temperature": "°C",
"temp": "c",
"humidity": "%",
"pm25": "µg/m^3",
"dust": "µg/m^3",
"tvoc": "ppb",
"voc": "ppb",
"co2": "ppm",
"co": "ppm",
"airPressure": "mbar",
"pressure": "mbar",
"ozone": "ppb",
"no2": "ppb",
"pm1": "µg/m^3",
"pm4": "µg/m^3",
"pm10": "µg/m^3",
"ch2o": "ppb",
"light": "lux",
"sound": "dBA"
},
"count": 104
}
应用程序.js:
class App extends Component {
constructor(props) {
super(props);
this.state = {
airData: []
}
}
componentDidMount(){
var myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer xxxxxxxxx");
var urlencoded = new URLSearchParams();
urlencoded.append("macAddress", "xxxxxxxx");
urlencoded.append("mode", "minute");
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: urlencoded,
redirect: 'follow'
};
fetch("MY_API_URL", requestOptions)
.then(response => response.json())
.then(res => {
console.log(res)
this.setState({
airData: res.data
})
});
}
render () {
return (
<div className="app">
<Header />
<div className="spacer"></div>
<OverallStatus />
{this.state.airData.map(res => {
<div>
<div className='qualityFactor'>
<h1><img src={iconHumidity} alt="Logo" className="iconSmall" />Humidity {res.humidity}%</h1>
<ProgressBar completed={res.humidity}
maxCompleted={100} className="statusBar" />
</div>
<div className='qualityFactor'>
<h1><img src={iconAirPressure} alt="Logo" className="iconSmall" />Air Pressure {e.AirPressure} hPa</h1>
<ProgressBar completed={e.AirPressure}
maxCompleted={1030} className="statusBar" />
</div>
<div className='qualityFactor'>
<h1><img src={iconCarbonDioxide} alt="Logo" className="iconSmall" />Carbon Dioxide {e.CO2} ppm</h1>
<ProgressBar completed={e.CO2}
maxCompleted={2000} className="statusBar" />
</div>
<div className='qualityFactor'>
<h1><img src={iconVOCs} alt="Logo" className="iconSmall" />Chemicals {e.TVOC} ppb</h1>
<ProgressBar completed={e.TVOC}
maxCompleted={1000} className="statusBar" />
</div>
<div className='qualityFactor'>
<h1><img src={iconParticulateMatter} alt="Logo" className="iconSmall" />Particles {e.PM25} ug/m3</h1>
<ProgressBar completed={e.PM25}
maxCompleted={100} className="statusBar" />
</div>
<div className='qualityFactor'>
<h1><img src={iconCarbonMonoxide} alt="Logo" className="iconSmall" />Carbon Monoxide {e.CO} ppm</h1>
<ProgressBar completed={e.CO}
maxCompleted={100} className="statusBar" />
</div>
<div className='qualityFactor'>
<h1><img src={iconNitrogenDioxide} alt="Logo" className="iconSmall" />Nitrogen Dioxide {e.NO2} ppb</h1>
<ProgressBar completed={e.NO2}
maxCompleted={200} className="statusBar" />
</div>
<div className='qualityFactor'>
<h1><img src={iconOzone} alt="Logo" className="iconSmall" />Ozone {e.Ozone} ppb</h1>
<ProgressBar completed={e.Ozone}
maxCompleted={100} className="statusBar" />
</div>
</div>
})}
</div>
)
}
}
export default App;
I have been stuck for days trying to pull data into my components from a Fetch API JSON result. As a React beginner, this has been a challenge for me and any direction to help me learn and resolve the issue is appreciated. I have the following JSON response copied below followed by my component setup.
My thoughts are that I am not pulling in the correct JSON key values in order or something along those lines.
JSON:
{
"data": [
{
"virusIndex": 2,
"temperature": 26.5,
"humidity": 58.6,
"pm25": 3,
"tvoc": 234,
"co2": 435,
"co": 0,
"airPressure": 991,
"ozone": 8.7,
"no2": 19.4,
"timestamp": 1646109873
}
],
"usersettings": {
"temperature": "°C",
"temp": "c",
"humidity": "%",
"pm25": "µg/m^3",
"dust": "µg/m^3",
"tvoc": "ppb",
"voc": "ppb",
"co2": "ppm",
"co": "ppm",
"airPressure": "mbar",
"pressure": "mbar",
"ozone": "ppb",
"no2": "ppb",
"pm1": "µg/m^3",
"pm4": "µg/m^3",
"pm10": "µg/m^3",
"ch2o": "ppb",
"light": "lux",
"sound": "dBA"
},
"count": 104
}
App.js:
class App extends Component {
constructor(props) {
super(props);
this.state = {
airData: []
}
}
componentDidMount(){
var myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer xxxxxxxxx");
var urlencoded = new URLSearchParams();
urlencoded.append("macAddress", "xxxxxxxx");
urlencoded.append("mode", "minute");
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: urlencoded,
redirect: 'follow'
};
fetch("MY_API_URL", requestOptions)
.then(response => response.json())
.then(res => {
console.log(res)
this.setState({
airData: res.data
})
});
}
render () {
return (
<div className="app">
<Header />
<div className="spacer"></div>
<OverallStatus />
{this.state.airData.map(res => {
<div>
<div className='qualityFactor'>
<h1><img src={iconHumidity} alt="Logo" className="iconSmall" />Humidity {res.humidity}%</h1>
<ProgressBar completed={res.humidity}
maxCompleted={100} className="statusBar" />
</div>
<div className='qualityFactor'>
<h1><img src={iconAirPressure} alt="Logo" className="iconSmall" />Air Pressure {e.AirPressure} hPa</h1>
<ProgressBar completed={e.AirPressure}
maxCompleted={1030} className="statusBar" />
</div>
<div className='qualityFactor'>
<h1><img src={iconCarbonDioxide} alt="Logo" className="iconSmall" />Carbon Dioxide {e.CO2} ppm</h1>
<ProgressBar completed={e.CO2}
maxCompleted={2000} className="statusBar" />
</div>
<div className='qualityFactor'>
<h1><img src={iconVOCs} alt="Logo" className="iconSmall" />Chemicals {e.TVOC} ppb</h1>
<ProgressBar completed={e.TVOC}
maxCompleted={1000} className="statusBar" />
</div>
<div className='qualityFactor'>
<h1><img src={iconParticulateMatter} alt="Logo" className="iconSmall" />Particles {e.PM25} ug/m3</h1>
<ProgressBar completed={e.PM25}
maxCompleted={100} className="statusBar" />
</div>
<div className='qualityFactor'>
<h1><img src={iconCarbonMonoxide} alt="Logo" className="iconSmall" />Carbon Monoxide {e.CO} ppm</h1>
<ProgressBar completed={e.CO}
maxCompleted={100} className="statusBar" />
</div>
<div className='qualityFactor'>
<h1><img src={iconNitrogenDioxide} alt="Logo" className="iconSmall" />Nitrogen Dioxide {e.NO2} ppb</h1>
<ProgressBar completed={e.NO2}
maxCompleted={200} className="statusBar" />
</div>
<div className='qualityFactor'>
<h1><img src={iconOzone} alt="Logo" className="iconSmall" />Ozone {e.Ozone} ppb</h1>
<ProgressBar completed={e.Ozone}
maxCompleted={100} className="statusBar" />
</div>
</div>
})}
</div>
)
}
}
export default App;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
Javascript 对象键区分大小写。因此,
e.CO2
与e.co2
不同。另外,您还没有声明变量“e”,但您正在使用它。它应该是“res”
您还错过了地图函数内的
return
语句。Javascript object keys are case sensitive. So
e.CO2
is different frome.co2
.Also you havent declared variable 'e' but you are using it. Its supposed to be 'res'
You also missed
return
statement inside map function.