본문 바로가기

리액트 기기기초

#4.1 Memo

    • text, onClick은 단지 props의 이름임
<div>
                <Btn text={value} onClick={changeValue} />
                <Btn text="Continue" />
            </div>
  • state가 변경될 때마다  rerender가 발생함
  • props가 변경되지 않는다면 컴포넌트를 다시 그릴지 말지를 결정할 수 있음 -> MemorizedBtn = React.memo(Btn)
  • 불필요한 re-render는 React.memo()로 관리할 수 있음
    부모 컴포넌트의 state를 변경하면 당연히 그 자식 컴포넌트들도 Re-render가 일어남. 불필요한 렌더링이 발생할 수도 있는데, 이 경우에는 React.memo()로 prop의 변경이 일어난 부분만 렌더링 시킬 수 있음. 아주 많은 자식 컴포넌트를 가지고 있는 부모 컴포넌트일 때 사용하면 됨
  • React.memo()
    컴포넌트가 React.memo()로 wrapping 될 때, React는 컴포넌트를 렌더링하고 결과를 메모이징(Memoizing)한다. 그리고 다음 렌더링이 일어날 때 props가 같다면, React는 메모이징(Memoizing)된 내용을 재사용한다.
<!DOCTYPE html>
<html>

<body>
    <div id="root"></div>
</body>
<script src="https://unpkg.com/react@17.0.2/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
    function Btn({text, changeValue}) {
        console.log(text, "was rendered");
        return (
            <button
            onClick={changeValue}
            style={{
                backgroundColor: "tomato",
                color: "white",
                padding: "10px 20px",
                border: 0,
                borderRadius: 10,
                fontSize: 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" />
            </div>
        );
    }
    const root = document.getElementById("root");
    ReactDOM.render(<App />, root);
</script>

</html>

'리액트 기기기초' 카테고리의 다른 글

#5.0 Introduction  (0) 2023.03.08
#4.2 Prop Types  (0) 2023.03.08
#4.0 Props  (0) 2023.03.08
#3.9 Final Practice and Recap  (0) 2023.03.07
#3.8 Recap  (0) 2023.03.07