본문 바로가기
컴퓨터/React

[React] 리액트 여러 인풋값 한 번에 관리/인풋을 하나의 객체로

by 도도새 도 2023. 8. 10.

리액트 여러 인풋 값 관리

 

여러 인풋값 관리에 대한 해결 방법을 고민하던 중, 찾아서 코드로 정리한다.

 

일반적으로 아래 방법을 사용한다.

<input type="text" name="title" onChange={(e)=>{setTitle(e.target.value)}} value={title}/>

 

 

하지만 이 글에서는 input값들을 하나의 객체 state형태로 관리할 것이다.

 

해결

 

우선 아래와 같이 useState를 생성한다. 각각 name값이 title, content, fileName인 인풋(텍스트 에어리어) 태그에 대해서 적용할 것이다.

 

let [inputs, setInputs] = useState({
        title:'',
        content:'',
        content2:''
    });

 

<input type="text" name="title" onChange={handleChange} value={inputs.title}/>
<textarea name="content" value={inputs.content} onChange={handleChange} />
<input name="content2" value={inputs.content2}  onChange={handleChange}/>

 

useState에 의해 초기 값은 빈 값을 주게 된다. 저기서 핵심은 onChange={handleChange} 부분이다.

function handleChange(evt:any){
        const {value, name} = evt.target;
        console.log(inputs);
        setInputs({
            ...inputs,
            [name]:value
        })
    }

위 함수는 js의 각종 기능을 상당히 사용하고 있다. 우선 …inputs으로 스프레드 연산을 한다. (…)을 사용한 부분이다.

 

스프레드 연산을 하면 각 값을 다시 할당할 수 있게 된다. 즉, 기존 값이 test:’1’, content:’2’라면, setInputs에 들어가는 객체 ({})에 아래와 같이 삽입된다.

{
    text:'1',
    content:'2'
}

다음으로 [name]:value 부분을 봐야한다. 여기서 []는 computed property이다. 컴퓨티드 프로퍼티는 컴파일 시 값이 결정된다. 즉, 키값에 변수를 삽입할 수 있다는 의미이다.

 

const {value, name} = evt.target;

위 부분에서 evt.target에는 이벤트를 일으킨 객체가 들어간다. 그리고 {value, name}은 구조 분해 할당으로 해당 객체 중 키값이 value인 것과 name인 것을 받아온다.

 

즉, name에는 실제 인풋 태그(텍스트 에어리어 태그) name 속성의 값(name=”title”)이 담기게 되고, value에는 실제 입력값이 담기게 된다.

 

즉 아래의 경우

<input type="text" name="title" onChange={handleChange} value={inputs.title}/>

[name] 에는 title이 value에는 이 태그의 실제 값이 담기게 된다는 것이다.

 

이 방법으로 여러 인풋 태그를 쉽게 관리 가능하게 되었다.

 

 

이걸 사용하는 것이다!

function handleChange(evt:any){
        const {value, name} = evt.target;
        console.log(inputs);
        setInputs({
            ...inputs,
            [name]:value
        })
    }

댓글