Как преобразовать определенную функцию стрелки обработчика событий и использовать .bind

#bind #arrow-functions

#привязать #стрелка-функции

Вопрос:

Я новичок в React и пытаюсь преобразовать эту функцию стрелки в функцию для привязки к этому. Я уже пробовал использовать это руководство ( https://medium.freecodecamp.org/this-is-why-we-need-to-bind-event-handlers-in-class-components-in-react-f7ea1a6f93eb ) но не удалось.

Любая помощь / объяснение были бы очень признательны, заранее спасибо!

 toggleComplete(index) {
      const todos = this.state.todos.slice();
      const todo = todos[index];
      todo.isCompleted = todo.isCompleted ? false : true;
      this.setState({ todos: todos });
    }
  

….

Полный код здесь:https://codeshare.io/2pw0q0

При вызове компонента я попытался изменить

 toggleComplete={ () => this.toggleComplete(index)}
  

в:

 toggleComplete={this.toggleComplete}
  

и добавить

 this.toggleComplete=this.toggleComplete.bind(this)
  

ниже функция constructor(). Но это не сработало.

Комментарии:

1. Есть успехи? Ожидаю вашего ответа.

Ответ №1:

В вашем конструкторе вы должны привязывать toggleComplete при установке состояния

 constructor(props) {
  super(props);
  this.state = {
    todos: [
      { description: 'Walk the cat', isCompleted: true, isDeleted: false },
      { description: 'Throw the dishes away', isCompleted: false, isDeleted: false },
      { description: 'Buy new dishes', isCompleted: false, isDeleted: false }
    ],
    newTodoDescription: '',
    this.toggleComplete: this.toggleComplete.bind(this)
  };
}
  

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

 toggleComplete(index) {
  const { todos } = this.state;
  const updatedTodos = todos.map((todo, idx) => {
    if (idx === index) {
       todo.isCompleted = !todo.isCompleted
    }
  }
  this.setState({ todos: updatedTodos });
}
  

В вашем методе рендеринга

 toggleComplete={this.toggleComplete}
index={index}
  

Похоже, вы передаете свою toggleComplete функцию вниз и фактически вызываете ее в ToDo компоненте, нет? Если это так, передайте свои index и toggleComplete в качестве реквизитов, а затем вы можете вызвать toggleComplete свой ToDo компонент. Обязательно используйте функцию стрелки, например onClick={() => this.props.toggleComplete(index)} , при ее настройке, иначе она будет вызываться каждый раз, когда ваш компонент будет повторно отображаться.