useMutationObserver
使用 MutationObserver MDN 檢測 DOM 的更改
useMutationObserver 封裝了 MutationObserver API,用於觀察 DOM 元素的變更。它在偵測到子節點、屬性或文字內容變更時觸發回呼。支援標準的 MutationObserverInit 選項。
使用場景
- 監控 DOM 變更以實現與第三方函式庫的整合
- 偵測動態內容變更(例如廣告注入、內容修改)
- 觀察元素屬性變更以同步 React 狀態
注意事項
- SSR 安全:在伺服器端渲染時為空操作。伺服器上不會建立
MutationObserver。 - 效能:謹慎使用
subtree: true,因為觀察大型子樹可能影響效能。 - 相關 hooks:另請參閱
useResizeObserver觀察尺寸變更,以及useIntersectionObserver觀察可見性變更。
Usage
Live Editor
function Demo() { const options = { attributes: true }; const [width, setWidth] = useState(200); const [count, setCount] = useState(0); const ref = useRef<HTMLDivElement>(null); const stop = useMutationObserver( (mutationsList) => { mutationsList.forEach(() => setCount(c => c + 1)); }, ref, options, ); useEffect(() => { setWidth(300); }, []); return ( <div> <div ref={ref} style={{ width, padding: 12, border: "1px solid #000", marginBottom: 8, }} > current width:{width} </div> <button onClick={() => setWidth(w => w + 10)}>widening</button> <button onClick={() => stop()}>stop observe</button> <p>Mutation count {count}</p> </div> ); };
Result
API
UseMutationObserver
Returns
() => void: 停止函數
Arguments
| 參數名 | 描述 | 類型 | 預設值 |
|---|---|---|---|
| callback | 回调 | MutationCallback (必填) | - |
| target | dom元素 | BasicTarget (必填) | - |
| options | 传递给 MutationObserver 的参数 | MutationObserverInit | undefined | - |
BasicTarget
export type BasicTarget<T extends TargetType = Element> = (() => TargetValue<T>) | TargetValue<T> | MutableRefObject<TargetValue<T>>;
TargetValue
type TargetValue<T> = T | undefined | null;
TargetType
type TargetType = HTMLElement | Element | Window | Document | EventTarget;