React
[React] 함수형 컴포넌트 배열 렌더링 실습
s._.young01
2023. 1. 6. 01:08
728x90
반응형
☞ App.js
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import './App.css';
import Sample from './components/Sample';
function App() {
return (
<div className="App">
<Sample/>
</div>
);
}
export default App;
|
cs |
☞ Sample.js
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
import React, { useState } from "react";
const Sample = () => {
// names에는 아래의 객체들의 상태가 담겨져있다
// setNames는 names의 상태를 업데이트 해주는 함수가 담겨져있다
const [names, setNames] = useState([
{
id: 1,
text: "귤"
},
{
id: 2,
text: "팥빙수"
},
{
id: 3,
text: "눈"
},
{
id: 4,
text: "붕어빵"
}
])
// input 상태관리
// inpuText에는 input의 상태가 담겨져있다 (빈 문자열이 기본 상태)
// setInputText에는 input의 상태를 업데이트 해주는 함수가 담겨져있다
const [inputText, setInputText] = useState("");
// id 상태관리
// nextId에는 names.id의 값이 5인 상태가 담겨져있다
// setNextId에는 nextId의 상태를 업데이트 해주는 함수가 담겨져있다
const [nextId, setNextId] = useState(5);
// 이벤트 연결
// 이벤트 발생 시 input의 값이 변경되는 함수
// 이 때 input의 상태 업데이트 함수를 호출
const onChange = (e) => setInputText(e.target.value);
// 추가 버튼 클릭했을 때
const onClick = () => {
// nextNames 변수 안에 객체가 담긴 배열을 담아줌
const nextNames = [
// 기존 names객체에
...names,
// id 값이 nextId, text 값이 inputText인 객체를 덮어씌워줌
{
id: nextId,
text: inputText
}
];
// 클릭 했을 때의 상태 업데이트
setInputText(""); // inputText를 다시 빈 문자열 상태로 업데이트
setNames(nextNames); // names 상태 업데이트
setNextId(nextId + 1) // 기존 nextId값에 1을 더한 값으로 업데이트
}
// 삭제 버튼 클릭했을 때
const onRemove = () => {
// id 값이 3이면 id 값이 3이 아닌 id 값을 가지고 있는 친구들을 배열로 담아줌
const nextNames = names.filter(name => name.id !== id);
// 클릭 했을 때의 상태 업데이트
setNames(nextNames); // names 상태 업데이트
}
// li들을 배열로 돌려서 화면에 출력해보자
// map을 쓸 때는 key값을 줘야하는데, 이유는
// li의 순서를 알 수 있도록 고유한 key값을 지정해준다
const namelist = names.map((name, index) =>
<li key={index}>{name.text}
{/* 전달할 id 값이 있어서 함수 자체를 중괄호 안에 넣어줌 */}
<button onRemove={() => onRemove(name.id)}>삭제</button>
</li>);
return (
<div>
<input value={inputText} onChange={onChange}/><button onClick={onClick}>추가</button>
<ul>
{namelist}
</ul>
</div>
)
}
export default Sample;
|
cs |
728x90