Web Development/Front

MutationObserver and ResizeObserver

alexrider94 2023. 2. 9. 00:09

Observer란?

흔히 Observer패턴이라고 객체의 상태가 변화하는것관찰 및 감시하기 위한 것이라고 생각하면 된다. 


MuationObserver와 ResizeObserver?

React에서의 컴포넌트에 height이나 width의 변화감지가 필요해 검색해본 결과 MutationObserver와 ResizeObserver를 발견할 수 있었다.
MutationObserver의 경우 DOM(DOM 3)에서의 특정 노드에 대한 변화를 감지할 수 있는 Web API이라고 하고 값으로는 속성값, 텍스트, 자식노드변화가 있다.

ResizeObserver의 경우는 DOM에서의 크기 변화에 특성화되 감지할 수 있는 Web API다. 
크기 변화의 값에는 border-box, content-box, SVGElement의 bounding box가 있다.
IE에서는 지원을 하지 않아서 polyfill이 필요하다.


MutationObserver의 config option

childList 자식 노드의 변화
attributes 해당 특성 노드의 속성값 변화
characterData node.data에서의 변화 (text 값)
subtree 하위 모든 노드의 변화
attributeOldValue 변경되기 이전의 속성 값을 받을 수 있음
characterDataOldValue 변경되기 이전의 data 값을 받을 수 있음
attributeFilter 추적하는 속성 이름을 배열 형태로 받음


React에서의 적용 방법

MutationObserver

...

const ref = useRef(null);

const callback = useCallback((entries, observer)=>{
	...//필요한 이벤트
},[]);

React.useEffect(() => {
    if (ref.current) {
      const observer = new MutationObserver(callback);
      observer.observe(ref.current, options);
      
	  return () => observer.disconnect();
    }
 }, [callback, options]);


return (
<SomeDiv ref={ref}>
	...
</SomeDiv>
);

ResizeObserver

...
const ref = useRef(null):

useEffect(() => {
  if (!ref.current) return; 
  const resizeObserver = new ResizeObserver(() => {
    // 사이즈 변경시 실행할 이벤트
  });
  resizeObserver.observe(ref.current);

  return () => resizeObserver.disconnect(); 
}, []);

...