React

[React]리액트에서 여러 input 태그 다루기-배열 비구조화 할당

이지영 2022. 7. 6. 20:45

배열 비구조화 할당

const user = ['hi', 'jy'];
// user 배열 안에 있는 값을 userOne과 userTwo에 담는 일반적인 방법
const userOne = user[0];
const userTwo = user[1];
// 배열 비구조화 할당을 사용한 방법
const [userOne, userTwo] = user;

리액트의 useState에서의 비구조화 할당

const [word, setWord] = useState('');

useState 함수의 인자에는 상태의 초기값이 들어간다. 타입은 어느 것이든 상관없다. 함수를 호출하면 배열이 반환된다. 배열의 첫 번째 원소는 현재 상태, 두 번째 원소는 상태를 바꿔주는 Setter 함수다. 배열 비구조화 할당을 통해 이름은 자유롭게 정할 수 있다.

input 여러 개 다루기

 

function InputSample (){
	const [inputs, setInputs] = ({
		name : '',
  		nickname : '',
 	})
  
 	const {name , nickname} = inputs; // 비구조화 할당을 통해 값 추출
  
  	const onChange (e) =>{
 		const {name, value} = e.target; // 우선 e.target 에서 name 과 value 를 추출
  		setInputs({
    		...inputs, // 기존의 input 객체를 복사한 뒤
        	[name] : value;  // name 키를 가진 값을 value 로 설정
    	    })
   	 };
    
        const onReset = () => {
        setInputs({
          name: '',
          nickname: '',
        })
      };

    
 	retrun (
  		<div>
 		 <input name = "name" onChange = {onChange}  value={name}/>
    		 <input name = "nickname" onChange = {onChange}  value={nickname} />
   		 <button onClick={onReset}>초기화</button>
  		</div>
 	 </div>
  )
  }

 

input 태그가 많을 때, input 값을 state에 넣기 위해 여러 개의 메서드를 만들어도 되지만,  더 좋은 방법은 input에 name 이라는 값을 설정하고 event가 발생했을때 이값을 참조 해주는것

usestate에서는 여러개의 문자열을 가지고있는 객체 형태의 상태를 관리 해줄 것

 

리액트 상태에서 객체를 수정해야 할 때에는,

inputs[name] = value;

이런식으로 직접 수정하면 안됨

그 대신에, 새로운 객체를 만들어서 새로운 객체에 변화를 주고, 이를 상태로 사용해주어야 합니다.

setInputs({
  ...inputs,
  [name]: value
});

spread 문법을 사용해서 기존의 상태를 한 번 복사하고 거기에다 특정 값을 덮어 씌우고 그것을 새로운 상태로 설정해주고 있다. 이렇게 해주는 것을 '불변성을 지킨다'라고 한다.

불변성을 지켜주어야만 리액트 컴포넌트에서 상태가 업데이트됐음을 감지할 수 있고 이에 따라 필요한 렌더링이

발생하게 된다.

 

💛객체 상태를 업데이트 할때에는 '...' spread 문법을 사용해서 객체를 복사하고 나서 특정 값을 덮어 씌워 상태를업데이트해줘야 한다는 것을 기억하자.💛

 

다음으로 각 input에서 name을 설정해 준 것을 확인할 수 있다. name을 설정함으로써 각 input을 쉽게 컨트롤 할 수 있다. 여러 개의 input을 관리해야 할 때는 위 코드 처럼 name 값을 설정해주는 것을 기억!!