У меня есть карта с наложением. У меня есть эффект, который, когда базовые данные изменяются, удаляет старое наложение и повторно dr aws новый.
Заметьте, я использую "react-hooks/exhaustive-deps"
, и это кажется из все, что я прочитал , что просто удаление зависимости overlay
не является правильным ответом (но он работает).
Следует отметить, что данные - это пропущенная опора.
useEffect(() => {
// remove the overlay if it is there,
// I should have overlay as a dependency per exhaustive-reps react eslint rule
if (overlay) map.removeOverlays(overlay);
// Generate the new overlay based on the new data (useCallback function)
const newOverlay = generateNewOverlay(data)
// Store the new overlay so I can remove it later if the data changes
// Doesn't need to be done right away though, just before next render
setOverlay(newOverlay);
// Show the new overlay on my map
map.addOverlays(newOverlay);
}, [map, overlay, data, generateNewOverlay]);
Это, конечно, будет бесконечно l oop, потому что я устанавливаю оверлей и делаю его зависимым. Мне также не нравится сразу использовать setState в эффекте, поскольку он вызывает другой рендеринг. Что мне не хватает? Как мне добиться этой логики c?
Я прочитал около 5 вопросов с одинаковыми названиями, но они не ответили на мой вопрос.
Аналогичный вопрос , но не спрашивая, соблюдайте правило lps для исчерпывающих повторений, что для них не имеет значения, потому что они не читают состояние перед его изменением.
Редактировать:
У меня все еще есть Проблема, где useState и редуктор должны быть чистыми. Цель зависимости, с которой у меня возникла проблема (overlay
), заключается в том, что я должен проверить, существует ли оверлей. Если это произойдет, мне нужно сделать не чистую вещь, а именно удалить это наложение с карты перед установкой моего нового наложения. Эта строка кода делает ее не чистой:
if (overlay) map.removeOverlays(overlay);
Без этой строки мне бы никогда не понадобилось overlay
в моем списке зависимостей, и вся эта вещь не была бы фактором. Как вы видите, принятый ответ не является чистым из-за этой строки.
Ответ useReducer имеет эту строку вне редуктора, поэтому overlay
должна быть зависимостью, или ему нужно go в редукторе. Первый вариант - это то, что я пытаюсь избежать с помощью "react-hooks/exhaustive-deps"
, а второй ответ не является чистым.
Цените любую помощь.
Окончательное редактирование:
Я нашел лучший способ подойти к этому - правильно использовать очистку в useEffect. Мне требовалось указать состояние, чтобы я мог удалить вещи с карты позже.
useEffect(() => {
// remove the overlay if it is there,
// I originally needed this to store the overlay so I could remove it later, but if I use cleanup properly this isn't needed
// if (overlay) map.removeOverlays(overlay);
// Generate the new overlay based on the new data (useCallback function)
const newOverlay = generateNewOverlay(data)
// Store the new overlay so I can remove it later if the data changes
// Doesn't need to be done right away though, just before next render (This is what a cleanup is!)
// setOverlay(newOverlay);
// Show the new overlay on my map
map.addOverlays(newOverlay);
// New code below
return () => {map.removeOverlays(newOverlay)};
}, [map, data, generateNewOverlay]);