프론트엔드/React

[React] 6. Memo

sujin7837 2022. 12. 4. 16:57
반응형
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,
        }}
      >
        {text}
      </button>
    );
  }
  function App() {
    const [value, setValue] = React.useState("Save Changes");
    const changeValue = () => setValue("Revert Changes");
    return (
      <div>
        <Btn text={value} changeValue={changeValue} /> 
        <Btn text="Continue" />
      </div>
    );
  }
    const root = document.getElementById("root");
    ReactDOM.render(<App />, root);

첫번째 버튼을 누르면 Save Changes에서 Revert Changes로 글자가 변경됩니다. 이때 위 코드에 의하면 버튼 두 개가 모두 새롭게 렌더링됩니다. 그런데 여기서 두번째 버튼은 변화가 없기 때문에 리렌더링되는 것이 비효율적입니다. 이러한 점을 개선하기 위해 Memo를 사용해줄 수 있습니다.

 

Memo

React에게 어떤 컴포넌트가 다시 그려지는 것을 원치 않는다고 말해주는 기능입니다. 이 기능을 사용하면 prop에 변화가 있을 경우만 리렌더링해주고, 변화가 없을 경우에는 리렌더링을 하지 않습니다.

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,
        }}
      >
        {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);

 

 

출처 : https://nomadcoders.co/react-for-beginners/lectures/3276

반응형

'프론트엔드 > React' 카테고리의 다른 글

[React] 8. Effects  (0) 2022.12.18
[React] 5. Props  (0) 2022.12.04
[React] 4. State  (0) 2022.11.22
[React] 3. JSX  (0) 2022.11.13
[React] 2. Before React  (0) 2022.11.13