Зачем нужно частичное применение в функциях-обработчиках событий?

Часто используется частичное применение в обработчиках событий, например

const handler = (id) => {
  const inner = (event) => { ... };
  return inner;
};

<button onClick={handler(id)}>Click</button>

Почему вообще нужна функция обертка handler(). Почему нельзя сразу выполнить все нужные действия обработчиком?

Аватар пользователя Ivan Gagarinov
Ivan Gagarinov
04 мая 2022

Это бывает нужно когда нам нужно передать какие-то дополнительные данные в обработчик. Представьте например таблицу и нужно написать обработчик клика по ячейкам в этой таблице. У каждой ячейки свои координаты, но при этом обработка для всех одинаковая, меняются только координаты. Если не делать частичное применение, то возникает вопрос: как передать координаты в обработчик?

const handler = (event) => {
  // какая-то логика
};

const result = cells.map((cell) => {
  // допустим у нас cell - это объект с координатами ячейки { column, row }
  <Cell onClick={handler} />
};

Конечно мы можем извратиться и передать нужные данные через атрибуты, и потом в евенте, через event.target получить доступ к этим данным.

const handler = (event) => {
  // какая-то логика
  const row = event.target.getAttribute('data-row');
};

const result = cells.map((cell) => {
  // допустим у нас cell - это объект с координатами ячейки { column, row }
  <Cell data-column={cell.column} data-row={cell.row} onClick={handler} />
};

Но это не всегда удобно, особенно если нужно передать что-то большее. Гораздо лучше тут использовать частичное применение:

const handler = (cell) => (event) => {
  // какая-то логика, теперь у нас есть объект cell с координатами
  const row = cell.getRow(); // это может быть даже объект с методами
};

const result = cells.map((cell) => {
  <Cell onClick={handler(cell)} />
};
9 0
Основы Frontend за 14 дней
  • 72 урока в онлайн-тренажере
  • 4 живых вебинара и масскодинг
  • Помощь наставника на весь период обучения

Есть что добавить? Зарегистрируйтесь

или войдите в аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Курсы по программированию в Хекслете

Backend-разработка

Разработка серверной части сайтов и веб-приложений

Frontend-разработка

Разработка внешнего интерфейса сайтов и веб-приложений и верстка

Создание сайтов

Разработка сайтов и веб-приложений на JS, Python, Java, PHP и Ruby on Rails

Тестирование

Ручное тестирование и автоматизированное тестирование на JS, Python, Java и PHP

Аналитика данных

Сбор, анализ и интерпретация данных на Python

Интенсивные курсы

Интенсивное обучение для продолжающих

DevOps

Автоматизация настройки локального окружения и серверов, развертывания и деплоя

Веб-разработка

Разработка, верстка и деплой сайтов и веб-приложений, трудоустройство для разработчиков

Математика для программистов

Обучение разделам математики, которые будут полезны при изучении программирования

JavaScript

Разработка сайтов и веб-приложений и автоматизированное тестирование на JS

Python

Веб-разработка, автоматическое тестирование и аналитика данных на Python

Java

Веб-разработка и автоматическое тестирование на Java

PHP

Веб-разработка и автоматическое тестирование на PHP

Ruby

Разработка сайтов и веб-приложений на Ruby on Rails

Go

Курсы по веб-разработке на языке Go

HTML

Современная верстка с помощью HTML и CSS

SQL

Проектирование базы данных, выполнение SQL-запросов и изучение реляционных СУБД

Git

Система управления версиями Git, регулярные выражения и основы командой строки