Эффект использования бесконечного цикла реакции, когда параметр по умолчанию содержит массив

#javascript #reactjs #jsx

Вопрос:

Со мной такого никогда не случалось, и я не знаю, почему это происходит.

У меня есть эти два компонента, которые создают бесконечный цикл в эффекте использования дочернего компонента:

 function Container(){
  return <div> <Description /> </div>
}

// If I remove "= []" part no infinite loop is created
function Description({list = []}){
  const [dict, setDict] = useState({})

  useEffect(() => {
      console.log('this is for the inifinite loop log')
      setDict({}) // also, If a remove this line no infinite loop is created
  }, [list]) 

  return <div>something...</div>
}
 

** ОТРЕДАКТИРОВАНО: этот код-просто упрощение моей проблемы **

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

Комментарии:

1. Проще всего было бы не отображать компонент в родительском компоненте, если list он пуст.

Ответ №1:

Когда состояние компонента функции React изменяется, функция вызывается снова. И когда состояние компонента функции изменяется, если массив зависимостей useEffect также изменяется, вызывается обратный useEffect вызов.

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

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

 const emptyArray = [];
// If I remove "= []" part no infinite loop is created
function Description({list = emptyArray}){
  const [dict, setDict] = useState({})

  useEffect(() => {
      console.log('this is for the inifinite loop log')
      setDict({}) // also, If a remove this line no infinite loop is created
  }, [list]) 

  return <div>something...</div>
}
 

Я не знаю, какова конечная цель, которую вы хотите, просто взглянув на приведенный выше пример кода. Я думаю, что ваш код создает параметр setDict путем обработки list из вашего родительского компонента. В общем, я думаю, что родитель Description отправляет в prop только значение массива или пустого массива list . Если это так, я думаю, что это лучший способ вызвать ошибку, когда массив не поступает без поддержки пустого массива, который используется по умолчанию list .

Ответ №2:

Это, скорее всего, связано с тем, что list массив не является одним и тем же объектом в памяти, и каждый раз создается новый массив.

Если у вас есть значение по умолчанию {} в вашем setDict , вам не нужно повторно назначать его в вашем useEffect .

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