изменение state

123
19 июля 2019, 21:20

Реализую todolist. Вопрос с функциями line и bold. State изменять нельзя, для этого делаю его копию и работаю с ней. Вопрос: Почему данные функции нормально отрабатывают на элементах массива task, но не отрабатывают (ошибка Cannot read property) после добавления новых элементов после функции addTask

import React, { Component } from 'react';
import './App.css';
import Header from './components/Header'
import Buttons from './components/Buttons'
import TaskList from './components/TaskList'
class App extends Component {
  idTask = 8;
  state = {
    task : [
            {"name" : "Create app react" , "done" : 'false' , "id" : 0 , "imports" : 'false'},
            {"name" : "Create todo lost" , "done" : 'false' , "id" : 1 , "imports" : 'false'}
    ]
  }
  addTask = (text) => {
    const newTask = {
      name : text,
      done : false,
      id : this.idTask++,
      import : false
    }
    this.setState(({task}) => {
      const newArray = [
        ...task,
        newTask
      ]
      return {
        task : newArray
      }
    });
  }
  delTask = (id) => {
    console.log('id',id)
    this.setState(({task}) => {
      const newTask = task.filter(el => el.id !== id);
      return {
        task : newTask
      }
    } )
  }
  line = (id) => {
    console.log('line',id);
    this.setState(({task}) => {
      const newTask = task;
      newTask[id].done = !newTask[id].done
    return {
        task: newTask
    }
    } )
  }
  bold = (id) => {
    console.log('bold',id);
            this.setState( ({task}) => {
              const newTask = [...task];
              newTask[id].imports = !newTask[id].imports
            return {
                task: newTask
            }
        })
  }
  render() {
    return (
      <div>
        <Header />
        <Buttons addTask={this.addTask}/>
        <TaskList 
          task={this.state.task} 
          delTask={this.delTask}
          line={this.line}
          bold={this.bold}/>
      </div>
    );
  }
}
export default App;

и

import React,{Component} from 'react';
export default class Tasks extends Component {
    render() {
        const {delTask,bold,line} = this.props;
        const {id,name,done,imports} = this.props.item;
        return (
            <div>
                <span className={
                    (done) && (imports) ? 'underline import' :
                    (done) ? 'underline' :
                    (imports) ? 'import':
                    ''} 
                    onClick={() => line(id)}>{name}</span> 
                <button onClick={() => delTask(id)}>Delete</button>
                <button onClick={() => bold(id)}>Important</button>
            </div>
        )
    }
}
READ ALSO
Как с помощью свайпа добавлять/удалять классы?

Как с помощью свайпа добавлять/удалять классы?

Подскажите пожалуйста как на сенсорных экранах с помощью свайпа добавлять/удалять классы, например если двигаешь пальцем слева-на-право...

121
Как открыть/закрыть форму по клику?

Как открыть/закрыть форму по клику?

Начинающий верстальщик, только учусьУчебный проект

141
Эмулирование нажатия enter [дубликат]

Эмулирование нажатия enter [дубликат]

На данный вопрос уже ответили:

146