Проблема с рендерингом списков в React

224
20 августа 2018, 15:50

Пытаюсь вытащить из API сервиса данные и вставить их в компонент.

Вот код:

class App extends Component {
  constructor() {
    super();
    this.state = {
      dataObj : {}
    }
  }
  componentDidMount() {
    fetch("https://api.topvisor.ru/v2/json/get/positions_2/history", {
      method: 'POST',
      headers: {
        'User-Id'       : '11111',
        'Authorization' : '5b10f6bf67f433e2fa0c',
        'Content-type'  : 'application/json'
      },
      body: JSON.stringify({
        'group_folder_id_depth' : 1,
        'project_id'            : 561448,
        'regions_indexes'       : [76],
        'fields'                : ['name','id','tags','target','group_name'],
        'type_range'            : 2,
        'date1'                 : '2018-06-25',
        'date2'                 : '2018-07-04',
        'count_dates'           : 31,
        'limit'                 : 100,
        'offset'                : 0,
        'show_headers'          : 1,
        'show_exists_dates'     : 1,
        'show_visitors'         : 1,
        'show_top_by_depth'     : 10,
      })
    })
    .then(response => {
      response.json();
     })
    .then(data => {
      let objcts = data.results.map((obj) => {
        return (
          <li key={obj.results}>
            {obj.results.keywords.name}
          </li>
        )
      })
      this.setState({dataObj: data});
      console.log('state' + this.state.dataObj);
    });
  }
  render() {
    return (
      <div className="App">
        <ul>
        </ul>
      </div>
    );
  }
}
export default App;

Ошибки:

TypeError: Cannot read property 'results' of undefined

Для кода:

import React, { Component } from 'react';
import './App.css';
class App extends Component {
  constructor() {
    super();
    this.state = {
      dataObj : {}
    }
  }
  componentDidMount() {
    fetch("https://api.topvisor.ru/v2/json/get/positions_2/history", {
      method: 'POST',
      headers: {
        'User-Id'       : '44583',
        'Authorization' : '5b80f6bf27f633e4fa0c',
        'Content-type'  : 'application/json'
      },
      body: JSON.stringify({
        'group_folder_id_depth' : 1,
        'project_id'            : 561448,
        'regions_indexes'       : [76],
        'fields'                : ['name','id','tags','target','group_name'],
        'type_range'            : 2,
        'date1'                 : '2018-06-25',
        'date2'                 : '2018-07-04',
        'count_dates'           : 31,
        'limit'                 : 100,
        'offset'                : 0,
        'show_headers'          : 1,
        'show_exists_dates'     : 1,
        'show_visitors'         : 1,
        'show_top_by_depth'     : 10,
      })
    })
    .then(response => {
      response.json();
     })
    .then(data => {
      let objcts = data.results.map((obj) => {
        return (
          <li key={obj.results}>
          </li>
        )
      })
      this.setState({dataObj: data});
      console.log('state' + this.state.dataObj);
    });
  }
  render() {
    return (
      <div className="App">
        <ul>
          {this.state.dataObj}
        </ul>
      </div>
    );
  }
}

Ошибки:

Objects are not valid as a React child (found: object with keys {}). If you meant to render a collection of children, use an array instead.
    in ul (at App.js:55)
    in div (at App.js:54)
    in App (at index.js:7)

Я мало чего соображаю в React, поэтому подскажите хотя бы ссылочки, где можно было бы подсмотреть. Готовое решение тоже хорошо)

Answer 1

Первое: у вас ошибка в синтаксисе

.then(response => {
  response.json();
 })

Это стрелочная функция и в вашем случае они ничего не возвращает

// либо так
.then(response => {
  return response.json();
})
// либо так
.then(response => response.json())

Второе: ну в общем, я не понимаю, зачем задавать конкретный вопрос про технологию, которую ты в принципе не понимаешь? Можно потратить один день на то что бы почитать про React и тогда второй ошибки не было бы.
React не умеет просто так выводить объекты: либо строка, либо компонент, либо null.
Поэтому как-то парсите ваше объект и выводите отдельными св-вами, либо пишите компонент, который принимает ваш dataObj и уже там делает с ним то, что нужно

render() {
  return (
    <div className="App">
      <ul>
        // если someProp строка, то вот так можно
        {this.state.dataObj.someProp}
      </ul>
    </div>
  );
}

Вот при обработке данных вы создаете массив, но потом не используете его

  let objcts = data.results.map((obj) => {
    return (
      <li key={obj.results}>
      </li>
    )
  })

Делайте тоже самое в рендере и выводите именно этот массив

render() {
  return (
    <div className="App">
      <ul>
        {data.results.map((obj) =>
           <li key={obj.id}>{obj.prop}</li>
        )}
      </ul>
    </div>
  );
}
READ ALSO
Помощь в поиске плагина для webpack3

Помощь в поиске плагина для webpack3

Нужна помощь в поиске плагина для webpack 3 который будет "пробегать" по указанной в опциях директории, содержащий svg-файлы и компилить файл формата...

210
Импорт внешних скриптов из бандла JavaScript

Импорт внешних скриптов из бандла JavaScript

Возможно ли импортирование внешних скриптов из уже скомпилированного бандла через webpack

199
export объекта из файла с чистым js в App.js react

export объекта из файла с чистым js в App.js react

Есть файл firstjs на чистом js, который возвращает объект, например, data

194