[리액트] Hooks - useState
2023. 4. 24. 23:20ㆍ개발/React
useState 란
- 가장 기본적인 Hook
- 함수형 컴포넌트도 가변적인 상태값을 가질 수 있도록 한다.
React 에서 useState 사용하기
import 하기
import React, {useState} from 'react'
// 시작은 import 부터 해주어야 합니다.
// 코드에서 useState를 사용하면 대부분 에디터에서 자동으로 import 됩니다
기본 사용방법
import React, { useState } from 'react';
// 변수선언자, 구조분해할당, 초기값설정 입니다.
// const [값을 담을 변수명, 값을 변경할 함수명] = useState(초기값)
// useState는 배열을 리턴합니다. 리턴된 배열을 구조분해 할당을 통해 값을 할당합니다
const [value, setValue] = useState(true)
function HookPractice() {
const changeValue = () => {
setValue(!value)
}
return (
<div>
<p>상태값 {value?'참':'거짓'}</p>
<button onClick={changeValue}>클릭하여 값 변경하기</button>
</div>
);
}
export default HookPractice;
코드에서 사용할 state값을 useState로 선언합니다.
값을 변경하는 함수를 사용해 값을 변경해 줍니다.
활용하기 1
import React, { useState } from 'react';
function HookPractice() {
const [level, setLevel] = useState(0)
// useStage를 사용하는 두가지 방법
const oneTimelevelUp = () => {
setLevel(level+1)
setLevel(level+1)
setLevel(level+1)
}
const mamyTimeslevelUp = () => {
setLevel((level) => level + 1);
setLevel((level) => level + 1);
setLevel((level) => level + 1);
}
return (
<div>
{/* useState는 배치로 동작합니다.
따라서 여러번 반복하여 나열한다고 해서
반복한 만큼 동작하는 것이 아닙니다.*/}
<p>나의 레벨은? {level}</p>
<button onClick={oneTimelevelUp}>레벨업</button>
<button onClick={mamyTimeslevelUp}>레벨파워업</button>
</div>
);
}
export default HookPractice;
useState 를 사용한 상태변경은 리액트에서 배치로 처리됩니다. 따라서 여러변화를 한번에 동작하기때문에 나열한다고 해서 반복해서 동작하지 않습니다.
반면, 함수를 사용해서 호출한 경우 3번을 동시에 명령을 내리면, 그 명령을 모아 순차적으로 각각 1번씩 실행시킵니다.
활용하기 2
import React, { useState } from 'react';
function HookPractice() {
const [legacys, setLegacys] = useState({legacy:'', legacyList:[]})
// 객체를 비롯한 참조형 데이터타입들은
// 스프레드로 변경해주어야 한다.
// 리액트는 성능을 위해 얕은 복사를 하므로
// 주소값이 변경되어야 객체의 변경유무를 인식한다.
const whatIsOurLegacy = (e) =>{
setLegacys({...legacys, legacy:e.target.value})
}
const addLegacy = () =>{
setLegacys({...legacys, legacyList : [...legacys.legacyList,legacys.legacy], legacy:''})
}
return (
<div>
{/* jsx에서는 forEach를 사용하지 못합니다. */}
<p>우리의 유산들</p><input type="text" onChange={whatIsOurLegacy} value={legacys.legacy}></input><button onClick={addLegacy}>입력하기</button>
<ul>
{
legacys.legacyList.map((item)=>{
return <li>{item}</li>
})
}
</ul>
</div>
);
}
export default HookPractice;배
객체, 배열과 같은 자바스크립트 참조형 자료형은 스프레드문법을 사용해 오브젝트의 주소를 변경해 주어야 합니다.
'개발 > React' 카테고리의 다른 글
[리액트] CRA로 리액트 프로젝트 생성 부터 Redux까지 (0) | 2023.04.26 |
---|---|
[리액트] Hooks - useEffect (3) | 2023.04.25 |
[리액트] CSS in JS, Styled Components 란 (0) | 2023.04.17 |
[리액트] State (0) | 2023.04.15 |
[리액트] Props란, Prop Drilling (칸트 도덕철학) (1) | 2023.04.15 |