🖍️ Custom Hooks 에 대해
사용 이유
구현 방법
대표 Custom Hook 예시
import { useState, useEffect } from "react";
function useFetch(url) {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
const fetchData = async () => {
try {
const res = await fetch(url);
const data = await res.json();
setData(data);
} catch (err) {
setError(err);
} finally {
setLoading(false);
}
};
fetchData();
}, [url]);
return { data, loading, error };
}
import { useState, useEffect } from "react";
function useLocalStorage(key, initialValue) {
const [storedValue, setStoredValue] = useState(() => {
try {
const fetchData = async () => {
try {
const item = window.localStorage.getItem(key);
return item ? JSON.parse(item) : initialValue;
} catch (err) {
console.log(error);
return initialValue;
}
});
const setValue = (value) => {
try {
const valueToStore = value instanceof Function ?
value(storedValue) : value;
setStoredValue(valueToStore);
window.localStorage
.setItem(key, JSON.stringify(valueToStore));
} catch (error) {
console.log(error);
}};
return [storedValue, setValue];
}
import { useState } from 'react';
function useFormInput(initialValue) {
const [value, setValue] = useState(initialValue);
const handleChange = (e) => {
setValue(e.target.value);
};
return {
value,
onChange: handleChange,
};
}
import { useState, useCallback } from 'react';
function useToggle(initialState = false) {
const [state, setState] = useState(initialState);
const toggle = useCallback(() => setState(state => !state), []);
return [state, toggle];
}
import { useState, useEffect, useContext, createContext } from 'react';
// useContext와 createContext를 사용하여 인증 상태를 관리
const AuthContext = createContext();
export function AuthProvider({ children }) {
const [user, setUser] = useState(null);
// 로그인 시 사용자 상태 설정
const login = (userData) => {
setUser(userData);
};
const logout = () => {
setUser(null);
};
return (
<AuthContext.Provider value={{ user, login, logout }}>
{children}
</AuthContext.Provider>
);
}
import { useEffect } from 'react';
// 마운트되었을 때 한 번만 실행되어야 하는 로직을 관리
function useDidMount(effect) {
useEffect(effect, []);
}
import { useState, useEffect } from 'react';
// 브라우저 윈도우의 크기 변화를 감지
// 해당 값들을 반환하는 커스텀 훅
function useWindowSize() {
const [size, setSize] = useState({ width: window.innerWidth, height: window.innerHeight });
useEffect(() => {
const handleResize = () => {
setSize({ width: window.innerWidth, height: window.innerHeight });
};
window.addEventListener('resize', handleResize);
return () => window.removeEventListener('resize', handleResize);
}, []);
}
import { useEffect, useRef } from 'react';
function usePrevious(value) {
const ref = useRef();
useEffect(() => {
ref.current = value;
}, [value]);
return ref.current;
}