지선생님과 함께 상태와 이벤트 처리까지 배워봤습니다.
이번엔 렌더링과 key, 이벤트 처리 심화, 폼 제출 이벤트와 데이터 검증 에 대해 배워볼거에요.
- 렌더링과 키
리스트 렌더링과 key속성에 대해 알아본다고 하네여.
코드는 아래와 같습니다.
import React, { useState } from 'react';
function TodoList() {
const [todos, setTodos] = useState(['Learn React', 'Build a Project', 'Have Fun']);
const [newTodo, setNewTodo] = useState('');
// 새로운 할 일 추가 함수
const addTodo = () => {
if (newTodo.trim() !== '') {
setTodos([...todos, newTodo]);
setNewTodo(''); // 입력 필드 초기화
}
};
return (
<div>
<h1>Todo List</h1>
<ul>
{todos.map((todo, index) => (
<li key={index}>{todo}</li>
))}
</ul>
<input
type="text"
value={newTodo}
onChange={(e) => setNewTodo(e.target.value)}
placeholder="Enter new task"
/>
<button onClick={addTodo}>Add Todo</button>
</div>
);
}
export default TodoList;
- todos는 할 일 목록을 저장하는 배열 상태에요.
- newTodo는 새로운 할 일 항목을 임시로 저장하는 상태에요.
- addTodo 함수는 newTodo값이 공백이 아닐 때만 todos 배열에 추가하고, 입력 필드를 초기화해요.
map()을 사용해 todos배열의 각 항목을 <li> 요소로 렌더링 하고 있어요.
각 <li>에 key 속성으로 index를 부여하여 리액트가 각 항목을 고유하게 식별할 수 있도록 했다고 하네여.
이제 TodoList컴포넌트를 App.js에 추가해줍니다.
코드
// src/App.js
import React from 'react';
import TodoList from './TodoList';
function App() {
return (
<div className="App">
<TodoList />
</div>
);
}
export default App;
서버를 실행하고 들어가보면?
이제 하나를 추가해볼게여.
잘되는데? 좋은데~?
이런식으로 key속성은 리액트가 각 리스트 항목을 효율적으로 업데이트 할 수 있도록 도와준다고 해요.
실제로는 배열의 인덱스보다는 고유한 ID를 key로 사용하는 것이 더 좋다고 하네요 지선생님이.
인덱스를 사용하면 리스트 항목의 순서가 바뀌거나 삭제될 때 예기치 않은 문제가 발생할 수 있기 때문이라고 합니다.
이제 다음은 이벤트 처리 심화!
- 이벤트 처리 심화
이번에는 이벤트 처리를 통해 텍스트 입력받고, 체크박스, 드롭다운 이런거 관리한다고 하네요.
바로 해봐 그냥
코드
import React, { useState } from 'react';
function FormExample() {
const [text, setText] = useState('');
const [isChecked, setIsChecked] = useState(false);
const [selectedOption, setSelectedOption] = useState('option1');
// 입력 필드 이벤트 처리
const handleTextChange = (e) => {
setText(e.target.value);
};
// 체크박스 이벤트 처리
const handleCheckboxChange = (e) => {
setIsChecked(e.target.checked);
};
// 드롭다운 메뉴 이벤트 처리
const handleSelectChange = (e) => {
setSelectedOption(e.target.value);
};
return (
<div>
<h1>Form Example</h1>
{/* 텍스트 입력 필드 */}
<label>
Text:
<input type="text" value={text} onChange={handleTextChange} />
</label>
<p>Entered Text: {text}</p>
{/* 체크박스 */}
<label>
<input type="checkbox" checked={isChecked} onChange={handleCheckboxChange} />
Accept Terms
</label>
<p>Checkbox is {isChecked ? 'checked' : 'unchecked'}</p>
{/* 드롭다운 메뉴 */}
<label>
Select Option:
<select value={selectedOption} onChange={handleSelectChange}>
<option value="option1">Option 1</option>
<option value="option2">Option 2</option>
<option value="option3">Option 3</option>
</select>
</label>
<p>Selected Option: {selectedOption}</p>
</div>
);
}
export default FormExample;
- 텍스트 입력 필드 : onChange 이벤트 핸들러 handleTextChange로 입력된 값을 text 상태에 업데이트한대여
- 체크박스 : onChange 이벤트 핸들러 handleCheckboxChange로 체크 여부를 isChecked 상태에 저장한대여.
- 드롭다운 메뉴 : onChange 이벤트 핸들러 handleSelectChange로 선택된 옵션을 selectedOption 상태에 업데이트 한대여.
App에 추가하고 확인해볼게여.
// src/App.js
import React from 'react';
import FormExample from './FormExample';
function App() {
return (
<div className="App">
<FormExample />
</div>
);
}
export default App;
이제 텍스트 입력하고, 체크박스 체크하고, 드롭다운을 바꾸면?
각 요소의 밑에 상태를 표현해주는 곳도 바뀔거에요.
잘 되는데? 신기하네여.
이렇게 실시간으로 업데이트가 되나봐여. 잘 써먹어야 할텐데...
이제 오늘거 마지막! 폼 제출 이벤트와 데이터 검증을 해볼거에요.
- 폼 제출 이벤트 및 데이터 검증
간단하게 폼을 만들고 유효성검사? 하는걸 해보나봐요.
일단 해봐. 즉시.
코드
import React, { useState } from 'react';
function FormWithValidation() {
const [name, setName] = useState('');
const [email, setEmail] = useState('');
const [error, setError] = useState('');
// 폼 제출 이벤트 핸들러
const handleSubmit = (e) => {
e.preventDefault(); // 폼의 기본 제출 동작을 막음
// 유효성 검사
if (name.trim() === '') {
setError('Name is required.');
return;
}
if (!email.includes('@')) {
setError('Email must be valid.');
return;
}
// 에러가 없으면 성공 메시지 표시
setError('');
alert(`Form submitted!\nName: ${name}\nEmail: ${email}`);
};
return (
<div>
<h1>Form with Validation</h1>
<form onSubmit={handleSubmit}>
{/* 이름 입력 */}
<label>
Name:
<input
type="text"
value={name}
onChange={(e) => setName(e.target.value)}
/>
</label>
<br />
{/* 이메일 입력 */}
<label>
Email:
<input
type="email"
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
</label>
<br />
{/* 에러 메시지 */}
{error && <p style={{ color: 'red' }}>{error}</p>}
{/* 제출 버튼 */}
<button type="submit">Submit</button>
</form>
</div>
);
}
export default FormWithValidation;
- handleSubmit : e.preventDefault()로 폼의 기본 제출 동작을 막고 유효성 검사를 하는 함수래여.
- 유효성 검사 : 이름이 비어있거나, 이메일에 @가 포함되지 않으면 에러메시지를 출력한다고 하네여.
- 에러 메시지 : error 상태에 에러 메시지를 저장하고, 이것을 화면에 표시해 사용자에게 알려준대여.
아 즉시 확인해봐
// src/App.js
import React from 'react';
import FormWithValidation from './FormWithValidation';
function App() {
return (
<div className="App">
<FormWithValidation />
</div>
);
}
export default App;
이렇게 하고 예외상황을 만들어 볼게여
왼쪽은 아무것도 입력 안한건데 이름 먼저 체크를 해서 이름이 없다고 하네여.
오른쪽은 골뱅이 안넣어보니까 저렇게 잘 체크해주네여
이렇게 간단하게? 폼 제출과 유효성 검증을 해봤어요.
사용자 입력을 제어하고 검증하는 방법을 아주 간단하게 배워봤습니다.
이걸 좀 더 발전시키면 더 복잡한 폼이나 데이터 검증 로직도 구현할 수 있다고 하네여.
이제 다음 주제는
이런걸 해보라고 하네여 지선생님이 !
그래서 그냥 하나하나 다 해보자고 했습니다.
째깐하게 만들었던 TodoList를 좀 더 고도화 하는것을 다음 포스트에 해보겠습니다!!
오늘은 끝.
'React' 카테고리의 다른 글
GPT로 배워보는 리액트 - 6(React Router) (3) | 2024.11.30 |
---|---|
GPT로 배워보는 리액트 - 5(TodoList 만들기) (3) | 2024.11.25 |
GPT로 배워보는 리액트 - 3(상태와 이벤트 처리) (0) | 2024.11.11 |
GPT로 배워보는 리액트 - 2 (리액트 기본 개념, 실습) (0) | 2024.11.11 |
GPT로 배워보는 리액트 - 1 (2) | 2024.11.11 |