【问题标题】:Displaying Multiple API Responses in React在 React 中显示多个 API 响应
【发布时间】:2019-12-31 17:14:17
【问题描述】:

我正在学习 React,我有一个通过 API 请求信息的解决方案,当有响应时它会设置状态,但是在呈现我的结果时它只在屏幕上显示最后一个响应,

即使有 4 个,请参见下图。

App.js

import React from 'react';

import Tiles from './components/Tiles'
import Form from './components/Form'
import WaterData from './components/WaterData'

class App extends React.Component{

  state = {
    station_name: undefined,
    water_value: undefined,
    dateTime: undefined
  }

  getData = async (e) => {

    e.preventDefault();

    const name = e.target.elements.name.value;

    const api_call = await fetch(`https://waterlevel.ie/geojson/latest/`)
    .then(response1 => {
      response1.json().then(data =>{
        Array.from(data.features).forEach(element => {
          if(element.properties['station.name'] === name){
            this.setState({
              station_name: element.properties['station.name'],
              water_value: element.properties['value'],
              dateTime: element.properties['datetime'],
            });
          }
      })
    });
  });
}


   render(){
    return(
      <div>
        <Tiles />
        <Form loadData={this.getData}/>
        <WaterData 
           station_name={this.state.station_name}
           water_value={this.state.water_value}
           dateTime={this.state.dateTime}
        />
      </div>
   )
  }
}
export default App;

WaterData.js

import React from 'react';
const Weather = (props) => {


console.log(props)

  return(
    <li>
      <p>Location {props.station_name}</p>
      <p>Value {props.water_value}</p>
      <p>Date Time: {props.dateTime}</p>
    </li>
  )
}
export default Weather;

有人可以向我解释为什么没有显示 4 个响应吗?

【问题讨论】:

  • 您是否尝试过在.forEach 循环中设置断点?我很想知道页面是否会随着每次迭代而变化。
  • 如果您将传入数据直接设置为状态,它会将循环中的最后一个数据设置为您的状态。您必须将数据指定为 state 中的数组,并在渲染时使用 map 方法对其进行循环。
  • 是的,每次迭代都会覆盖显示

标签: javascript reactjs api


【解决方案1】:

发生这种情况是因为您正在为数据的每个部分替换您所在州的值。

您可以使用filter 过滤掉数组中所需的元素。

然后将整个数组放入你的状态一次:

const api_call = await fetch(`https://waterlevel.ie/geojson/latest/`)
.then(response1 => {
  response1.json().then(data => {
    const features = Array.from(data.features)
      .filter(el => el.properties['station.name'] === name);
    this.setState({ features });
  })
});

但是现在,要渲染所有这些,您需要映射您的状态值:

   render(){
    return(
      <div>
        <Tiles />
        <Form loadData={this.getData}/>
        {this.state.features.map(feat => <WaterData 
           key={/* Find something unique*/}
           station_name={feat.properties['station.name']}
           water_value={feat.properties['value']}
           dateTime={feat.properties['datetime']}
        />)}
      </div>
    )
  }

如果它们彼此相关,则无需将所有值单独存储在您的状态中,不过这对您的子组件来说很好。

为了确保状态值始终是一个数组,请在类的开头给它一个空数组:

  state = {
    features: []
  }

【讨论】:

  • 感谢它几乎就在那里,它现在状态我的状态是未定义的?无法读取未定义的属性映射
  • 哦,对了,这会让你的组件崩溃,直到状态改变,看看我的编辑。您也可以将this.state.features &amp;&amp; this.state.features.map( 放在您的渲染中作为替代
猜你喜欢
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
  • 2017-02-18
  • 2021-02-19
  • 2017-05-21
  • 1970-01-01
  • 2020-07-30
相关资源
最近更新 更多