[Dseok의 코딩스터디] React.js useState 한방에 끝내 – 기본 개념부터 15가지의 실전 예제 제공! React.js 19
React의 useState는 함수형 컴포넌트에서 상태(state)를 관리하는 가장 기본적인 Hook입니다. 이를 사용하면 컴포넌트 내부에서 동적인 값을 저장하고 업데이트할 수 있습니다. 예를 들어, 버튼 클릭 횟수, 입력 폼 데이터, 체크박스 상태 등을 관리할 때 사용됩니다.
화살표 함수가 아닌 function 함수로 사용한 이유가 있습니다!!
급하시면 복사붙혀넣기 해도 좋지만, 직접 따라치면서 function 함수를 화살표 함수로 바꿔보시라는 취지로 넣었습니다!!
✅ useState란?
useState는 React의 내장 Hook 중 하나로, 컴포넌트의 상태를 추가할 수 있도록 도와줍니다. 기본적으로 useState는 배열을 반환하며, 첫 번째 요소는 상태 값, 두 번째 요소는 상태를 변경하는 함수(setter 함수) 입니다.
📌 useState 사용법
import { useState } from "react";
function Example() {
const [count, setCount] = useState(0); // 상태 변수 count, 상태 변경 함수 setCount
return (
<div>
<p>현재 카운트: {count}</p>
<button onClick={() => setCount(count + 1)}>+1 증가</button>
</div>
);
}
🔍 주요 특징
- useState(초기값) : 초기 상태 값을 설정할 수 있음.
- setState(새로운 값) : 상태를 업데이트하면 컴포넌트가 다시 렌더링됨.
- 상태는 개별적으로 여러 개 선언할 수 있음.
🎯 useState 실전 예제 10개 🔥
1️⃣ 버튼 클릭 시 카운트 증가
import { useState } from "react";
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<h2>카운터: {count}</h2>
<button onClick={() => setCount(count + 1)}>+1</button>
</div>
);
}
2️⃣ 입력 폼 값 관리하기
import { useState } from "react";
function InputForm() {
const [text, setText] = useState("");
return (
<div>
<input
type="text"
value={text}
onChange={(e) => setText(e.target.value)}
/>
<p>입력된 값: {text}</p>
</div>
);
}
3️⃣ 토글 기능 만들기 (ON/OFF)
import { useState } from "react";
function ToggleButton() {
const [isOn, setIsOn] = useState(false);
return (
<button onClick={() => setIsOn(!isOn)}>
{isOn ? "ON" : "OFF"}
</button>
);
}
4️⃣ 리스트에 항목 추가하기
import { useState } from "react";
function TodoList() {
const [tasks, setTasks] = useState([]);
const [task, setTask] = useState("");
const addTask = () => {
setTasks([...tasks, task]);
setTask("");
};
return (
<div>
<input value={task} onChange={(e) => setTask(e.target.value)} />
<button onClick={addTask}>추가</button>
<ul>
{tasks.map((t, index) => (
<li key={index}>{t}</li>
))}
</ul>
</div>
);
}
5️⃣ 다크모드 토글 기능
import { useState } from "react";
function DarkModeToggle() {
const [darkMode, setDarkMode] = useState(false);
return (
<div style={{ background: darkMode ? "black" : "white", color: darkMode ? "white" : "black" }}>
<button onClick={() => setDarkMode(!darkMode)}>모드 변경</button>
</div>
);
}
6️⃣ 체크박스 상태 관리하기
import { useState } from "react";
function CheckboxExample() {
const [checked, setChecked] = useState(false);
return (
<label>
<input type="checkbox" checked={checked} onChange={() => setChecked(!checked)} />
{checked ? "체크됨" : "체크 안됨"}
</label>
);
}
7️⃣ 드롭다운 메뉴 상태 관리
import { useState } from "react";
function Dropdown() {
const [selected, setSelected] = useState("apple");
return (
<select value={selected} onChange={(e) => setSelected(e.target.value)}>
<option value="apple">사과</option>
<option value="banana">바나나</option>
<option value="orange">오렌지</option>
</select>
);
}
8️⃣ 비밀번호 보이기/숨기기 기능
import { useState } from "react";
function PasswordToggle() {
const [showPassword, setShowPassword] = useState(false);
return (
<div>
<input type={showPassword ? "text" : "password"} />
<button onClick={() => setShowPassword(!showPassword)}>
{showPassword ? "숨기기" : "보이기"}
</button>
</div>
);
}
9️⃣ 모달창 열고 닫기
import { useState } from "react";
function ModalExample() {
const [isOpen, setIsOpen] = useState(false);
return (
<div>
<button onClick={() => setIsOpen(true)}>모달 열기</button>
{isOpen && (
<div style={{ background: "gray", padding: "20px", position: "absolute" }}>
<p>모달창입니다.</p>
<button onClick={() => setIsOpen(false)}>닫기</button>
</div>
)}
</div>
);
}
🔟 다중 상태 관리 (이름 & 나이)
import { useState } from "react";
function UserInfo() {
const [user, setUser] = useState({ name: "", age: "" });
return (
<div>
<input
type="text"
placeholder="이름"
value={user.name}
onChange={(e) => setUser({ ...user, name: e.target.value })}
/>
<input
type="number"
placeholder="나이"
value={user.age}
onChange={(e) => setUser({ ...user, age: e.target.value })}
/>
<p>{user.name} ({user.age}세)</p>
</div>
);
}
1️⃣1️⃣ 배열에 새로운 요소 추가하기 (할 일 목록)
import { useState } from "react";
function TodoList() {
const [todos, setTodos] = useState([]);
const [task, setTask] = useState("");
const addTodo = () => {
if (task.trim()) {
setTodos([...todos, task]); // 기존 배열에 새로운 항목 추가
setTask("");
}
};
return (
<div>
<input value={task} onChange={(e) => setTask(e.target.value)} />
<button onClick={addTodo}>추가</button>
<ul>
{todos.map((todo, index) => (
<li key={index}>{todo}</li>
))}
</ul>
</div>
);
}
✅ setTodos([...todos, task]) : 기존 배열을 복사한 후 새로운 항목을 추가하는 방식으로 업데이트합니다.
1️⃣2️⃣ 배열에서 특정 요소 삭제하기 (리스트 삭제 기능)
import { useState } from "react";
function RemoveItem() {
const [items, setItems] = useState(["사과", "바나나", "포도"]);
const removeItem = (index) => {
setItems(items.filter((_, i) => i !== index)); // 선택한 요소 제외하고 새로운 배열 생성
};
return (
<div>
<ul>
{items.map((item, index) => (
<li key={index}>
{item} <button onClick={() => removeItem(index)}>삭제</button>
</li>
))}
</ul>
</div>
);
}
✅ filter()를 사용하여 삭제할 요소를 제외한 새로운 배열을 만들어 setItems()로 업데이트합니다.
1️⃣3️⃣ 배열 내 특정 요소 수정하기 (이름 변경)
import { useState } from "react";
function UpdateItem() {
const [users, setUsers] = useState([
{ id: 1, name: "John" },
{ id: 2, name: "Alice" },
{ id: 3, name: "Bob" },
]);
const updateUser = (id, newName) => {
setUsers(
users.map((user) =>
user.id === id ? { ...user, name: newName } : user
)
);
};
return (
<div>
<ul>
{users.map((user) => (
<li key={user.id}>
{user.name}
<button onClick={() => updateUser(user.id, "변경됨")}>이름 변경</button>
</li>
))}
</ul>
</div>
);
}
✅ map()을 사용하여 특정 요소의 데이터를 변경하는 방식입니다.
1️⃣4️⃣ 배열을 활용한 좋아요 기능 (좋아요 토글)
import { useState } from "react";
function LikeFeature() {
const [likedItems, setLikedItems] = useState([]);
const toggleLike = (item) => {
if (likedItems.includes(item)) {
setLikedItems(likedItems.filter((i) => i !== item)); // 삭제
} else {
setLikedItems([...likedItems, item]); // 추가
}
};
return (
<div>
{["🍕 피자", "🍔 햄버거", "🍣 초밥"].map((food) => (
<button key={food} onClick={() => toggleLike(food)}>
{likedItems.includes(food) ? `❤️ ${food}` : `🤍 ${food}`}
</button>
))}
<p>좋아요: {likedItems.join(", ")}</p>
</div>
);
}
✅ includes()를 활용해 특정 항목이 배열에 존재하는지 확인한 후 추가/삭제를 수행합니다.
1️⃣5️⃣ 다중 선택 체크박스 관리하기
import { useState } from "react";
function MultiSelect() {
const [selected, setSelected] = useState([]);
const toggleSelect = (value) => {
if (selected.includes(value)) {
setSelected(selected.filter((item) => item !== value)); // 삭제
} else {
setSelected([...selected, value]); // 추가
}
};
return (
<div>
{["React", "Vue", "Angular"].map((framework) => (
<label key={framework}>
<input
type="checkbox"
checked={selected.includes(framework)}
onChange={() => toggleSelect(framework)}
/>
{framework}
</label>
))}
<p>선택한 항목: {selected.join(", ")}</p>
</div>
);
}
✅ 체크박스 선택/해제를 배열을 활용해 관리하는 방식입니다.
🎉 마무리 – useState 완벽 이해하고 React 개발에 적용해보자!
지금까지 useState Hook의 개념과 다양한 실전 예제들을 살펴보았습니다.
useState는 React에서 가장 기본적이면서도 중요한 상태 관리 Hook이며, 이를 잘 활용하면 컴포넌트의 동적인 UI를 쉽게 만들 수 있습니다.
특히, 입력 값 관리, 버튼 토글, 리스트 추가, 모달창 열기 등 실생활에서 자주 쓰이는 기능들을 구현할 때 아주 유용하죠!
앞으로 React 프로젝트를 진행할 때 useState를 적절히 활용하여 더 깔끔하고 효율적인 코드를 작성해보세요!
또한, Context API, useReducer와 같은 다른 상태 관리 방법과도 조합하여 더 복잡한 상태 관리 패턴도 배워보는 것을 추천합니다. 🚀
🔥 React 공부를 이어가려면?
👉 useEffect Hook을 활용한 비동기 처리 방법
👉 useReducer를 활용한 상태 관리 심화
👉 Context API를 이용한 전역 상태 관리
이제 실전 프로젝트에서 useState를 적극적으로 활용해보세요!
이 글이 도움이 되셨다면 공유 & 댓글 부탁드립니다! 😊
더 좋은 React 콘텐츠로 다시 찾아오겠습니다. 💡