React Hooks이 나오기 전까지 -> 클래스 기반의 컴포넌트를 사용해서 상태값을 관리할 수 있었지만, 클래스 기반의 컴포넌트는 유지 보수가 힘들다는 단점이 있음
이후 Hooks라는 기능이 도입되면서 함수형 컴포넌트에서도 상태를 관리할 수 있게 되었고, 이때 사용하는 함수가 useState() 임!
함수형 컴포넌트에서 상태 관리에 사용되는 함수, 상태의 초기값을 인수로 전달 받아 호출하고 상태를 나타내는 배열을 반환함
import React, { useState } from 'react';
function Example() {
// 새로운 state 변수를 선언하고, 이것을 count라 부르겠습니다.
const [count, setCount] = useState(0);
👉 위의 예제와 같이 "state 변수"를 선언할 수 있음
👉 state의 초기값을 넘겨줘야 한다.
👉state 변수, 해당 변수를 갱신할 수 있는 함수 이 두 가지 요소가 담긴 배열을 반환
이것이 바로 const [count, setCount] = useState()라고 쓰는 이유임
ㄴ 배열의 첫 번째 요소 : 현재 상태 값 (count)
ㄴ 두 번째 요소 : 상태 값을 갱신해주는 Setter 함수 (setCount)
☑️ 즉 초기에는 '상태값'이 초기값이며, 이것을 바꾸고 싶다면 상태 함수를 이용해서 변경함
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
import React, { useState } from 'react';
function Example() {
// state 변수와 해당 state를 갱신할 수 있는 함수 생성
// 인자 값으로 0(state의 초기값) 전달하여 count를 0으로 초기화
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
//사용자가 버튼을 클릭하면 setCount 함수를 호출하여 count를 갱신함
//새로운 count 변수를 Example 컴포넌트에 넘기며 해당 컴포넌트를 리렌더링
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
초기 숫자가 0인 상태에서 + 버튼을 누르면 숫자가 증가하고, - 버튼을 누르면 숫자가 감소하는 컴포넌트
// src/Counter.jsx
import React from 'react';
import { useState } from 'react';
const Counter = () => {
const [number, setNumber] = useState(0);
const plusNum = (e) => {
setNumber(preNum => preNum + 1)
}
const minusNum = (e) => {
setNumber(preNum => preNum - 1)
}
return (
<div>
<button type="button" onClick={plusNum}>+</button>
<span> {number} </span>
<button type="button" onClick={minusNum}>-</button>
</div>
);
};
export default Counter;
// src/App.jsx
import Counter from './Counter';
function App() {
return (
<div>
<Counter />
</div>
);
}
export default App;
제목과 본문을 입력할 수 있는 컴포넌트
import React, { useState } from 'react';
const Input = () => {
const [input, setInput] = useState({
title: '',
contents: ''
});
const {title, contents} = input;
const onChange = (e) => {
// 이벤트를 부른 요소의 value와 name 키의 값 가져온다.
// name은 title or contents이며
// value는 입력한 텍스트
const {value, name} = e.target;
setInput({
...input, // 기존 input 객체를 복사한 뒤
[name]: value // title or contents 키를 가진 값을 value로 설정
})
};
return (
<>
<input type="text"
name="title"
value={title}
placeholder="제목을 입력해주세요"
onChange={onChange} />
<br/>
<textarea
name="contents"
value={contents}
cols="30"
rows="10"
onChange={onChange}></textarea>
</>
);
};
export default Input;
참고
https://ko.legacy.reactjs.org/docs/hooks-state.html
https://velog.io/write?id=cc326b66-556c-49da-92da-40a74051ac0a