![]()
React SVG 아이콘이 왜 사라지나요?
React SVG 아이콘이 컴포넌트를 다시 렌더링 할 때 무작위로 사라지는 귀찮은 문제가 발생하는 경우, 걱정하지 마세요. 이 예기치 않은 동작은 꽤 혼란스럽지만, 다행히도 이러한 문제를 해결하기 위한 방법이 있습니다.
이 문제의 이해
해결 방법에 대해 알아보기 전에, 우선 이 문제가 발생하는 이유를 이해해봅시다. devtools를 사용하여 DOM 트리를 검사할 때 “#shadow-root”라는 노드가 계층 구조에 있는 것을 알 수 있습니다. 이 노드는 컴포넌트를 렌더링하는 데 중요한 역할을 합니다. SVG 아이콘이 보일 때는, 그들은 “#shadow-root” 요소의 자식 노드로 배치됩니다. 그러나 그들이 사라지면, DOM 트리는 “#shadow-root” 노드가 더 이상 어떠한 자식 노드도 가지고 있지 않음을 보여주며, SVG 아이콘이 어디에도 없어지는 것입니다.
가능한 해결책
1. 대안적인 접근 방식 시도하기
가능한 해결책 중 하나는 React 컴포넌트에서 SVG 아이콘을 포함하는 다른 방법을 시도해보는 것입니다. xlinkHref와 함께 인라인 SVG를 사용하는 대신 다른 접근 방식을 탐색해보세요:
import logo from './logo.svg';
render() {
return (
<img src={logo} className="App-logo" alt="logo" />
);
}
import InlineSVG from 'svg-inline-react';
const svgSource = `<svg xmlns="......</svg>`;
<InlineSVG src={svgSource} />
2. SVG 요소 수동으로 구성하기
다른 방법으로는 xlinkHref 속성에 의존하는 대신에 SVG 요소를 수동으로 구성하는 것입니다. 다음은 예시 구현입니다:
const Icon = React.memo(({ name }) => {
const [svgNode, setSvgNode] = React.useState(null);
React.useLayoutEffect(() => {
if (svgNode === null) {
return;
}
const useNode = document.createElementNS("http://www.w3.org/2000/svg", "use");
useNode.setAttributeNS("http://www.w3.org/1999/xlink", "href", `img/icons/sprite.svg#icon-${name}`);
svgNode.appendChild(useNode);
return () => {
useNode.remove();
};
}, [name, svgNode]);
return <svg ref={setSvgNode} />;
});
마무리
React SVG 아이콘이 사라지는 문제는 해결하기 귀찮은 문제일 수 있지만, 다른 가져오기 방법을 사용하거나 SVG 요소를 수동으로 구성하는 것과 같이 대안적인 방법을 시도함으로써 이 문제를 극복할 수 있습니다. DOM 트리의 구조와 “#shadow-root” 노드의 역할을 이해하는 것을 기억하세요. 문제 해결과 실험을 통해 React 애플리케이션에서 사랑스러운 SVG 아이콘의 가시성을 유지할 수 있습니다.
이 문제를 해결하는 데 행운을 빕니다! 즐거운 코딩하세요!