React 후크는 기능 구성 요소에서 상태 및 수명 주기 메서드와 같은 React 기능을 사용할 수 있게 해주는 특수 함수입니다. 이는 구성 요소 모델을 단순화하고 구성 요소 간에 상태 저장 논리를 더 쉽게 공유할 수 있도록 React 16.8에 도입되었습니다.
상태 관리: useState와 같은 후크를 사용하면 함수형 구성 요소를 클래스 구성 요소로 변환할 필요 없이 기능 구성 요소의 상태를 추가하고 관리할 수 있습니다.
부작용: useEffect 후크를 사용하면 클래스 구성 요소의 수명 주기 메서드와 유사하게 데이터 가져오기, 구독 또는 DOM 수동 변경과 같은 부작용을 수행할 수 있습니다.
재사용성: 사용자 정의 후크를 사용하면 다양한 구성 요소에서 상태 저장 논리를 캡슐화하고 재사용할 수 있습니다.
클리너 코드: 후크는 구성 요소를 잘 유지하는 데 도움이 됩니다
1 useState
import React, { useState } from 'react'; const Counter = () => { const [count, setCount] = useState(0); return ( <div> <p>Count: {count}</p> <button onClick={() => setCount(count + 1)}>Increment</button> </div> ); };
2 효과 사용
import React, { useEffect, useState } from 'react'; const DataFetcher = () => { const [data, setData] = useState(null); useEffect(() => { fetch('https://api.example.com/data') .then(response => response.json()) .then(setData); }, []); return <div>{data ? JSON.stringify(data) : 'Loading...'}</div>; };
3 useContext
import React, { useContext } from 'react'; const ThemeContext = React.createContext('light'); const ThemedComponent = () => { const theme = useContext(ThemeContext); return <div className={`theme-${theme}`}>Current theme: {theme}</div>; };
4 리듀서 사용
import React, { useReducer } from 'react'; const initialState = { count: 0 }; const reducer = (state, action) => { switch (action.type) { case 'increment': return { count: state.count + 1 }; case 'decrement': return { count: state.count - 1 }; default: return state; } }; const Counter = () => { const [state, dispatch] = useReducer(reducer, initialState); return ( <div> <p>Count: {state.count}</p> <button onClick={() => dispatch({ type: 'increment' })}>Increment</button> <button onClick={() => dispatch({ type: 'decrement' })}>Decrement</button> </div> ); };
5 메모 사용
import React, { useMemo, useState } from 'react'; const ExpensiveComputation = ({ number }) => { const compute = (num) => { return num * 1000; // Simulate an expensive computation }; const result = useMemo(() => compute(number), [number]); return <div>Computed Result: {result}</div>; };
6 콜백 사용
import React, { useCallback, useState } from 'react'; const Button = React.memo(({ onClick, children }) => { console.log('Button rendered'); return <button onClick={onClick}>{children}</button>; }); const App = () => { const [count, setCount] = useState(0); const increment = useCallback(() => setCount(c => c + 1), []); return ( <div> <p>Count: {count}</p> <Button onClick={increment}>Increment</Button> </div> ); };
7 참조 사용
import React, { useRef } from 'react'; const FocusInput = () => { const inputRef = useRef(null); const focusInput = () => { inputRef.current.focus(); }; return ( <div> <input ref={inputRef} type="text" /> <button onClick={focusInput}>Focus Input</button> </div> ); };
8 useLayoutEffect
import React, { useLayoutEffect, useRef } from 'react'; const LayoutEffectExample = () => { const divRef = useRef(); useLayoutEffect(() => { console.log('Height:', divRef.current.clientHeight); }, []); return <div ref={divRef}>This is a div</div>; };
9 ImperativeHandle 사용
import React, { useState } from 'react'; const Counter = () => { const [count, setCount] = useState(0); return ( <div> <p>Count: {count}</p> <button onClick={() => setCount(count + 1)}>Increment</button> </div> ); };
10 useDebugValue
- 설명: 보다 쉬운 디버깅을 위해 React DevTools의 사용자 정의 후크에 대한 레이블을 표시합니다.
- 예:
import React, { useEffect, useState } from 'react'; const DataFetcher = () => { const [data, setData] = useState(null); useEffect(() => { fetch('https://api.example.com/data') .then(response => response.json()) .then(setData); }, []); return <div>{data ? JSON.stringify(data) : 'Loading...'}</div>; };
11 가져오기 사용
- 설명: API에서 데이터를 가져오기 위한 사용자 정의 후크
- 예:
import React, { useContext } from 'react'; const ThemeContext = React.createContext('light'); const ThemedComponent = () => { const theme = useContext(ThemeContext); return <div className={`theme-${theme}`}>Current theme: {theme}</div>; };
12 LocalStorage 사용
- 설명: 상태를 로컬 저장소와 동기화하여 세션 전반에 걸쳐 데이터를 유지합니다.
- 예:
import React, { useReducer } from 'react'; const initialState = { count: 0 }; const reducer = (state, action) => { switch (action.type) { case 'increment': return { count: state.count + 1 }; case 'decrement': return { count: state.count - 1 }; default: return state; } }; const Counter = () => { const [state, dispatch] = useReducer(reducer, initialState); return ( <div> <p>Count: {state.count}</p> <button onClick={() => dispatch({ type: 'increment' })}>Increment</button> <button onClick={() => dispatch({ type: 'decrement' })}>Decrement</button> </div> ); };
13 이전 사용
- 설명: 상태나 속성의 이전 값을 반환합니다.
- 예:
import React, { useMemo, useState } from 'react'; const ExpensiveComputation = ({ number }) => { const compute = (num) => { return num * 1000; // Simulate an expensive computation }; const result = useMemo(() => compute(number), [number]); return <div>Computed Result: {result}</div>; };
14 Debounce 사용
- 설명: 값 또는 함수 호출을 디바운스하여 지정된 지연 이후까지 실행을 지연합니다.
- 예:
import React, { useCallback, useState } from 'react'; const Button = React.memo(({ onClick, children }) => { console.log('Button rendered'); return <button onClick={onClick}>{children}</button>; }); const App = () => { const [count, setCount] = useState(0); const increment = useCallback(() => setCount(c => c + 1), []); return ( <div> <p>Count: {count}</p> <Button onClick={increment}>Increment</Button> </div> ); };
15 useOnClickOutside
- 설명: 지정된 요소 외부의 클릭을 감지하여 팝업이나 드롭다운을 닫는 데 유용합니다.
- 예:
import React, { useRef } from 'react'; const FocusInput = () => { const inputRef = useRef(null); const focusInput = () => { inputRef.current.focus(); }; return ( <div> <input ref={inputRef} type="text" /> <button onClick={focusInput}>Focus Input</button> </div> ); };
16 useInterval
- 설명: 지정된 간격으로 기능을 반복적으로 실행하는 간격을 설정합니다.
- 예:
import React, { useLayoutEffect, useRef } from 'react'; const LayoutEffectExample = () => { const divRef = useRef(); useLayoutEffect(() => { console.log('Height:', divRef.current.clientHeight); }, []); return <div ref={divRef}>This is a div</div>; };
17 useTimeout
- 설명: 지정된 지연 후에 기능이 실행되도록 제한 시간을 설정합니다.
- 예:
import React, { useImperativeHandle, forwardRef, useRef } from 'react'; const CustomInput = forwardRef((props, ref) => { const inputRef = useRef(); useImperativeHandle(ref, () => ({ focus: () => { inputRef.current.focus(); } })); return <input ref={inputRef} type="text" />; }); const Parent = () => { const ref = useRef(); return ( <div> <CustomInput ref={ref} /> <button onClick={() => ref.current.focus()}>Focus Input</button> </div> ); };
18 MediaQuery 사용
- 설명: 미디어 쿼리가 일치하는지 확인하여 반응형 디자인 로직을 허용합니다.
- 예:
import { useDebugValue } from 'react'; const useCustomHook = (value) => { useDebugValue(value ? 'Value is true' : 'Value is false'); return value; }; const DebugExample = () => { const isTrue = useCustomHook(true); return <div>Check the React DevTools</div>; };
19 useScrollPosition
- 설명: 현재 창의 스크롤 위치를 추적합니다.
- 예:
import { useState, useEffect } from 'react'; const useFetch = (url) => { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { const fetchData = async () => { const response = await fetch(url); const result = await response.json(); setData(result); setLoading(false); }; fetchData(); }, [url]); return { data, loading }; };
20 KeyPress 사용
- 설명: 특정 키가 눌렸는지 감지합니다.
- 예:
import { useState, useEffect } from 'react'; const useLocalStorage = (key, initialValue) => { const [storedValue, setStoredValue] = useState(() => { try { const item = window.localStorage.getItem(key); return item ? JSON.parse(item) : initialValue; } catch (error) { console.error(error); return initialValue; } }); useEffect(() => { try { window.localStorage.setItem(key, JSON.stringify(storedValue)); } catch (error) { console.error(error); } }, [key, storedValue]); return [storedValue, setStoredValue]; };
이제 이 목록에는 각 후크에 대한 설명이 포함되어 있어 후크의 목적과 사용 사례를 더욱 명확하게 이해할 수 있습니다. 더 자세한 내용이나 예시가 필요하시면 언제든지 문의해주세요!
위 내용은 React 기술 레벨 업: Hooks 이해 및 사용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!