input 이벤트는 <input>, <select>, <textarea>의 value 속성이 바뀔 때마다 발생한다. 따라서 react에서 이벤트를 처리하기 위해서는 이벤트 대상 정보가 필요하다.
이벤트 설정 방법
이벤트는 JSX에 다음과 같이 작성하여 설정한다.
functiontempFunc(e){//e.target : 대상 태그 객체//e.target.value : 대상 태그에 입력된 값}app.render( <inputonInput={tempFunc}/>);
input 태그와 같이 닫히는 태그가 없는 경우에도 JSX에서는 반드시 종료 처리를 해야 한다.
<input></input>
<input/>
예제 - 입력 글자 수 카운트
let text ="";functionsetText(e){ text =e.target.value;startRendering();}constapp=ReactDOM.createRoot(document.querySelector("#app"));functionstartRendering(){app.render( <div> <inputtype="text"onInput={setText}/> <span>{text.length}</span> </div> );};startRendering();
this 사용 주의사항
functionsetText(e){ text =e.target.value;//정상 코드startRendering();}
vanillaJS나 jquery에서는 this를 사용하여 value를 불러올 수 있으나, react에서 다음 코드는 사용할 수 없다.
functionsetText(e){ text =this.value;//사용 불가startRendering();}
예제 - 닉네임 검사(정규표현식)
let nickname ="";functionsetNickname(e){ nickname =e.target.value;startRendering();}constregex= /^[가-힣0-9]{2,10}$/;constapp=ReactDOM.createRoot(document.querySelector("#app"));functionstartRendering(){//닉네임의 상태에 따라 다른 화면을 렌더링let resultSpan;if(nickname.length==0){ resultSpan = <span></span> }else {constjudge=regex.test(nickname);if(judge){ resultSpan = <span>멋진 닉네임입니다!</span> }else { resultSpan = <span>닉네임은 한글과 숫자 2~10글자로 작성해주세요</span> } }app.render( <div> <inputtype="text"onInput={setNickname}/> {resultSpan} </div> );};startRendering();
점점 코드가 길어지면서 가독성이 떨어지는 것을 확인할 수 있다. 이러한 비효율성을 개선하기 위하여 클래스형 컴포넌트나 함수형 컴포넌트를 사용할 필요가 있다.