Skip to main content

controlled VS uncontrolled

  • phoneNumber input 태그에 값이 0부터 시작되면 valid, 1부터 시작되면 invalid 하게 처리하는 로직을 구현한다.
const App = () => {
const [message, setMessage] = React.useState("")
const [phoneNumber, setPhoneNumber] = React.useState("")

const handleSubmit = (event) => {
event.preventDefault()
alert(phoneNumber)
}

const handleChange = (event) => {
if (event.target.value.startsWith(0)) {
setMessage("Phone Number is valid")
setPhoneNumber(event.target.value)
} else if (event.target.value === 0) {
setPhoneNumber("")
setMessage("")
} else {
setPhoneNumber("")
setMessage("Phone number should start with zero")
}
}

return (
<form onSubmit={handleSubmit}>
<label htmlFor="phone">PhoneNumber: </label>
<br />
<input onChange={handleChange} id="phone" name="phone" value={phoneNumber}>
<p>{message}</p>
<br />
<br />
<button type="submit" disabled={!phoneNumber.length === 0 || message !== "Phone number is valid"}>Submit</button>
<p>{phoneNumber}</p>
</form>
)
}

form 태그 onSubmit 컨트롤

  • form 태그에 onSubmit 이벤트를 handleSubmit에 연결하여 이벤트를 처리한다.
  • evnet.preventDefault()를 통해 기본 동작을 방지한다(화면 리프래쉬).
  • alert를 통해 phoneNumber에 저장된 값을 출력한다.

input 태그 onChange 컨트롤

  • handleChange event값으로 들어오는 value로 0으로 시작하는지 혹은 길이가 0인지를 판단한다
  • 0으로 시작하면 setMessage에 Valid 하다는 메시지를 넣어주고 setPhoneNumber에 값을 세팅해준다.
  • 이벤트 값의 길이가 0 이면 메시지와 넘버 값을 초기화 해준다.
  • 0이 아닌 다른 값이 입력되면 setPhoneNumber는 초기화 해주고 setMessage에는 0으로 시작해야 한다는 메시지를 넣어준다.

controlled란?

  • input에 발리드한 값이 입력되면 입력조차 하지 않도록 하기 위해서는 input 태그에 value={phoneNumber}를 입력하여 valid 할때 set이 된 텍스트만 보여지도록 한다.
  • value를 state로 관리하는 값으로 넣어주는 것이 controlled 된다는 개념이다.

정리

  • validation은 onSubmit 보다는 onChange에서 처리해 주어야 UX가 좋다.
  • useState값을 바로 꺼내서 쓸때는 sync를 생각해야한다. set한 값을 바로 뒤에서 사용하면 set한 값을 불러오지 못한다.
  • 이벤트 값으로 로직 체크를 하고 값을 세팅해준다.
  • Valid한 값만 input에 넣고 싶을 때는 controlled를 사용하여 value에 state로 관리되는 값을 넣어 처리한다.
    • input의 value를 직접 관리 하는 것

참조

  • 패스트 캠퍼스 온라인 강좌(한 번에 끝내는 React의 모든 것 초격자 패키지 Online)