#useState란?
useState를 통해서 함수형 컴포넌트 내에서 상태를 관리할 수 있게 해주는 것이다. # useState(initialState)
useState를 호출하여 state 변수를 선언한다. import { useState } from 'react';
function MyComponent(){
const [ age, setAge ] = useState(28);
const [ name, setName ] = useState('Taylor');
// ...
initialState : 초기 상태 값을 지정한다.useState의 파라미터로 받은 initialState를 통해 매칭한다.setState를 통해 다른 값을 주입하여 상태를 업데이트하고 리렌더링한다. let arr = ["John", "Smith"]
// 구조 분해 할당
// 배열 해체 할당을 사용하여 배열의 각 요소를 추출하여 변수에 할당한다.
// sets firstName = arr[0]
// and surname = arr[1]
let [firstName, surname] = arr;
alert(firstName); // John
alert(surname); // Smith
// second element is not needed
let [firstName, , title] = ["Julius", "Caesar", "Consul", "of the Roman Republic"];
alert( title ); // Consul
let [a, b, c] = "abc"; // ["a", "b", "c"]
let [one, two, three] = new Set([1, 2, 3]);
user.name과 user.surname이다. let user = {};
// 예시 1
[user.name, user.surname] = "John Smith".split(' ');
// "John Smith" 문자열을 공백을 기준으로 나눈 배열을 생성하고,
배열 해체 할당을 통해 각 요소를 객체 user와 surname 프로퍼티에 할당한다.
alert(user.name); // John
alert(user.surname); // Smith
let user = {
name: "John",
age: 30
};
// `Object.entries(user)를 사용하여 `user` 객체의 각 프로퍼티를 키-값 쌍의 배열로 반환
// 배열 해체 할당을 사용하여 현재 요소의 각각의 요소를 `key`와 `value 변수에 할당
for (let [key, value] of Object.entries(user)) {
alert(`${key}:${value}`); // name:John, then age:30
}
let user = new Map();
user.set("name", "John");
user.set("age", "30");
// Map iterates as [key, value] pairs, very convenient for destructuring
for (let [key, value] of user) {
alert(`${key}:${value}`); // name:John, then age:30
}
let guest = "Jane";
let admin = "Pete";
// Let's swap the values: make guest=Pete, admin=Jane
[guest, admin] = [admin, guest];
alert(`${guest} ${admin}`); // Pete Jane (successfully swapped!)
let [name1, name2] = ["Julius", "Caesar", "Consul", "of the Roman Republic"];
alert(name1); // Julius
alert(name2); // Caesar
// Further items aren't assigned anywhere
let [name1, name2, ...rest] = ["Julius", "Caesar", "Consul", "of the Roman Republic"];
// rest is an array of items, starting from the 3rd one
alert(rest[0]); // Consul
alert(rest[1]); // of the Roman Republic
alert(rest.length); // 2
-> 값은 rest 나머지 배열 요소의 배열이다.
let [name1, name2, ...titles] = ["Julius", "Caesar", "Consul", "of the Roman Republic"];
// now titles = ["Consul", "of the Roman Republic"]
initialState는 초기에 state를 설정할 값이다.useState는 정확히 두 개의 값을 가진 배열을 반환한다.initialState와 일치한다set(설정자) 함수이다.useState는 훅이므로 컴포넌트 최상위 레벨이나 직접 만든 훅에서만 호출 가능하다.
Strict Mode에서 React는 의도치 않은 불순물을 찾기 위해 초기화 함수를 두번 호출한다.
#
setSomething(nextState)과 같은set함수
useState가 반환하는 set 함수를 사용하면 state를 다른 값으로 업데이트하고 리렌더링을 할 수 있다. const [name, setName] = useState('Edward');
function handleClick() {
setName('Taylor');
setAge(a => a + 1);
// ...
nextState는 state가 될 값이다.nextState로 전달하면 업데이터 함수로 취급한다.state를 반환해야 한다.set 함수는 다음 렌더링에 대한 state 변수만 업데이트한다.set 함수를 호출한 후에도 state 변수에는 여전히 호출 전 화면에 있던 이전 값이 담겨 있다.Object.is에 의해 현재 state와 동일하다고 판정되면, React는 컴포넌트와 그 자식들을 리렌더링하지 않는다.set 함수를 호출한 후에 화면을 업데이트한다.set 함수를 호출한 후에 화면을 업데이트한다.# 사용법 (Usage)
import { useState } from 'react';
function MyComponent() {
const [age, setAge] = useState(42);
const [name, setName] = useState('Taylor');
// ...
set 함수이다.화면의 내용을 업데이트하려면 다음 state로 set 함수를 호출한다 :
function handleClick() {
setName('Robin');
}
useState 예시 코드

import { useState } from 'react';
export default function Counter() {
const [count, setCount] = useState(0);
function handleClick() {
setCount(count + 1);
}
return (
<button onClick={handleClick}>
You pressed me {count} times
</button>
);
}
count state 변수는 숫자를 받는다. 버튼을 클릭하면 숫자가 증가한다.
import { useState } from 'react';
export default function MyInput() {
const [text, setText] = useState('hello');
function handleChange(e) {
setText(e.target.value);
}
return (
<>
<input value={text} onChange={handleChange} />
<p>You typed: {text}</p>
<button onClick={() => setText('hello')}>
Reset
</button>
</>
);
}
handleChange는 input DOM 요소에서 최신 input 값을 읽고,setText를 호출하여 state를 업데이트한다
import { useState } from 'react';
export default function MyCheckbox() {
const [liked, setLiked] = useState(true);
function handleChange(e) {
setLiked(e.target.checked);
}
return (
<>
<label>
<input
type="checkbox"
checked={liked}
onChange={handleChange}
/>
I liked this
</label>
<p>You {liked ? 'liked' : 'did not like'} this.</p>
</>
);
}
liked state 변수는 boolean을 받는다.input을 클릭하면 setLiked는 체크박스가 선택되어 있는 여부에 따라 liked state 변수를 업데이트 한다.liked 변수는 체크박스 아래의 텍스트를 렌더링하는 데 사용된다.
import { useState } from 'react';
export default function Form() {
const [name, setName] = useState('Taylor');
const [age, setAge] = useState(42);
return (
<>
<input
value={name}
onChange={e => setName(e.target.value)}
/>
<button onClick={() => setAge(age + 1)}>
Increment age
</button>
<p>Hello, {name}. You are {age}.</p>
</>
);
}
이전 state를 기반으로 state 업데이트하기
setAge(age + 1)를 세번 호출한다. function handleClick() {
setAge(age + 1); // setAge(42 + 1)
setAge(age + 1); // setAge(42 + 1)
setAge(age + 1); // setAge(42 + 1)
}
setAge(age + 1) 호출은 setAge(43) 이 된다. function handleClick() {
setAge(a => a + 1); // setAge(42 => 43)
setAge(a => a + 1); // setAge(43 => 44)
setAge(a => a + 1); // setAge(44 => 45)
}
a => a + 1 은 업데이트 함수이다.prevAge 또는 더 명확하다고 생각하는 다른 이름으로 지정해도 된다.객체 및 배열 state 업데이트
// 🚩 Don't mutate an object in state like this:
// 🚩 state 안에 있는 객체를 다음과 같이 변이하지 마세요:
form.firstName = 'Taylor';
// ✅ Replace state with a new object
// ✅ 새로운 객체로 state 교체합니다
setForm({
...form,
firstName: 'Taylor'
});
초기 state 다시 생성하지 않기
function TodoList() {
const [todos, setTodos] = useState(createInitialTodos());
// ...
createInitialTodos() 의 결과는 초기 렌더링에만 사용되지만, 여전히 모든 렌더링에서 이 함수를 호출하게 된다.
이 문제를 해결하려면, 대신 이를 useState에 초기화 함수로 전달해야 한다.
function TodoList() {
const [todos, setTodos] = useState(createInitialTodos);
// ...
함수를 호출한 결과인 createInitialTodos() 가 아니라 함수 자체인 createInitialTodos() 를 전달하고 있다.
개발 환경에서는 React가 초기화 함수가 순수한지 확인하기 위해 초기화 함수를 두번 호출할 수 있다.