Вызывает ли сеттер useState хук внутри, если оператор подразумевает BREAKING RULES OF HOOKS? - PullRequest
1 голос
/ 01 ноября 2019

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

ли вызов хука означает просто вызов useState напримерconst [state, useState] = useState(0)?

А как насчет вызова сеттера в условных выражениях?

Этот код нарушает правила хуков?

const [oneHook, setOneHook] = useState(0)
const [anotherHook, setAnotherHook] = useState(false)

if (something) {
   setOneHook(1)
   setAnotherHook(true)
} else {
     setOneHook(0);
     setAnotherHook(false)
}

Спасибо!

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

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

Я хочу сразу указать на это состояние настройки в телекомпонент не имеет особого смысла. Когда компонент монтируется, он начинает рендеринг с начальными значениями из состояния, но затем, прежде чем он может закончить рендеринг, состояние уже изменилось, и он должен начать заново. Но, по-видимому, это всего лишь артефакт примера, и в вашем реальном коде if будет находиться внутри useEffect или в каком-либо другом практическом месте кода.

0 голосов
/ 01 ноября 2019

Реагирует на состояние документов: не вызывайте хуки внутри циклов, условий или вложенных функций.

Хорошо, в следующем коде показан пример для вышеприведенного оператора. У меня была такая же проблема, когда мне нужно было установить состояние внутри цикла, например:

const [someArray, setArray] = useState([]);

someValue.forEach((value, index) => {
     setArray([...someArray, value]) //this should be avoided
    });

Выше всего этого я добился следующим образом

var temp = [];
var counter = 0;
someValue.forEach((value, index) => {
    temp.push(value);
    counter++;
     if (counter === someValue.length) {
          setArray(temp)
       }
    });

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

Этот код нарушает правила хуков

Нет Ваш код выглядит нормально, так как вы устанавливаете состояние только на основе условия только один раз, когда компонент отображает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...