Laravel + React: this.state.tasks.map не является функцией - PullRequest
0 голосов
/ 26 сентября 2018

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

enter image description here

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

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 не видит данные.Почему?

enter image description here

app.js: 57174 Uncaught TypeError: this.state.tasks.map не является функцией

Я могу консольный журнал console.log(this.state) внутри renderTasks() и получаю:

enter image description here

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

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

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

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

this.state.tasks.data.map();
0 голосов
/ 26 сентября 2018

Попробуйте выполнить следующее:

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.

0 голосов
/ 26 сентября 2018

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

  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>
                );
            })
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...