Прокрутите состояние и создайте несколько компонентов

Я пытаюсь отобразить координаты местоположения (транспортных средств) на карте с данными, которые я получаю каждые 3 секунды. Каждый раз, когда я получаю данные (массив объектов с атрибутами «Долгота» и «Широта»), состояние будет обновляться, и я хочу обновить «маркеры» на карте, чтобы отразить последние позиции транспортных средств.

Я знаю, что получаю данные, но маркеры не отображаются. Что-то не так с тем, как я зацикливаюсь?

class Mapbox extends Component {
  constructor(props){
    super(props)
    this.state = {
      active_vehicles: {},
    };
  }

  componentDidMount() {
    this.interval = setInterval(() => this.fetchData(), 3000);
  }

  componentWillUnmount() {
    clearInterval(this.interval);
  }


  fetchData = async () => {
    let url = `${request_url}`
    const response = await fetch(url, {
      method: "GET",
      headers: {
        "Accept": "application/json",
      }
    });
    const body = await response.json()
    this.setState({ active_vehicles: body })
  }

  createMarkers = () => {
    let markers = []

    if(this.state.active_vehicles){
      for (let i = 0; i < this.state.active_vehicles.length; i++) {
        markers.push(
        <Marker latitude={this.state.active_vehicles[i]["Latitude"]} longitude={this.state.active_vehicles[i]["Longitude"]}>
          <div>x</div>
        </Marker>
        )
      }
      return markers
    }
  }

  render() {
    return (
      <ReactMapGL
        // mapbox API access token
        mapboxApiAccessToken={MAPBOX_TOKEN}
        mapStyle="mapbox://styles/mapbox/dark-v9"
        {...this.state.viewport}
        onViewportChange={(viewport) => this.setState({viewport})}>

        <div>
          {this.createMarkers()}
        </div>

      </ReactMapGL>
    );
  }
}

person jj008    schedule 03.11.2018    source источник
comment
Я думаю, вы имели в виду this.state.active_vehicles вместо this.active_vehicles в своей функции createMarkers (). Также this.state.active_vehicles следует объявить как массив [] вместо объекта {} в конструкторе вашего компонента.   -  person Rico Chen    schedule 04.11.2018
comment
createMarkers возвращает массив значений, которые вы ожидаете увидеть?   -  person Tom Coughlin    schedule 04.11.2018
comment
Спасибо @RicoChen за исправление моих ошибок. Теперь маркеры отображаются, но я получаю сообщение об ошибке Each child in an array or iterator should have a unique "key" prop. Как я могу этого не допустить?   -  person jj008    schedule 04.11.2018
comment
Легко, просто добавьте этот атрибут с каким-нибудь уникальным значением, то есть <Marker key={i} ... . Вы можете прочитать reactjs.org/docs/lists-and-keys.html по причине этой конкретной ошибки.   -  person Rico Chen    schedule 04.11.2018
comment
@RicoChen Спасибо! Пожалуйста, отправьте свой ответ, и я его приму.   -  person jj008    schedule 04.11.2018


Ответы (1)


  1. Исправьте this.active_vehicles на this.state.active_vehicles (OP исправил после того, как я разместил свой комментарий)
  2. Добавьте атрибут key в компонент Marker внутри цикла for: <Maker key={i} ...
person Rico Chen    schedule 03.11.2018