Задать вопрос
@glebvvs

Почему события React работают только через стрелочные функции?

Не могу понять вероятно простую вещь. Почему когда я свойству changeStylesForCaption присваиваю стрелочную функцию, то событие onClick заголовка H1 срабатывает.

Но если вместо стрелочной функции использую анонимную или же свойство changeStylesForCaption делаю методом класса, то вылетает такая ошибка:
Cannot read property 'setState' of undefined


В чем магия этих стрелочных функций? Или это какая-то мне непонятная особенность JSX?

import React, { Component } from 'react';

class MainPage extends Component {

  changeStylesForCaption = () => {
    this.setState({
      color: 'black'
    });
  }

  constructor(props) {
    super(props);
    this.state = {
      color: 'red'
    };
  }  

	render() {
		return (
			<h1 onClick={this.changeStylesForCaption} style={{ color: this.state.color }}>gleb</h1>
		);
	}

}

export default MainPage;
  • Вопрос задан
  • 2438 просмотров
Подписаться 2 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    React-разработчик
    3 месяца
    Далее
  • ProductStar
    React: отточите навыки интерфейсной разработки
    6 недель
    Далее
  • Skillfactory
    Специализация Frontend-разработчик
    9 месяцев
    Далее
Решения вопроса 1
rockon404
@rockon404 Куратор тега React
Frontend Developer
Потому-что когда вы вызываете метод на объекте:
obj.method(); // вызываем метод
или:
this.method(); // вызываем метод
Ссылка на объект указанная перед точкой будет использована в качестве контекста и будет доступна в функции, через ключевое слово this.

Когда вы передаете метод без вызова:
onClick={obj.method} // не вызываем метод
или:
onClick={this.method} // не вызываем метод
Передается лишь метод, а контекст теряется.

Чтобы не терялся контекст при передаче метода в слушатель, можно использовать функцию bind. На вашем примере:
class MainPage extends Component {
  constructor(props) {
    super(props);
    this.state = {
      color: 'red'
    };
    this.changeStylesForCaption = this.changeStylesForCaption.bind(this); // привязываем контекст
  }  
  
  changeStylesForCaption() {
    this.setState({
      color: 'black'
    });
  }

  render() {
    return (
      <h1 onClick={this.changeStylesForCaption} style={{ color: this.state.color }}>gleb</h1>
    );
  }

}


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

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Нижний Новгород
от 50 000 до 90 000 ₽
IT ATLAS Москва
от 200 000 до 250 000 ₽
ITK academy Казань
от 50 000 до 90 000 ₽