React에서 컴포넌트 재렌더링 문제 해결하기

React 문제 해결: !important 추가 시 컴포넌트 재렌더링 문제 React 컴포넌트를 사용하다가 display: none !important를 사용할 때 컴포넌트가 예상대로 재렌더링되지 않는 문제를 겪고 있다면, 혼자가 아닙니다. 이 글에서는 이 문제를 조사하고 해결을 돕기 위한 해결책을 …

title_thumbnail(React에서 컴포넌트 재렌더링 문제 해결하기)

React 문제 해결: !important 추가 시 컴포넌트 재렌더링 문제

React 컴포넌트를 사용하다가 display: none !important를 사용할 때 컴포넌트가 예상대로 재렌더링되지 않는 문제를 겪고 있다면, 혼자가 아닙니다. 이 글에서는 이 문제를 조사하고 해결을 돕기 위한 해결책을 제공합니다.

문제점

간단한 React 컴포넌트가 있다고 가정해보겠습니다. 이 컴포넌트는 자식 컴포넌트를 숨기거나 보이게 하는 프롭을 받습니다. 이를 위해 display: none을 사용하여 style 속성을 사용합니다:

var style = {};

if (shouldHide) {
    // 재렌더링 문제를 일으키지 않습니다
    style = {
        display: 'none'
    };
}

return (
    <span style={style} {...this.props} />
);

그러나 display: none !important를 사용하여 스타일 선언을 더 구체적으로 만들려고 할 때, 컴포넌트가 새로운 프롭을 받을 때 더 이상 재렌더링되지 않습니다:

// 재렌더링 문제를 일으키지 않습니다
style = {
    display: 'none !important'
};

원인 설명

이 문제는 현재 React에서는 !important를 지원하지 않기 때문에 발생합니다. display: none !important 스타일 선언의 사용으로 인해 컴포넌트는 프롭의 변경 사항을 제대로 감지하지 못하고 재렌더링이 발생하지 않습니다.

React는 실제로 프롭이나 상태에 변경이 있는 경우에만 컴포넌트를 재렌더링합니다. 이 경우에는 display: none !important와 같은 스타일 객체가 동일한 상태로 유지되므로 React는 재렌더링이 필요하지 않다고 가정합니다.

임시 방편

이상적이지는 않지만, 단순한 임시 방편을 사용하여 원하는 결과를 얻을 수 있습니다. style 대신 CSS 클래스를 적용하는 방식으로 변경해보세요:

CSS 파일에 다음을 추가하세요:

.hidden {
    display: none !important;
}

컴포넌트에 다음과 같이 적용하세요:

var hideClass;

if (shouldHide) {
    hideClass = "hidden";
}

return (
    <span className={hideClass} {...this.props} />
);

이 접근 방식은 shouldHide 프롭에 따라 hidden 클래스를 추가하거나 제거합니다. 그런 다음 hidden 클래스에서 특정한 display: none !important 규칙을 처리하여 !important을 인라인 스타일에 직접 사용하지 않고 재렌더링 문제를 해결합니다.

이 임시 방편을 적용하면, 컴포넌트는 이제 shouldHide 프롭이 변경될 때 올바르게 재렌더링되어 원하는 동작을 제공합니다.

결론

React에서 인라인 스타일에 !important를 사용하면 컴포넌트 재렌더링 문제를 일으킬 수 있지만, CSS 클래스 기반 접근 방식으로 이 문제를 해결할 수 있습니다. 이 글에서 논의한 임시 방편을 적용함으로써, React 컴포넌트를 올바르게 재렌더링하면서 원하는 숨기기/표시 기능을 달성할 수 있습니다.

추가 자료:

참고 자료 : 

reactjs

Leave a Comment