State를 만들 때는 useState()를 사용한다.
import React, { useState } from "react";
const App = () => {
const [name, setName] = useState("초기값"); // 초기값 지정필요
const handleNameChange = () => {
setName("변경 완료"); // 변경되는 이름 지정
}; // 이름을 변경하는 함수를 변수로 저장하여 정리
return (
<div>
<h1>React State</h1>
<button onClick={handleNameChange}> // 만든 변수를 이곳 { } 안에 작성
이름을 변경하는 함수가 저장된 변수
</button>
{name}
</div>
);
};
export default App;
import React, { useState } from "react";
const App = () => {
const [text, setText] = useState(""); // 초기값은 빈 문자열
const handleInputChange = (event) => {
setText(event.target.value);
};
console.log(text);
return (
<div>
<input type="text" onChange={handleInputChange} value={text} />
{/* input태그는 항상 onChange와 value를 둘 다 연결 */}
<div>{text}</div>
{/* 변수화한 값을 지정한 text값을 다른곳에서 사용 가능! */}
</div>
);
};
export default App;

React에서는 input 요소의 value 속성과 onChange 이벤트를 함께 사용하여 입력 필드의 상태를 관리하는 것이 일반적이며, 이러한 패턴을 제어 컴포넌트(Controlled Component)라고 한다.
메모리에 있는 값을 변경할 수 없는 것
let numbers = [1, 2, 3];
numbers.push(4); // 배열에 직접 요소를 추가
console.log(numbers); // [1, 2, 3, 4]
numbers.push(4)를 사용하는 방식이 문제가 되어 배열 numbers의 불변성을 깨뜨리기 때문이다.numbers에 직접적으로 새로운 요소 '4'를 추가하고 있음.let numbers = [1, 2, 3];
let newNumbers = [...numbers, 4]; // 새 배열을 생성하여 기존 배열을 변경하지 않음
console.log(numbers); // [1, 2, 3]
console.log(newNumbers); // [1, 2, 3, 4]
리액트에서는 화면을 리렌더링 할지 말지 결정할 때 state의 변화를 확인한다.
import React, { useState } from "react";
function App() {
const [dogs, setDogs] = useState(["말티즈"]);
function onClickHandler() {
// spread operator(전개 연산자)를 이용해서 dogs를 복사.
// 그리고 나서 항목을 추가.
setDogs([...dogs, "치와와"]);
}
console.log(dogs);
return (
<div>
<button onClick={onClickHandler}>버튼</button>
</div>
);
}
export default App;
import React, { useState } from "react";
function App() {
const [items, setItems] = useState([1, 2, 3]);
const addItem = () => {
// * 틀린 코드
// items.push(items.length + 1); // 배열에 직접 push = 불변성 위반, 작동안됨 => setItems 써라
// setItems(items); //
// * 옳은 코드
setItems([...items, items.length + 1]); // 전개 연산자(...)를 사용하여 배열을 직접 추가 해주기
};
return (
<div>
<button onClick={addItem}>Add Item</button>
<ul>
{items.map((item, index) => (
<li key={index}>{item}</li>
))}
</ul>
</div>
);
}
export default App;
