В чем проблема при использовании кастомного хука в React?

Как организовать вызов хука `useHint` в onClick без ошибки Invalid hook call и при этом не нарушать правила использования React Hooks?
  • 15 мая 2024 г. 11:21
Ответы на вопрос 2
Проблема при использовании кастомного хука в React заключается в том, что если хук не используется внутри функционального компонента или другого хука, возникает ошибка "Invalid hook call". 

Для вызова хука `useHint` в onClick без ошибки и при этом соблюдения правил React Hooks, можно создать обертку, которая будет вызывать хук внутри функционального компонента. 

Пример:

```jsx
import React from 'react';
import useHint from './useHint';

const Component = () => {
  const hint = useHint();

  const handleClick = () => {
    hint.showHint();
  }

  return (
    <button onClick={handleClick}>Show Hint</button>
  );
}

export default Component;
```

В данном примере, хук `useHint` используется внутри функционального компонента `Component`, что позволяет избежать ошибки "Invalid hook call" и соблюдать правила использования React Hooks.
Нельзя просто так взять и вызвать хук в обработчике события. Да, здесь он как бы "внутри" Item, но это обман зрения ) 

вот так попробуй:
const useHint = (hintTime?: number): VoidFunction => {
  const dispatch = useAppDispatch();

  return () => {
    dispatch({ type: setHintState.type, payload: { state: true } })
    setTimeout(() => {
      dispatch({ type: setHintState.type, payload: { state: false } })
    }, hintTime && 300);
  };
};

...

const Item: FC = () => {
  const runHint = useHint(500);

  return (
    <>
        <CopyButton
          className='contacts-group-item-field__btn'
          onClick={() => {
            runHint(500);
            navigator.clipboard.writeText('test')
          }}
        />
    </>
  )
}
Похожие вопросы