1
This commit is contained in:
Generated
Vendored
+4
@@ -0,0 +1,4 @@
|
||||
import React from 'react';
|
||||
import type { MutationObserverProps } from './interface';
|
||||
declare const MutateObserver: React.FC<MutationObserverProps>;
|
||||
export default MutateObserver;
|
||||
+39
@@ -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;
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
import MutateObserver from './MutateObserver';
|
||||
import useMutateObserver from './useMutateObserver';
|
||||
export { useMutateObserver };
|
||||
export default MutateObserver;
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
import MutateObserver from "./MutateObserver";
|
||||
import useMutateObserver from "./useMutateObserver";
|
||||
export { useMutateObserver };
|
||||
export default MutateObserver;
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
/// <reference types="react" />
|
||||
export interface MutationObserverProps {
|
||||
children: React.ReactNode;
|
||||
options?: MutationObserverInit;
|
||||
onMutate?: (mutations: MutationRecord[], observer: MutationObserver) => void;
|
||||
}
|
||||
+1
@@ -0,0 +1 @@
|
||||
export {};
|
||||
Generated
Vendored
+2
@@ -0,0 +1,2 @@
|
||||
declare const useMutateObserver: (nodeOrList: HTMLElement | HTMLElement[] | SVGElement | SVGElement[], callback: MutationCallback, options?: MutationObserverInit) => void;
|
||||
export default useMutateObserver;
|
||||
Generated
Vendored
+27
@@ -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;
|
||||
Reference in New Issue
Block a user