form - input changes

Juyeon Lee·2022년 5월 16일
0

REACT 리액트

목록 보기
31/65

리액트에서 form이 있을 때 input changes를 어떻게 해주는지를
배웠다 아래 코드를 살펴보자

import React from "react"

export default function Form() {
    const [firstName, setFirstName] = React.useState("")
    
    console.log(firstName)
    
    function handleChange(event) {
        setFirstName(event.target.value)
    }
    
    return (
        <form>
            <input
                type="text"
                placeholder="First Name"
                onChange={handleChange}
            />
        </form>
    )
}

여기서 Challenge: update the firstName state on every keystroke 라는 챌린지가 있었는데... 혼자 했을 때 prevState=>event.target.value 이렇게 썼었다 근데 이건
예전 벨류를 변화시키고 그런게 아니라 그냥 새로 뭔가를 치면
그 벨류를 가져오는거니까 prevState안써도 되고
그냥 setFirstName(event.target.value) 이렇게 쓰면 되는거였다.

아 그리고 그 전에 form에 이렇게 onChange={handleChange} 써주고
function handleChange(event) 이 부분에 이렇게 event써줘야 함!
event.target.value는 event object 찾아보면 이렇게 설정해서
value를 알 수 있는거임..

이 다음에는 lastName도 체크하는 첼린지를 해봤는데
일단 내가 생각한데로 아래와 같이 하면 작동 되기는 된다.

import React from "react"

export default function Form() {
    const [firstName, setFirstName] = React.useState("")
    const [lastName, setLastName] = React.useState("")
    /**
     * Challenge: Track the applicant's last name as well
     */
    
    console.log(firstName, lastName)
    
    function handleFirstNameChange(event) {
        setFirstName(event.target.value)
    }
    
    function handleLastNameChange(event) {
        setLastName(event.target.value)
    }
    
    return (
        <form>
            <input
                type="text"
                placeholder="First Name"
                onChange={handleFirstNameChange}
            />
            <input
                type="text"
                placeholder="Last Name"
                onChange={handleLastNameChange}
            />
        </form>
    )
}

근데 위의 코드는 ideal하지 않음..만약 form이 100000개 있다고 하면
이렇게 duplicate하는데에도 한계가 있기 때문에 다른 방법이 있다.
그 방법은 object state를 이용해주는건데
아래와 같다.

import React from "react"

export default function Form() {
    const [formData, setFormData] = React.useState(
        {firstName: "", lastName: ""}
    )
    
    console.log(formData)
    
    function handleChange(event) {
        setFormData(prevFormData => {
            return {
                ...prevFormData,
                [event.target.name]: event.target.value
            }
        })
    }
    
    return (
        <form>
            <input
                type="text"
                placeholder="First Name"
                onChange={handleChange}
                name="firstName"
            />
            <input
                type="text"
                placeholder="Last Name"
                onChange={handleChange}
                name="lastName"
            />
        </form>
    )
}

const [formData, setFormData] = React.useState(
{firstName: "", lastName: ""}
)

이 코드에서 볼 수 있듯이 state를 firstName, lastName으로 따로
나누는게 아니라 저렇게 한번에 묶어서 formData로 써주고
useState에 firstName lastName 기본을 empty string으로 해주는거.

  function handleChange(event) {
       setFormData(prevFormData => {
           return {
               ...prevFormData,
               [event.target.name]: event.target.value
           }
       })
   }

그리고 기본 state값이 지금 2개이니까이번에는
previous Data를 사용해주어야 한다고 한다.
사실 이 부분이 잘 이해는 안가서 강의 다시 한번 보고
업데이트 해야겠음..
암튼 return해주는값은 일단 예전 값을 쭉 spread operator로
나열해준뒤 event.target.name부분을 event.target.value로 잡아줌..
흠... 여기를 왜 이렇게 잡아주는건지도 사실 아직 100%는 이해가 안갔음.

0개의 댓글