728x90
반응형

1. 컴포넌트가 리렌더링 될 때마다를 기록하고 싶을 때가 있을 수 있다.

 

App.js

import React, { useRef, useState } from 'react';
import UserList from './UserList';
import CreateUser from './CreateUser';

function countActiveUsers(users) {
  console.log('활성 사용자 수를 세는중...');
  return users.filter(user => user.active).length;
}

function App() {
  const [inputs, setInputs] = useState({
    username: '',
    email: ''
  });
  const { username, email } = inputs;
  const onChange = e => {
    const { name, value } = e.target;
    setInputs({
      ...inputs,
      [name]: value
    });
  };
  const [users, setUsers] = useState([
    {
      id: 1,
      username: 'velopert',
      email: 'public.velopert@gmail.com',
      active: true
    },
    {
      id: 2,
      username: 'tester',
      email: 'tester@example.com',
      active: false
    },
    {
      id: 3,
      username: 'liz',
      email: 'liz@example.com',
      active: false
    }
  ]);

  const nextId = useRef(4);
  const onCreate = () => {
    const user = {
      id: nextId.current,
      username,
      email
    };
    setUsers(users.concat(user));

    setInputs({
      username: '',
      email: ''
    });
    nextId.current += 1;
  };

  const onRemove = id => {
    // user.id 가 파라미터로 일치하지 않는 원소만 추출해서 새로운 배열을 만듬
    // = user.id 가 id 인 것을 제거함
    setUsers(users.filter(user => user.id !== id));
  };
  const onToggle = id => {
    setUsers(
      users.map(user =>
        user.id === id ? { ...user, active: !user.active } : user
      )
    );
  };
  const count = countActiveUsers(users);
  return (
    <>
      <CreateUser
        username={username}
        email={email}
        onChange={onChange}
        onCreate={onCreate}
      />
      <UserList users={users} onRemove={onRemove} onToggle={onToggle} />
      <div>활성사용자 수 : {count}</div>
    </>
  );
}

export default App;

 

위 컴포넌트를 보면

 

const count = countActiveUsers(users);

위 부분은 함수 리렌더링이 있을 때마다 count값을 바꿔서 나타내어지게끔 변수를 선언한 부분이며 

 

function countActiveUsers(users) {
  console.log('활성 사용자 수를 세는중...');
  return users.filter(user => user.active).length;
}

위 부분은 함수가 호출되었을 때 로그가 찍히도록 하고, user.active의 개수를 return해준다.

 

이렇게 코드를 구성하게 되면 버튼을 클릭할 때는 한 번 클릭할 때마다 제대로 로그가 찍히지만

input의 값이 바뀔 때마다 리렌더링이 되기 때문에 text 등을 입력할 때 상당히 비효율적이다.

 

이러한 상황에서 쓰이는 Hook 함수가 useMemo이다.

 

 

const count = useMemo(() => countActiveUsers(users), [users]);

이런식으로 첫번째 파라미터에는 어떻게 연산할지 함수를 정의하고, 두번째 파라미터는 바뀌는 내용을 정의한다.

이렇게 하면 users의 내용이 바뀌기 전까진 함수가 실행되지 않고, 바뀌면 그 때 실행이 된다.

 

 

 

참조

https://react.vlpt.us/basic/17-useMemo.html

728x90
반응형

+ Recent posts