什么是突变观察者?
mutationObserver 是JavaScript API,它允许开发人员聆听DOM中特定元素或节点的更改(文档对象模型)。它提供了一种观察和响应DOM结构内发生的变化的方法。
突变处理器通过注册回调函数来观察DOM中的特定目标元素或节点来工作。当发生更改(例如正在添加或删除节点)时,调用回调函数将带有描述发生的更改的MutationRecord对象列表。
突变处理器API为构建需要对DOM变化做出反应的响应Web应用程序提供了强大的工具。它可用于实现广泛的功能,例如懒惰的内容,自动更新UI元素和实时数据同步。
让我通过示例解释突变观察者。
我们的目的是在类别的部分高度变化时添加动画。我们需要听那个操作
为了做到这一点,我们需要类别部分的参考。
import React, { useRef } from 'react';
import { CategoryItems } from './category-items/category-items';
import { CategoryTitles } from './category-titles/category-titles';
import './categories.scss';
const Categories = () => {
const categoriesRef = useRef<HTMLDivElement>(null);
return (
<div className="categories" ref={categoriesRef}>
<CategoryTitles />
<CategoryItems />
</div>
);
};
export { Categories };
准备categoriesRef
后,我们可以创建 mutationObserver
结构。
首先,我们需要创建MutationObserver
const mutationObserver = new MutationObserver(async () => {
console.log('mutationObserver operation');
});
这是我们的MutationObserver实例,我们将从useEffect
调用此实例
useEffect(() => {
if (categoriesRef.current) {
mutationObserver.observe(categoriesRef.current, {
childList: true,
subtree: true,
});
return () => {
mutationObserver.disconnect();
};
}
}, []);
-
我们用
categoriesRef.current
定义了mutationObserver.observe
,它听到参数,例如childList
和subtree
,您也可以检查this以获取更多参数。 -
,我们还定义了 componentWillunMount上的
mutationObserver.disconnect()
drete liste liste otery当组件关闭时。
此后,当categoriesRef
处的高度变化时,我们将看到控制台日志。
console.log('mutationObserver operation');
然后,我们将添加动画处理程序代码,并定义CSS过渡到categoriesRef
const mutationObserver = new MutationObserver(async () => {
const categoryTitles = document.getElementById('categoryTitles') as HTMLDivElement | null;
const categoryItems = document.getElementById('categoryItems') as HTMLDivElement | null;
if (categoriesRef.current && categoryTitles && categoryItems) {
if (categoryTitles.clientHeight > categoryItems.clientHeight) {
categoriesRef.current.style.height = `${categoryTitles.clientHeight}px`;
} else {
categoriesRef.current.style.height = `${categoryItems.clientHeight}px`;
}
}
});
.categories {
transition: height 200ms ease;
}
voilð