React

React Hooks - useState

char1ey 2023. 5. 24. 15:19
목차
1. useState
2. 사용방법
3. 예제코드

 

1. useState

 

 

React에서 State란 Component가 가질 수 있는 상태를 의미한다.

 

useState는 컴포넌트의 상태를 간편하게 사용할 수 있도록 도와주는 함수다.

 

 

 

2. 사용방법

 

const [ state, setState ] = useState( 초기값 )

 

useState를 호출하면 인자값으로는 초기값을 넣어준다.

 

맨 처음 state에는 초기값이 들어가있고 이후에 state를 변경하고 싶다면, setState를 변경할 수 있다.

 

setState를 사용하게 되면 해당 컴포넌트는 화면에 다시 렌더링된다.(componentDIdupdate)

 

 

아래의 방법은 초기값으로 어떤 로직을 가진 함수를 호출해야될 때,

 

그 로직은 한번만 실행되야할 떄 사용하는 방법이다. 

 

아래처럼 콜백으로 함수를 호출하지않고, 그냥 넣으면 컴포넌트가 업데이트 될 떄마다

 

로직을 실행하게 되어 쓸데없는 연산을 실행하게 된다.

 

const [ state, setState ] = useState( ( ) => { return 함수( ) })

 

setState 활용방법

 

setState 함수는 setState( 바꿀 상태 )로 state를 변경할 수 있지만,

 

기존 상태에서 새로운 상태를 추가하는 배열형태를 이용할 떄는 사용하기가 까다롭다.

 

이를 위해서 setState는 다음과 같이 사용할 수 있다.

 

setState( (previousState) => { return ... })

setState 안에서 콜백함수를 만들면, 인자값으로 이전상태의 값을 불러온다.

 

이를 이용하여 이전상태에 추가할 상태를 구현하는 코드를 작성할 수 있다.

 

 

 

 

 

3. 예제코드

 

 

 

아래의 코드는 버튼을 클릭할 때마다 숫자를 올려주는 코드이다.

 

버튼을 클릭하면 setCount를 실행하여 화면을 다시 렌더시켜준다.

import { useState } from "react"

const App = () => {
    const [count, setCount] = useState(0)


    const increment = () => {
        setCount(count+1)
    }
    const decrement = () => {
        setCount(count-1)
    }

    return(
        <div>
            <div>카운터 : { count }</div>
            <button onClick={increment}>+</button>
            <button onClick={decrement}>-</button>
        </div>
    )
}

export default App

 

 

 

아래의 코드는 인풋박스에 이름을 입력하여 버튼을 클릭하면 이전 상태값을 불러와 화면에 모두 렌더시키는 코드이다.

 

import { useState } from "react"

const App = () => {
    const [students, setStudents] = useState(["Char1ey"])
    const [input, setInput] = useState('');

    const handleInputChange = (e) => {
        setInput(e.target.value)
    }

    const handleAdd = (e) => {
        setStudents(prev => {
            console.log(prev)
            return [...prev, input]
        })
    }

    return (
        <div>
            <input value={input} onChange={handleInputChange} type="text" />
            <button onClick={handleAdd}>추가</button>
            <div>{students.map((v) => {
                return <div>{v}</div>
            })}</div>
        </div>
    )
}

export default App

 

 

 

마지막으로 아래의 코드는 복잡한 로직을 가정한 함수를 실행하여 초기값을 집어 넣는 코드이다.

 

업데이트 버튼을 아무리 눌러도 로직을 가진함수는 처음 화면이 렌더될떄 한번만 실행된다.

 

import { useState } from "react"

const logic = () => {
    const arr = []
    for (let i = 0; i <= 100; i++) {
        arr.push(i)
    }
    console.log('로직함수')
    return arr
}

const App = () => {
    const [state, setState] = useState(() => logic())

    const handleClick = (e) => {
        setState(prev => [...prev, prev[prev.length - 1] + 1])
    }

    return (
        <div>
            <div>배열의 마지막 숫자: {state[state.length - 1]}</div>
            <button onClick={handleClick}>업데이트</button>
        </div>
    )
}

export default App