Перехватчики React добавляют нежелательное значение с помощью eslint-plugin-react-hooks @ next

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

useEffect(
 () => {
   props.getClientSummaryAction();
  },[]
);

Когда я иду сохранить файл, линтер делает это.

useEffect(
  () => {
    props.getClientSummaryAction();
 }, [props] 
);

Что, очевидно, отправляет мой компонент в бесконечный цикл, поскольку getClientSummaryAction извлекает некоторые данные, которые обновляют реквизиты.

Я использовал такую ​​деконструкцию, и линтер обновляет массив.

  const { getClientSummaryAction } = props;

  useEffect(
    () => {
      getClientSummaryAction();
    },
    [getClientSummaryAction]
  );

Что меня устраивает, но это не имеет смысла, потому что getClientSummaryAction, очевидно, никогда не будет обновляться, это функция.

Я просто хочу знать, почему линтер это делает и насколько это лучше всего.


person Vishal Sakaria    schedule 01.08.2019    source источник
comment
Это не проблема, не пытайтесь исправить это, это ожидаемое поведение, вам следует подумать еще раз. reactjs.org/docs/hooks-overview.html   -  person Adolfo Onrubia    schedule 01.08.2019
comment
Поскольку линтер видит, что вы используете «зависимость» в обратном вызове эффекта.   -  person Chris    schedule 01.08.2019
comment
@AdolfoOnrubia, как я вижу, [getClientSummaryAction] указывает, что если getClientSummaryAction изменения запускают эффект снова. Но когда getClientSummaryAction изменится?   -  person Vishal Sakaria    schedule 01.08.2019
comment
когда он получен, в этом случае поведение должно быть как ComponentDidMount, не так ли?   -  person Adolfo Onrubia    schedule 01.08.2019
comment
stackoverflow.com/questions/57097390 /   -  person G.aziz    schedule 01.08.2019
comment
Да, я вижу, что тоже могу использовать useDispatch, спасибо   -  person Vishal Sakaria    schedule 01.08.2019
comment
это подходит для меня   -  person G.aziz    schedule 01.08.2019


Ответы (1)


Это не нежелательно. Вы точно знаете, что зависимость не изменится, но React может это знать. Правило довольно ясное:

Либо передайте массив, содержащий все зависимости, либо ничего не передавайте второму аргументу и позвольте React отслеживать изменения.

Второй аргумент useEffect - это сообщить React, что вы отвечаете за вызов ловушки. Поэтому, если вы не передадите зависимость, включенную в ваш эффект, eslint увидит в этом возможную утечку памяти и предупредит вас. НЕ отключайте правило, просто продолжайте передавать зависимость, как вы уже делаю. Может показаться излишним, но это к лучшему.

person Dupocas    schedule 01.08.2019
comment
Хорошо, круто, я просто почувствовал, что это излишне, но я очень хорошо вижу аналогию с ответственными. - person Vishal Sakaria; 01.08.2019
comment
Это немного неинтуитивно, но в конце концов вы понимаете суть - person Dupocas; 01.08.2019