Массив зависимостей и реализация React useEffect

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

Моим решением была «смонтированная» переменная состояния, которая устанавливается в значение true, когда происходит выборка. Затем, если смонтировано было верно, я больше не получаю. Это решение, по-видимому, устранило проблему повторной загрузки, а также состояние, отстающее на один шаг. Это правильный шаблон для использования или есть лучший/более предпочтительный способ?

  const [mounted, setMounted] = useState(false)
  useEffect(() => {// reactive state  
    // if params.id that means we need to edit an existing faq
    if (params.id && !mounted){
      async function fetchData() {
        await fetchFaqs();
        setMounted(true);
      }
      fetchData();
    }
    checkIfFormIsValid();
  }, [answer, question, section, sort, checkIfFormIsValid]);

Вы, вероятно, захотите кэшировать эти данные, а не получать их при каждом рендеринге, даже если вам удалось предотвратить слишком много повторных рендерингов. Одним из быстрых и простых способов реализации является использование асинхронного селектора RecoilJS. См. пример асинхронности здесь: recoiljs.org/docs/guides/asynchronous-data-queries

Aadmaa 01.12.2022 02:26

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

mediaguru 01.12.2022 15:41
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
2
82
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете просто использовать отдельные useEffect вот так:

// add params.id to dependency array
useEffect(() => {
  if (params.id) {
    async function fetchData() {
      await fetchFaqs();
    }
    fetchData();
  }
}, [params.id])

useEffect(() => {
  checkIfFormIsValid();
}, [answer, question, section, sort, checkIfFormIsValid])

Спасибо Энес. Интересный. Я пришел из мира componentDidMount, поэтому думал об использовании useEffect только один раз.

mediaguru 01.12.2022 15:41

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