Можно ли передать React.hook функции?

Могу ли я передать React.hooks функции и использовать ее там?

    const [X, setX] = useState('');

    function  Y(useX){
       useX('string');
    }
    Y(setX)
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
5
0
9 260
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Так

const App = () => {
    const [X, setX] = React.useState('x');

    function Y(useX){
       useX('string');
    }

    Y(React.useState);
    
    return <div>Hello {X}</div>
}

ReactDOM.render(<App/>, document.getElementById('app'));
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/16.8.3/umd/react.production.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.3/umd/react-dom.production.min.js"></script>
<div id = "app" />

было бы хорошо.

Но ниже код не будет работать

const App = () => {
    const [X, setX] = React.useState('x');

    function Y(useX){
       useX('string');
    }
    
    
    return <div>Hello {X} <button onClick = {() => {Y(React.useState)}}>Click</button></div>
}

ReactDOM.render(<App/>, document.getElementById('app'));
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/16.8.3/umd/react.production.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.3/umd/react-dom.production.min.js"></script>
<div id = "app" />

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

Поддержание порядка вызова хуков требуется, потому что React полагается на порядок вызова хуков, чтобы поддерживать очередь хуков, используемых в методе, и обрабатывать все дальнейшие обновления.

Technically if useX is a custom hook, it essentially a function that is invoked from within a component that contains hooks at the top level

Я немного запутался, мой код будет работать или нет? Можно ли использовать хук таким образом?ссылка на сайт

user10336550 01.03.2019 19:15

Да, ваш код будет работать, но только если вы не вызываете функцию Y условно

Shubham Khatri 01.03.2019 19:22

То есть функция не должна быть в операторе ЕСЛИ?

user10336550 01.03.2019 19:30

Функция или вызов функции

Shubham Khatri 01.03.2019 19:31

В этом случае передается не хук, а сеттер, ограничения хука не применимы к Y(setX). Он не обязательно должен находиться в области действия компонента:

function  Y(setX){
  setX('string');
}

const Comp = () => {
  const [X, setX] = useState('');
  Y(setX);
  ...
}

В зависимости от использования он может выиграть от мемоизации, например, если () => Y(setX) следует передать как опору:

const Comp = () => {
  const [X, setX] = useState('');
  const setY = useCallback(() => Y(setX), []);
  ...
}

Я так понимаю, React.hooks можно использовать так. ссылка на сайт И проблем не будет?

user10336550 01.03.2019 18:30

Проблем не будет. setD можно передать как обратный вызов, это упоминается в документации. Однако этот пример отличается от вопроса тем, что здесь нет функции Y, которую вы описали.

Estus Flask 01.03.2019 18:48
Ответ принят как подходящий

При использовании хуков необходимо соблюдать определенный правила хука (на данный момент их всего два):

  1. Вызывать хуки только на верхнем уровне
  2. Вызывать хуки только из функций React

Пытаясь передать хук обычной функции вы нарушаете их оба. И хотя эти правила являются скорее соглашениями, чем фактическими ограничениями, и могут работать (как упоминали другие в этой теме) в некоторых случаях (либо вы знаете, где и почему вы можете их использовать, либо вы случайно выполняете требования к их использованию) это не рекомендуется, чтобы использовать их таким образом. Например, через какое-то время вы можете забыть, что ваша функция содержит ловушку и на самом деле зависит от того, где и как она объявлена ​​и используется, и перемещаете ее или помещаете в условное выражение, фактически нарушая логику вашего приложения.

Это настолько важно, что ребята из React придумали специальный Плагин ESlint, который предназначен для анализа вашего кода в фоновом режиме и точно предупреждает вас, когда вы близки к нарушению правил ловушки. Это способ узнать наверняка.

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

НО!

В вашем примере кода вы не проходят крючок выполняете функцию. React.useState — это крючок, а setX, который он возвращает, — нет. Вы можете пройти это вокруг, как вам нравится, и вы на самом деле предназначены для его прохождения к своим обычным функциям или кастомным хукам!

у меня есть код, где я использовал хуки, поэтому мой код стал немного большим, можно ли разделить код таким образом. Будет ли это правильно с точки зрения программирования?

user10336550 02.03.2019 17:55

Да, разделение вашего кода на самом деле является лучшей практикой, это и есть функциональное программирование.

jayarjo 02.03.2019 18:01

Другие вопросы по теме