Laravel + React: this.state.tasks.map не является функцией

Я не могу перебирать элементы, которые я ввел в состояние из фиктивной конечной точки получения API:

Laravel + React: this.state.tasks.map не является функцией

Это весь мой компонент:

import React, {Component} from 'react';
import ReactDOM from 'react-dom';

class TaskList extends Component {
    constructor() {
        super();
        this.state = {
            tasks: [], // I set the empty state for now
        }
    }

    componentDidMount() {
        fetch('/api/tasks') // I fetch the data
            .then(response =>{
                return response.json();
            })
            .then(tasks=>{
                this.setState({tasks}); // I put the data into the state
            });
    }

    renderTasks() {
        return this.state.tasks.map(task => { // Here I want to iterate over the state and it fails
            return (
                <li>{task.title}</li>
            );
        })
    }

    render() {
        return(
            <ul>
                {this.renderTasks()}
            </ul>
        );
    }
}

export default TaskList;

if (document.getElementById('app')) {
    ReactDOM.render(<TaskList/>, document.getElementById('app'));
}

Функция map не видит данных. Почему?

Laravel + React: this.state.tasks.map не является функцией

app.js:57174 Uncaught TypeError: this.state.tasks.map is not a function

Я могу записать журнал console.info(this.state) в renderTasks(), и я получаю:

Laravel + React: this.state.tasks.map не является функцией

Вы забыли разобрать свой JSON? Мне кажется, он пытается отобразить строку?

Stephan Hovius 26.09.2018 13:07

Вот ваш ответ, вы не можете использовать map () для объекта

Stephan Hovius 26.09.2018 13:08

Я добавляю данные для работы с массивом return this.state.tasks.data.map(task => {, но это тоже не работает. Я слепой? Я что-то упускаю ...

Matt Komarnicki 26.09.2018 13:09

Да, вы должны пытаться составить карту, только если задачи не пусты. ;) Теперь он сломается в первый раз, потому что ключ данных не существует в пустом массиве задач

Stephan Hovius 26.09.2018 13:13

Я отредактировал свой ответ, поэтому теперь, если данные не определены, он будет отображать пустой массив в первый раз :)

Stephan Hovius 26.09.2018 13:18
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
796
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы пытаетесь отобразить объект, содержащий массив данных. Вы должны отобразить массив данных внутри объекта задач :)

  renderTasks() {
            const {tasks: {data}} = this.state;
            return ([] || data).map(task => { // Here I want to iterate over the state and it fails
                return (
                    <li>{task.title}</li>
                );
            })
        }
Ответ принят как подходящий

Функция карты может применяться только к массиву, а не к объекту, как показано на изображении tasks - это объект, а tasks.data - это массив. Вы должны установить состояние следующим образом:

.then(tasks=>{
          this.setState({tasks: tasks.data}); // putt array rather than object
  });

Этого также можно добиться (если не применять вышеуказанное решение):

this.state.tasks.data.map();

Это помогло. Я должен установить состояние из tasks.data. Тогда я могу составить карту через return this.state.tasks.map(task =>. Проклятые JS-фреймворки! Ненавижу их. Спасибо Умайр.

Matt Komarnicki 26.09.2018 13:15

Попробуйте следующее:

renderTasks() {
    if (this.state.tasks.hasOwnProperty('data')) {
        return this.state.tasks.data.map(task => { // Here I want to iterate over the state and it fails
            return (
                <li>{task.title}</li>
            );
        })
    } else {
        return (null);
    }
}

когда компонент выполняет рендеринг в первый раз, использование this.state.tasks.data.map завершится ошибкой, потому что данные не являются ключевыми в this.state.tasks, поскольку выборка запускается только после DidMount().

Это означает, что если this.state.tasks имеет ключ данных, затем сопоставить эти данные, иначе вернет значение null.

Другие вопросы по теме