리액트에서 input 태그의 상태를 관리하는 방법
import React, { useState } from 'react'; // useState 사용
function InputTest() {
const [text, setText] = useState('');
const onChange = (e) => { // 'e'를 파라미터로 받아옴
setText(e.target.value); // e.target.value로 현재 input에서 발생한 값으로 setText 변경시켜줌
};
const onReset = () => {
setText('');
};
return (
<div>
<!--value 값을 설정해서 상태가 바뀌었을 때, input의 내용도 업데이트 시켜줌 -->
<input onChange={onChange} value={text} />
<button onClick={onReset}>초기화</button>
<div>
<b>{text}</b>
</div>
</div>
);
}
export default InputTest;
input의 개수가 여러개 일때는 input에 name을 설정하고 이벤트가 발생했을 때 값을 참조하는 것이 좋은 방법이다. useState 에서는 문자열이 아니라 객체 형태의 상태 관리를 해주어야 한다.
// 객체 형태로 두 input 태그의 name 속성값을 초기화
// 사용할 문자열들을 저장하는 객체 형태로 관리
const [ inputs, setInputs ] = useState({
title: '',
content: '',
isDone: false
});
const { title, content, isDone } = inputs;
inputs[title] = value;
이런식으로 직접 수정하면 안된다.const onChangeHandler = (event) => {
const { name, value } = event.target; //event.target에서 name과 value 추출
console.log("name", name); // name은 input 태그의 name을 가져옴
console.log("value", value); // value는 input 태그에서 입력되고 있는 value 값을 가져옴
console.log("name:" , name , " [name]:" , [name], " value:", value); //name: title [name]: ['title'] value: "내가 입력하고 있는 값"
setInputs({
...inputs, // 기존 inputs 객체 복사 -> 새로운 객체 생성
[name]: value // name 키를 가진 값을 value로 변경
});
};
input에서 작성한 값을 todo 라는 객체에 등록시켜줘야 한다.
const [ todos, setTodos ] = useState([ // 초기값 설정
{
id: 1,
title : "할 일1",
content: "content1",
isDone: true
},
{
id: 2,
title : "할 일2",
content: "content2",
isDone: false
}
]); // 객체 배열 넣기
const onClickHandler = () => {
// todo 새로운 값 등록
setTodos([...todos, {id: todos.length+1, title: title, content: content, isDone: isDone}])
// input 초기화
setInputs({
title: '',
content: '',
})
}
return (
<div className="">
<CreateTodo
title={title}
content={content}
onChange={onChangeHandler}
onCreate={onClickHandler}
/>
</div>
);
function CreateTodo({ title, content, onChange, onCreate }) {
return (
<div className='create'>
<div className='container'>
<span className='span'>제목</span>
<input
className='input'
name="title"
placeholder="제목"
onChange={onChange}
value={title}
/>
</div>
</div>
);
}