React_Props (노마드코더)

김재민·2022년 7월 30일
0

개요

만약 내가 만든 어플리케션이 1000개의 컴포넌트가 존재한다면 변화가 있는 컴포넌트를 리렌더링 하기 위해서 변화가 없는 컴포넌트까지 모든 컴포넌트들을 매번 리렌더링한다면 효율성이 많이 떨어지고 성능이 지연될 수 있다.

그런 부분들을 방지하기 위해 렌더링 결과를 메모이징함으로써, 불필요한 리렌더링을 건너뛴다.

React.memo()

React는 먼저 컴포넌트를 렌더링한 뒤, 이전 렌더링 결과와 비교하여 DOM 업데이트를 결정한다. 만약 렌더링 결과가 이전과 다르다면, React는 DOM을 업데이트한다.

컴포넌트가 React.memo()로 래핑될 때, React는 컴포넌트를 렌더링하고 결과를 메모이징한다. 그리고 다음 렌더링이 일어날 때 props가 같다면, React는 메모이징(Memoizing)된 내용을 재사용한다.

Memoizing을 사용하지 않은 코드

function Btn({text, color, changeValue}){
        console.log(text, "was rendered");
        return( 
        <button 
            onClick={changeValue}
            
            style={{
            backgroundColor:"tomato",
            color : color,
            padding:"10px 20px",
            border:0,
            borderRadius:10
        }}>{text}</button>
        
        );
    }
    
    function ConfirmBtn(){
        return <button>Confirm</button>
    }

    //const MemorizedBtn = React.memo(Btn);
    function App(){
        const [value, setValue] = React.useState("Save Changes"); 
        const changeValue = () => setValue("Revert Changes");
        return ( 
            <div>
                <Btn text={value} changeValue={changeValue}/>
                <Btn text="Continue" color="white"/>
            </div>            
        );
    
    }

처음 렌더링이 되면서 console에서 컴포넌트 렌더링을 확인할 수 있고 Save Btn을 클릭한 후에 두개의 컴포넌트에 대한 렌더링을 확인할 수 있다. 하지만 변한것은 Save Btn 뿐이기 때문에 굳이 Continue까지 렌더링 할 필요는 없다.

React.memo 사용 코드

function Btn({text, color, changeValue}){
        console.log(text, "was rendered");
        return( 
        <button 
            onClick={changeValue}
            
            style={{
            backgroundColor:"tomato",
            color : color,
            padding:"10px 20px",
            border:0,
            borderRadius:10
        }}>{text}</button>
        
        );
    }


const MemorizedBtn = React.memo(Btn);
    function App(){
        const [value, setValue] = React.useState("Save Changes"); 
        const changeValue = () => setValue("Revert Changes");
        return ( 
            <div>
                <MemorizedBtn text={value} changeValue={changeValue}/>
                <MemorizedBtn text="Continue" color="white"/>
            </div>            
        );
    
    }

memo를 사용 하고나서는 Continue 컴포넌트는 리렌더링 되지 않는 것을 알 수 있다.

언제 React.memo를 사용해야하나

같은 props로 렌더링이 자주 일어나는 컴퍼넌트

React.memo()는 함수형 컴포넌트에 적용되어 같은 props에 같은 렌더링 결과를 제공한다.

React.memo()를 사용하기 가장 좋은 케이스는 함수형 컴퍼넌트가 같은 props로 자주 렌더링 될 것이라고 예상될 때

언제 React.memo를 사용하지 말아야 하나

위에서 언급한 상황이 일치하지 않는다면 React.memo()를 사용할 필요가 없을 가능성이 높다.

성능적인 이점을 얻지 못한다면 메모이제이션을 사용하지 않는 것이 좋다.

성능관련 변경이 잘못 적용된다면 성능이 오히려 악화될 수 있다. React.memo()를 현명하게 사용해야 한다.

참고 :
https://nomadcoders.co/react-for-beginners/lectures/3276
https://ui.toast.com/weekly-pick/ko_20190731

profile
어제의 나보다 나은 오늘의 내가 되자!🧗‍♂️

0개의 댓글