import React, { useState } from 'react';
function Counter() {
// useState 훅을 사용하여 count라는 상태와 그 상태를 업데이트할 수 있는 함수 setCount를 생성합니다.
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
{/* 버튼을 클릭할 때마다 setCount 함수를 사용하여 count 상태를 업데이트합니다. */}
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
export default Counter;
import React, { useEffect, useState } from 'react';
function ComponentWithoutDependencyArray() {
const [seconds, setSeconds] = useState(0);
useEffect(() => {
const interval = setInterval(() => {
setSeconds(prevSeconds => prevSeconds + 1);
}, 1000);
return () => clearInterval(interval);
});
return <div>Seconds: {seconds}</div>;
}
export default ComponentWithoutDependencyArray;
import React, { useEffect } from 'react';
function ComponentWithEmptyDependencyArray() {
useEffect(() => {
console.log('Effect runs only once because the dependency array is empty.');
}, []);
return <div>This is a component with an empty dependency array.</div>;
}
export default ComponentWithEmptyDependencyArray;
import React, { useEffect, useState } from 'react';
function ComponentWithDependencyArray() {
const [count, setCount] = useState(0);
useEffect(() => {
console.log('Effect runs whenever count changes:', count);
}, [count]);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>Increment Count</button>
</div>
);
}
export default ComponentWithDependencyArray;
import React, { useRef, useEffect } from 'react';
function InputFocus() {
const inputRef = useRef(null);
useEffect(() => {
// 컴포넌트가 마운트되면 input 요소에 포커스를 줍니다.
inputRef.current.focus();
}, []);
return (
<div>
<input type="text" ref={inputRef} />
<button onClick={() => inputRef.current.focus()}>Focus Input</button>
</div>
);
}
export default InputFocus;
useRef를 사용해 input 요소에 대한 참조를 생성한다.
useEffect를 사용해 컴포넌트가 마운트될 때 input 요소에 자동으로 포커스를 준다.
또한 버튼을 클릭해 input 요소에 다시 포커스를 줄 수 있다.
import React, { useState, useRef } from 'react';
function PreviousValue() {
const [count, setCount] = useState(0);
const prevCountRef = useRef();
// 컴포넌트가 렌더링될 때마다 현재 count 값을 prevCountRef에 저장합니다.
useEffect(() => {
prevCountRef.current = count;
});
const prevCount = prevCountRef.current;
return (
<div>
<p>Current count: {count}</p>
<p>Previous count: {prevCount !== undefined ? prevCount : 'N/A'}</p>
<button onClick={() => setCount(count + 1)}>Increment Count</button>
</div>
);
}
export default PreviousValue;
useRef를 사용해 이전 값에 대한 참조를 생성한다.
useEffect를 사용해 컴포넌트가 렌더링될 때마다 현재 count값을 prevCountRef에 저장하고, 그 값을 이용해 이전 값에 접근한다.
import React, { useState, useCallback } from 'react';
function ParentComponent() {
const [count, setCount] = useState(0);
// 콜백 함수를 생성합니다. count가 변경될 때만 함수가 재생성됩니다.
const handleClick = useCallback(() => {
setCount(count + 1);
}, [count]);
return (
<div>
<h1>Parent Component</h1>
<p>Count: {count}</p>
{/* ChildComponent에 콜백 함수를 props로 전달합니다. */}
<ChildComponent onClick={handleClick} />
</div>
);
}
function ChildComponent({ onClick }) {
return (
<div>
<h2>Child Component</h2>
{/* 받은 콜백 함수를 이용하여 버튼을 렌더링합니다. */}
<button onClick={onClick}>Increment Count</button>
</div>
);
}
export default ParentComponent;
import React, { useState, useMemo } from 'react';
function FibonacciCalculator({ n }) {
// useMemo를 사용하여 fibonacci 함수의 반환 값을 기억합니다.
const fibNumber = useMemo(() => {
function fibonacci(num) {
if (num <= 1) return num;
return fibonacci(num - 1) + fibonacci(num - 2);
}
return fibonacci(n);
}, [n]);
return (
<div>
<p>
Fibonacci number at position {n} is {fibNumber}
</p>
</div>
);
}
function App() {
const [number, setNumber] = useState(1);
return (
<div>
<input
type="number"
value={number}
onChange={(e) => setNumber(parseInt(e.target.value))}
/>
<FibonacciCalculator n={number} />
</div>
);
}
export default App;
상태 로직을 여러 컴포넌트에서 추상화할 수 있다.
코드 중복을 줄이고 컴포넌트 간의 로직을 재사용할 수 있다.
또한 함수형 컴포넌트는 일반적으로 클래스 컴포넌트보다 간결하며 가독성이 높아진다.
클래스 컴포넌트는 복잡한 상태 로직을 가질 경우 코드가 복잡해지고 이해하기 어려울 수 있다.
=> Hooks를 사용하면 함수형 컴포넌트에서도 클래스 컴포넌트의 기능을 사용할 수 있으므로, 클래스 컴포넌트의 단점을 극복할 수 있다.
컴포넌트 로직을 더 작은 함수 단위로 분리할 수 있다.
=> 테스트하기 쉽고 테스트 커버리지를 높일 수 있다.
함수형 프로그래밍 모델을 강화하고, 순수 함수를 사용해 상태를 변경할 수 있도록 한다.
=> 더 예측 가능하고 안정적인 코드를 작성할 수 있게 해준다.
Hooks를 사용하면 React는 함수형 컴포넌트와 관련된 최적화를 수행할 수 있다.
=> 이는 성능을 향상시키고 메모리 누수와 같은 문제를 예방할 수 있게 도와준다.
컴포넌트의 상태 관리와 렌더링 로직을 분리할 수 있다.
=> 코드의 유지 보수성을 높이고 개발자가 컴포넌트의 동작을 더 쉽게 이해할 수 있도록 도와준다.
함수형 컴포넌트에서 클래스형 컴포넌트의 라이프사이클 메서드와 유사한 기능을 구현하기 위해 useEffect 훅을 사용할 수 있다.
컴포넌트가 처음으로 렌더링될 때 실행된다.
useEffect(() => {
// componentDidMount에 해당하는 작업 수행
}, []);
컴포넌트가 업데이트될 때마다 실행된다.
useEffect(() => {
// componentDidUpdate에 해당하는 작업 수행
}, [dependency]);
컴포넌트가 언마운트되기 전에 실행된다.
useEffect(() => {
return () => {
// componentWillUnmount에 해당하는 작업 수행
};
}, []);