This commit is contained in:
2026-05-25 17:08:18 +08:00
parent df501f6151
commit f1259b71b5
9178 changed files with 1626125 additions and 0 deletions
@@ -0,0 +1,4 @@
import React from 'react';
import type { MutationObserverProps } from './interface';
declare const MutateObserver: React.FC<MutationObserverProps>;
export default MutateObserver;
@@ -0,0 +1,39 @@
import { getDOM } from "@rc-component/util/es/Dom/findDOMNode";
import useEvent from "@rc-component/util/es/hooks/useEvent";
import useLayoutEffect from "@rc-component/util/es/hooks/useLayoutEffect";
import { getNodeRef, supportNodeRef, useComposeRef } from "@rc-component/util/es/ref";
import React from 'react';
import useMutateObserver from "./useMutateObserver";
const MutateObserver = props => {
const {
children,
options,
onMutate = () => {}
} = props;
const callback = useEvent(onMutate);
const elementRef = React.useRef(null);
const canRef = supportNodeRef(children);
const mergedRef = useComposeRef(elementRef, getNodeRef(children));
const [target, setTarget] = React.useState(null);
useMutateObserver(target, callback, options);
// =========================== Effect ===========================
useLayoutEffect(() => {
// Set target based on the refs
if (canRef && elementRef.current) {
setTarget(getDOM(elementRef.current));
}
}, [canRef]);
// =========================== Render ===========================
if (!children) {
if (process.env.NODE_ENV !== 'production') {
console.error('MutationObserver need children props');
}
return null;
}
return canRef ? /*#__PURE__*/React.cloneElement(children, {
ref: mergedRef
}) : children;
};
export default MutateObserver;
@@ -0,0 +1,4 @@
import MutateObserver from './MutateObserver';
import useMutateObserver from './useMutateObserver';
export { useMutateObserver };
export default MutateObserver;
@@ -0,0 +1,4 @@
import MutateObserver from "./MutateObserver";
import useMutateObserver from "./useMutateObserver";
export { useMutateObserver };
export default MutateObserver;
@@ -0,0 +1,6 @@
/// <reference types="react" />
export interface MutationObserverProps {
children: React.ReactNode;
options?: MutationObserverInit;
onMutate?: (mutations: MutationRecord[], observer: MutationObserver) => void;
}
@@ -0,0 +1 @@
export {};
@@ -0,0 +1,2 @@
declare const useMutateObserver: (nodeOrList: HTMLElement | HTMLElement[] | SVGElement | SVGElement[], callback: MutationCallback, options?: MutationObserverInit) => void;
export default useMutateObserver;
@@ -0,0 +1,27 @@
import canUseDom from "@rc-component/util/es/Dom/canUseDom";
import React from 'react';
const defaultOptions = {
subtree: true,
childList: true,
attributeFilter: ['style', 'class']
};
const useMutateObserver = (nodeOrList, callback, options = defaultOptions) => {
React.useEffect(() => {
if (!canUseDom() || !nodeOrList) {
return;
}
let instance;
const nodeList = Array.isArray(nodeOrList) ? nodeOrList : [nodeOrList];
if ('MutationObserver' in window) {
instance = new MutationObserver(callback);
nodeList.forEach(element => {
instance.observe(element, options);
});
}
return () => {
instance?.takeRecords();
instance?.disconnect();
};
}, [options, nodeOrList]);
};
export default useMutateObserver;