- 함수의 재사용
- useCallback을 사용하지 않으면 컴포넌트가 랜더링 될 때마다 함수들이 실행되게 된다.
- 두번째 파라미터에는
[]
값이 들어가는데 이 값이 변결 될 때마다 함수가 실행된다.
import React, { useRef, useState, useMemo, useCallback } from 'react';
import UserList from './UserList';
import CreateUser from './CreateUser';
function CountAtivedUsers(users){
console.log('활성 사용자 수를 세는중..')
return users.filter(user => user.active).length;
}
function App() {
const [inputs, setInputs] = useState(
{
username: '',
email: 's'
}
);
const { username, email } = inputs;
const onChange = useCallback((e) => {
const {name, value} = e.target;
setInputs({
...inputs,
[name]: value
})
}, [inputs])
const [users, setUsers] = useState([
{
id: '1',
username: 'sjho0428',
email: 'sjho0428@gmail.com',
active: true
},
{
id: '2',
username: 'tester',
email: 'tester@gmail.com',
active: false
},
{
id: '3',
username: 'everton',
email: 'everton@gmail.com',
active: false
}
]);
const nextId = useRef(4);
const onCreate = useCallback(() => {
const user = {
id: nextId.current,
username,
email
}
setUsers([...users, user]);
setInputs({
username: '',
email: ''
})
console.log(nextId.current);
nextId.current += 1;
}, [users, username, email] )
const onRemove = useCallback(id => {
setUsers(
users.filter(user => user.id !== id)
)
}, [users])
const onToggle = useCallback((id) => {
setUsers(
users.map(user => user.id === id
? {...user, active: !user.active}
:user
)
)
}, [users])
const count = useMemo(()=>CountAtivedUsers(users),[users]);
return (
<>
<CreateUser
username={username}
email={email}
onCreate={onCreate}
onChange={onChange}
/>
<UserList users={users} onRemove={onRemove} onToggle={onToggle} />
<div>활성 사용자 수: {count}</div>
</>
)
}
export default App;