Hook 등장 이전
React의 관심사
Presentational - Container 퍁ㄴ
로직을 담당하는 컴포넌트(Container)와 UI를 담당하는 컴포넌트(Presentational)를 분리해서 관리
Hook 등장 이후
// UserStatus.js (예시 코드)
import React, { useState } from 'react';
const UserStatus = () => {
const [isActive, setIsActive] = useState(false);
const handleToggle = () => {
setIsActive((prev) => !prev);
};
return (
<>
<h1>현재 사용자의 상태입니다.</h1>
<span>{isActive ? '사용 중' : '사용 안 함'}</span>
<button onClick={handleToggle}>사용 상태 변경</button>
</>
);
};
export default UserStatus;
분리해보기
// ./useToggle.js (로직 부분 예시 코드)
import { useState } from 'react';
const useToggle = (initialValue = false) => { // 아무 값도 안들어오면 undefined 뜨니까 기본값은
//아무것도 안들어오면 false 기본값 세팅
const [state, setState] = useState(initialValue);
const handleToggle = () => {
setState((prev) => !prev);
};
return [state, handleToggle];
}; //배열이나 객체를 리턴해야 함.
export default useToggle;
기존 코드 수정
// ./UserStatus.js (UI 부분 예시 코드)
import React from 'react';
import useToggle from './useToggle';
const UserStatus = () => {
const [isActive, changeStatus] = useToggle();
// 커스텀훅의 [state, handleToggle]을
// 구조분해할당해줌.
return (
<>
<h1>현재 사용자의 상태입니다.</h1>
<span>{isActive ? '사용 중' : '사용 안 함'}</span>
<button onClick={changeStatus}>사용 상태 변경</button>
</>
);
};
export default UserStatus;
예시2)
users.json [김코드, 김개발]
function UserList(){
const [users, setUsers] = useState([]);
useEffect(()=>{
fetch("/data/users.json")
.then((res)=> res.json())
.then(setUsers);
}, []);
return (
<ul>
{users.map((user) =>(
<li key={user}>user: {user}</li>
))}
</ul>
);
}
export default UserList;
커스텀훅
const useUsers = ()=>{
const [users, setUsers] = useState([]);
useEffect(()=>{
fetch("/data/users.json")
.then((res)=> res.json())
.then(setUsers);
}, []);
return users;
}
-------
// 기존 컴포넌트
const users = useUsers();
여러 컴포넌트에서 사용된다면 src에 hook폴더를 따로 만들어서 관리
하나의 컴포넌트 전용이라면 해당 폴더 내에서 관리