При использовании перехватчиков вы должны соблюдать определенные правила перехвата (на данный момент их всего два):
- Только перехватчики вызовов на верхнем уровне
- Звонки только из функций реагирования
Пытаясь передать ловушку обычной функции , вы нарушаете обе из них .И хотя эти правила являются скорее соглашениями, чем фактическими ограничениями и могут работать (, как другие в этой теме упоминали ) в некоторых случаях ( либо вы знаете, где и почему вы можете их использовать, либо вы случайно)удовлетворяющие их требованиям использования ) не рекомендуется использовать их таким образом.Например, через некоторое время вы можете забыть, что ваша функция содержит хук и фактически зависит от того, где и как она объявлена и используется, и переместить ее или поставить в условную, эффективно нарушающую логику вашего приложения.
Очень важно, чтобы ребята из React разработали специальный плагин ESlint , предназначенный для анализа вашего кода в фоновом режиме и точного предупреждения, когда вы близки к нарушению правил хуков.Это способ узнать наверняка.
Если вам все еще нужно извлечь некоторую зависимую от перехвата логику из вашего компонента в отдельную функцию, рассмотрите возможность создания настраиваемого перехвата .
НО!
В вашем примере кода вы не передаете функцию .React.useState
- это хук, но возвращаемое setX
- нет. Вы можете передать его так, как вам нравится, и вы на самом деле должны передать его своим обычным функциям или пользовательским хукам!