#reactjs
Вопрос:
У меня есть следующий код, и вы можете просмотреть его в CodeSandbox:
import "./styles.css";
import lottie from "lottie-web";
import { useEffect, useRef } from "react";
import logo from "pic";
export default function App() {
const el = useRef(null);
useEffect(() => {
if (el != null) {
lottie.loadAnimation({
container: el,
renderer: "svg",
loop: true,
autoplay: true,
animationData: logo
});
}
}, []);
return (
<div className="App">
<div ref={el}></div>
</div>
);
}
Лотти-это просто какая-то библиотека для визуализации анимации. Проблема, с которой я сталкиваюсь, заключается в том, что, пока я нахожусь на стадии разработки, если я внесу некоторые изменения во второй тег div, то реагирую повторно, не уничтожая предыдущую анимацию, и тем временем создаю новую анимацию ниже исходной. Я знаю, что нужно добавить некоторую логику очистки эффекта в useEffect, но я просто не понимаю, почему.
Я новичок в реагировании и только очень хорошо понимаю, как работает React в фоновом режиме, вот что я думаю: в основном, когда я изменяю второй тег div, алгоритм diff замечает, что он был изменен, поэтому он продолжает и пытается изменить dom, связанный с ним. На мой взгляд, это может 1). либо обновите текущий дом 2). удалите его и добавьте новый dom. В первой ситуации не следует ли оставить первую анимацию без изменений без добавления новой анимации? Во второй ситуации, если он избавится от текущего dom, зачем сохранять исходную анимацию?
Комментарии:
1. Вы должны смотреть на
el.current
, а не простоel
. Прочитайте документы для useRef.
Ответ №1:
Реакция может выполнять оба упомянутых вами сценария: update existing
и destroy amp; re-create
. И React использует свой собственный алгоритм, чтобы решить, когда и что делать.
Вы можете заставить реагировать на использование destroy amp; re-create
стратегии с помощью специального props
вызова key
.
Цитируется по ссылке выше:
При изменении ключа React создаст новый экземпляр компонента, а не обновит текущий
Я не мог запустить пример, который вы предоставили через песочницу кода, и просто прочитав ваш код, я вижу, что у вашего App
компонента нет props
и нет state
. Таким образом, у вас нет возможности обновить его.
Ваш код сказал: когда componentDidMount
используется lottie
для анимации внутри второго div
. Таким образом, есть вероятность, что проблема с анимацией, с которой вы столкнулись, вероятно, связана с lottie
тем, что вы не реагируете.