ReactJS ошибка при вызове setState

188
04 мая 2018, 12:06

У меня есть компонент на реакте, который описывает одно задание в Todo-приложении. Задание представляется элементом <li>, в котором есть текст и кнопка удаления в виде <span>. Если кликнуть по <li>, текст должен зачеркиваться. Если кликнуть по <span> с крестиком, запись удаляется.

import React from "react";
class TodoItem extends React.Component
{
    constructor(props)
    {
        super(props);
        this.state = { text: props.item, done: false };
    }
    render()
    {
        let style = this.state.done ? "done" : "";
        return (
            <li onClick={this.handleComplete} className={style}>
                {this.state.text}
                <span className="close" onClick={this.handleRemove}>{"\u00D7"}</span>
            </li>
        );
    }
    handleComplete()
    {
        this.setState({ done: true });
    }
    handleRemove()
    {
        alert("remove");
    }
};
export default TodoItem;

При вызове обработчика handleComplete() вываливается ошибка в окне браузера с указанием на строку, где обновляется состояние компонента. Из-за чего возникает эта ошибка?

Ошибка:

TypeError: this is undefined
handleComplete
src/TodoItem.js:24

Место, где используется компонент:

import React from "react";
import Todo from "./Todo";
import TodoItem from "./TodoItem";
const List = props => {
    return (
    <ul>
        {
            props.items.map((item, index) => <TodoItem item={item} />)
        }
    </ul>);
};
export default List;
Answer 1

handleComplete() теряет контекст. Нужно либо объявить метод как стрелочную функцию

handleComplete = () => {}

либо в конструкторе привязать контекст

this.handleComplete = this.handleComplete.bind(this)
READ ALSO
Как наследовать класс typescript от класса javascript?

Как наследовать класс typescript от класса javascript?

Не получается реализовать такое:

161
получить String Literal Types из Object в runtime

получить String Literal Types из Object в runtime

В проекте используются sass для стилизации и typescript для типизации

176
Смена id объекта JS

Смена id объекта JS

Есть два объекта input

169
Обновление данных chart.js

Обновление данных chart.js

Есть функция рисования графика использующая chartjs

185