Каков синтаксис для событий щелчка в перехватах реакции для передачи аргументов

#javascript #reactjs #react-hooks

#javascript #reactjs #реагирующие перехватчики

Вопрос:

Это всегда отлично работало для меня в компонентах класса React:

 let myValue: string = "Hello World";
<Button onClick={this.handleClick.bind(this, myValue)}></Button>
  

Я нашел этот синтаксис в документации React Hooks, и он мне нравится, но он не всегда возвращает значение:

 <Button onClick={handleClick} value={myValue}></Button>
  

Этот синтаксис работает, но его сложно ввести и он выглядит беспорядочно:

 <Button onClick={() => handleClick(myValue)}></Button>
  

Это еще один способ, который работает с перехватами, но мне кажется взломанным.

   <Button onClick={handleClick.bind(null, myValue)}></Button>
  

Меня смущает слишком много вариантов. Разве нет какого-нибудь наилучшего практического способа сделать это?

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

1. 1. лямбда-выражение в функции события не рекомендуется. 2. откуда myValue берется то, что вы хотите передать как параметр функции? если это из state way, вы хотите использовать его в качестве параметра?

2. В вопросе отсутствует контекст, в нем не упоминается, откуда берется myValue.

3. @estus — Я добавил некоторый код, чтобы уточнить, откуда берется myValue.

4. @Lambert Я вижу, я обновил ответ, чтобы охватить это.

Ответ №1:

Это идеально подходящий способ сделать это:

 <Button onClick={() => handleClick(myValue)}></Button>
  

Единственным недостатком является то, что onClick prop имеет новое значение при каждом рендеринге и запускает повторный рендеринг дочернего компонента — даже если он чистый. Это может вызвать или не вызвать проблемы с производительностью в зависимости от конкретного компонента; это будет проблемой, если существует много Button экземпляров или их повторный рендеринг обходится дорого.

Если значение является статическим, обратный вызов может быть определен как постоянная функция вне компонента:

 // outside function component
const myValue = "Hello World";
const myHandleClick = () => handleClick(myValue);
...
// inside function component
<Button onClick={myHandleClick}></Button>
  

Если значение является динамическим и доступно только внутри компонента, функция может быть определена внутри компонента и сохранена в памяти с помощью useMemo или useCallback перехвата (как уже упоминалось в другом ответе):

 // inside function component
const myHandleClick = useCallback(() => handleClick(myValue), [myValue]);
...
<Button onClick={myHandleClick}></Button>
  

Ответ №2:

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

Если вам нужно передать аргументы функции, вы все равно можете использовать свою первую версию в компонентах функций, но поскольку this она не используется, вы можете просто установить ее на null .

 <Button onClick={handleClick.bind(null, myValue)}></Button>
  

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

1. Это то, как вы это делаете в компоненте hooks, и это то, что вы рекомендуете?

2. Если мне нужно создать новую функцию для передачи какого-либо аргумента, который я лично использую () => handleClick(myValue) , но различия между двумя подходами незначительны. Это в первую очередь дело вкуса.

3. @Thule — Но что это за разговор от Амира о том, что «лямбда-выражение в функции события не рекомендуется», разве это не ваш личный выбор?

4. @Lambert Я не согласен с «лямбда-выражением в функции события не рекомендуется». Я не понимаю, почему это должно быть так.

5. это более простой и приятный подход