Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- Node.js #
- React #API 호출 #async #await #fetch
- 패키지
- React #React 사용하는 이유
- useMemo #React.memo #최적화 #re-rendering
- React #Context #props drilling #useMemo
- useReducer
- Kotlin
- Common JS 모듈 시스템
- useCallback #최적화 #함수형 업데이트
Archives
- Today
- Total
세현's 개발로그
[React] 사용자 입력 처리하기(feat.일기장) 본문


◈ 사용자 입력 처리하기
일기장을 만들기 위해 DiaryEditor.js 파일을 생성해준다. 작성자와 내용을 입력하기 위해 각각 <input/>,<textarea/> 태그를 이용해 입력란을 만들어준다. 또한, 감정 점수를 선택하기 위해 <select/> 태그도 만들어주었다.
<input> 태그 = 한 줄만 입력할 수 있는 입력값
<textarea> 태그 = 여러 줄을 입력할 수 있는 입력값
입력된 값을 리액트에서 핸들링할 수 있도록 해야하는데, 이때 이전에 배운 State를 이용한다. State를 이용하기 위해 import {useState} from "react" 해주고 변수를 설정한다. 이때, 여러 변수를 한꺼번에 관리하기 위해 여러 변수를 묶어서 State를 만들어주었다.
const [state, setState] = useState({
author: "",
content: "",
emotion: 1
});
현재 필요한 입력값은 작성자=author, 내용=content인데 여기에 내용을 입력하여 변화가 생기거나, 감정 점수를 선택하여 변화가 생기면 setState 해주기 위해 handleChangeState 함수를 만들어준다.
const handleChangeState = (e) => {
setState({
...state,
[e.target.name]: e.target.value
});
};
여기서 ...state는 스프레드 연산자를 이용한 것이다. 이는 원래 있던 state를 펼쳐주고, 덧붙여서 변경하고자 하는 state의 프로퍼티를 마지막에 작성해줘야 한다. (순서 바뀌면 안 됨)
여기까지의 DiaryEditor.js의 return 속의 내용은 다음과 같다.
<div className="DiaryEditor">
<h2>오늘의 일기</h2>
<div>
<input
value={state.author}
onChange={handleChangeState}
name="author"
placeholder="작성자"
type="text"
/>
</div>
<div>
<textarea
value={state.content}
onChange={handleChangeState}
name="content"
placeholder="일기"
type="text"
/>
</div>
<div>
<span>오늘의 감정점수 : </span>
<select
name="emotion"
value={state.emotion}
onChange={handleChangeState}
>
<option value={1}>1</option>
<option value={2}>2</option>
<option value={3}>3</option>
<option value={4}>4</option>
<option value={5}>5</option>
</select>
</div>
마지막으로 저장하기 버튼을 만들어주었다.
<button onClick={handleSubmit}>일기 저장하기</button>
이때 버튼을 누르면 "저장 성공!"이라는 alert창을 띄워주기 위해 handleSubmit 함수를 만들어줬다.
const handleChangeState = (e) => {
setState({
...state,
[e.target.name]: e.target.value
});
};
DiaryEditor.js전체 코드는 다음과 같다.
import { useState } from "react";
const DiaryEditor = () => {
const [state, setState] = useState({
author: "",
content: "",
emotion: 1
});
const handleChangeState = (e) => {
setState({
...state,
[e.target.name]: e.target.value
});
};
const handleSubmit = () => {
console.log(state);
alert("저장 성공!");
};
return (
<div className="DiaryEditor">
<h2>오늘의 일기</h2>
<div>
<input
value={state.author}
onChange={handleChangeState}
name="author"
placeholder="작성자"
type="text"
/>
</div>
<div>
<textarea
value={state.content}
onChange={handleChangeState}
name="content"
placeholder="일기"
type="text"
/>
</div>
<div>
<span>오늘의 감정점수 : </span>
<select
name="emotion"
value={state.emotion}
onChange={handleChangeState}
>
<option value={1}>1</option>
<option value={2}>2</option>
<option value={3}>3</option>
<option value={4}>4</option>
<option value={5}>5</option>
</select>
</div>
<div>
<button onClick={handleSubmit}>일기 저장하기</button>
</div>
</div>
);
};
export default DiaryEditor;
◈ CSS 스타일링 하는 방법
//App.css
.DiaryEditor {
border: 1px solid gray;
text-align: center;
padding: 20px;
}
.DiaryEditor input,
textarea {
margin-bottom: 20px;
width: 500px;
padding: 10px;
}
.DiaryEditor textarea {
height: 150px;
}
.DiaryEditor select {
width: 300px;
padding: 10px;
margin-bottom: 20px;
}
.DiaryEditor button {
width: 500px;
padding: 10px;
cursor: pointer;
}
'React' 카테고리의 다른 글
[React] React에서 배열 사용하기 (feat.일기장) (0) | 2023.04.30 |
---|---|
[React] React에서 DOM 조작하기 - useRef (feat.일기장) (0) | 2023.04.29 |
[React] State와 Props (0) | 2023.04.10 |
[React] JSX 알아보기 (0) | 2023.04.10 |
[React] React App 만들기 (0) | 2023.04.02 |