๐ React ์ ๋ฌธ โ ซ - Form
๐ React ์
๋ฌธ โ
ซ - Form
๐
ใ์ํ์ ์ฒ์ ๋ง๋ ๋ฆฌ์กํธใ
๋ฅผ ์ฝ๊ณ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
Form
์ด๋?
Form
์ ์ฌ์ฉ์๋ก๋ถํฐ ์ ๋ ฅ์ ๋ฐ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.HTML
์Form
์Element
๋ด๋ถ์ ๊ฐ๊ฐ์ ์ํ๊ฐ ์กด์ฌํ๋ค.- ๋ฐ๋ฉด
React
์Form
์Component
๋ด๋ถ์์State
๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ค.
โ
HTML
์ Form
1
2
3
4
5
6
7
<form>
ย ย ย ย <label>
ย ย ย ย ์ด๋ฆ :
ย ย ย ย ย ย ย ย <input type="text" name="name"/>
ย ย ย ย </label>
ย ย ย ย <button type="submit">์ ์ถ</button>
</form>
- ์๊ธฐ ์ฝ๋๋
HTML
์Form
์ด๋ค. React
์์๋ ์๋์ ํ์ง๋งJavascript
์ฝ๋๋ฅผ ํตํด ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๊ฐ์ ์ ๊ทผํ๊ธฐ๋ ๋ถํธํ ๊ตฌ์กฐ์ด๋ค.
โ
React
์ ์ ์ด Component
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function NameForm(props) {
const [value, setValue] = useState('');
const handleChange = (event) => {
setValue(event.target.value);
}
const handleSubmit = (event) => {
alert('์
๋ ฅํ ์ด๋ฆ : ' + value);
event.preventDefault();
}
return (
<form onSubmit={handleSubmit}>
<label>
์ด๋ฆ :
<input type="text" value={value} onChange={handleChange}/>
</label>
<button type="submit">์ ์ถ</button>
</form>
);
}
- ์ ์ด
Component
๋React
์ ํต์ ๋ฅผ ๋ฐ์ผ๋ฉฐ, ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ํ ์ ๊ทผ ๋ฐ ์ ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ์ ๋ ฅForm
Element
์ด๋ค. - ์๊ธฐ ์ฝ๋์ฒ๋ผ ์ ์ด
Component
๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๋ ฅ ๊ฐ์ดReact Component
State
๋ฅผ ํตํด ๊ด๋ฆฌ๋์ด ์ ๋ ฅ๊ฐ์ ์ํ๋ ๋๋ก ์กฐ์ข ํ ์ ์๊ฒ ๋๋ค. - ์๋ฅผ ๋ค์ด ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋ชจ๋ ์ํ๋ฒณ์ ๋๋ฌธ์๋ก ๋ณ๊ฒฝํด ๊ด๋ฆฌํ๊ณ ์ถ๋ค๋ฉด ๋ค์ ์ฝ๋์ ๊ฐ์ด ์์ฑํ๋ฉด ๋๋ค.
1
2
3
const handleChange = (event) => {
setValue(event.target.value.toUpperCase());
}
textarea
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function RequestForm(props) {
const [value, setValue] = useState('์์ฒญ์ฌํญ์ ์
๋ ฅํ์ธ์.');
const handleChange = (event) => {
setValue(event.target.value);
}
const handleSubmit = (event) => {
alert('์
๋ ฅํ ์์ฒญ์ฌํญ : ' + value);
event.preventDefault();
}
return (
<form onSubmit={handleSubmit}>
<label>
์์ฒญ์ฌํญ :
<textarea value={value} onChange={handleChnage}/>
</label>
<button type="submit">์ ์ถ</button>
</form>
);
}
- ์๊ธฐ ์ฝ๋๋ย
textarea
์ ์ ๋ ฅํ ๋๋ง๋คยState
์ ๊ฐ์ด ๋ฐ๋๊ณ , ๋ฐ๋ ๋๋ง๋คยtextarea
์ยvalue
์ ๊ฐ์ด ๋ฐ๋ ์ฑ๋ก ๋ค์ ๋ ๋๋ง๋๋ค. - ์ฌ๊ธฐ์์๋ย
value
ย ์ ์ธ ์ ์ด๊ธฐ ๊ฐ์ ๋ฃ์ด์ฃผ์๊ธฐ ๋๋ฌธ์ ์ฒ์ ๋ ๋๋ง ๋ ๋๋ถํฐยtextarea
์ ํ ์คํธ๊ฐ ๋ํ๋๋ค.
select
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
function FruitSelect(props) {
const [value, setValue] = useState('grape');
const handleChange = (event) => {
setValue(event.target.value);
}
const handleSubmit = (even) => {
alert('์ ํํ ๊ณผ์ผ : ');
event.preventDefault();
}
return (
<form onSubmit={handleSubmit}>
<label>
๊ณผ์ผ์ ์ ํํ์ธ์ :
<select value={value} onChange={handleChange}>
<option value="apple">์ฌ๊ณผ</option>
<option value="banana">๋ฐ๋๋</option>
<option value="grape">ํฌ๋</option>
<option value="watermelon">์๋ฐ</option>
</select>
</label>
</form>
);
}
select
ย ํ๊ทธ์์ ํน์ ๊ฐ์ ์ ํํ๋ ค๋ฉดยvalue
ย ์์ฑ์ ์ฌ์ฉํ๋ฉด ๋๋ค.- ๋ค์ค ์ ํ์ด ๊ฐ๋ฅํ๋๋ก ํ๋ ค๋ฉดย
multiple={true}
๋ฅผยselect
ย ํ๊ทธ์ ์์ฑ์ผ๋ก ์ถ๊ฐํ๋ฉด ๋๋ค.
input file
1
<input type="file"/>
- ์
๋ ฅ ๊ฐ์ด ์ฝ๊ธฐ ์ ์ฉ์ด๋ฏ๋ก
React
์์๋ ๋น์ ์ดComponent
๊ฐ ๋๋ค.
โ ์ฌ๋ฌ ๊ฐ์ ์ ๋ ฅ ๋ค๋ฃจ๊ธฐ
1
- ํ๋์ `Component`์์ ์ฌ๋ฌ ๊ฐ์ ์
๋ ฅ์ ๋ค๋ฃจ๋ ค๋ฉด ์ฌ๋ฌ ๊ฐ์ย `State`๋ฅผ ์ ์ธํ์ฌ ๊ฐ๊ฐ์ ์
๋ ฅ์ ๋ํด ์ฌ์ฉํ๋ฉด ๋๋ค.
โ
input null value
- ์ ์ด
Component
์ยvalue
ย ์์ฑ์ ์ ํด์ง ๊ฐ์ผ๋ก ๋ฃ์ผ๋ฉด ์ฝ๋๋ฅผ ์์ ํ์ง ์๋ ํ ์ ๋ ฅ ๊ฐ์ ๋ฐ๊ฟ ์ ์๋ค. - ๋ง์ฝย
value
ย ๊ฐ์ ๋ฃ๋ ์์ ๋กญ๊ฒ ์ ๋ ฅํ ์ ์๊ฒ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด ๊ฐ์ยundefined
ย ๋๋ยnull
์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
์ค์ต
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
85
86
87
88
89
90
91
92
const [email, setEmail] = useState('');
const [name, setName] = useState('');
const [memberList, setMemberList] = useState([]);
const [page, setPage] = useState(1);
const pageSize = 10;
const startIndex = (page - 1) * pageSize;
const currentPageData = memberList.slice(startIndex, startIndex + pageSize);
return (
<Box>
<Box display="flex" gap={2} sx=>
<TextField
label="์ด๋ฉ์ผ"
variant="outlined"
size="small"
sx=
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
<TextField
label="์ด๋ฆ"
variant="outlined"
size="small"
sx=
value={name}
onChange={(e) => setName(e.target.value)}
/>
</Box>
<Box>
<TableContainer component={Paper}>
<Table sx=>
<TableHead>
<TableRow>
<TableCell sx=>์ด๋ฉ์ผ</TableCell>
<TableCell sx=>์ด๋ฆ</TableCell>
<TableCell sx=>์๊ฐ</TableCell>
<TableCell sx=>์ฒ๋ฆฌ</TableCell>
</TableRow>
</TableHead>
<TableBody>
{currentPageData.map((member) => (
<TableRow key={member.id} sx=>
<TableCell sx=>
{member.email}
</TableCell>
<TableCell sx=>
{member.name}
</TableCell>
<TableCell sx=>
{member.description}
</TableCell>
<TableCell sx=>
{member.status === null ? (
<Button
variant="contained"
color="primary"
onClick={() => createInvitation(member)}
>
์ด๋
</Button>
) : (
member.status === 'PENDING' ? (
<Button
variant="contained"
color="error"
onClick={() => deleteInvitation(member)}
>
์ทจ์
</Button>
) : (
member.status === 'ACCEPTED' ? '๊ฐ์
์๋ฃ' : '๊ฑฐ์ '
)
)}
</TableCell>
</TableRow>
))}
</TableBody>
</Table>
{memberList && (
<Pagination
count={Math.ceil(memberList.length / pageSize)}
page={page}
color="primary"
onChange={handlePageChange}
sx=
/>
)}
</TableContainer>
</Box>
</Box>
);
- ์ฑ ์์ ์ ๊ณตํ๋ ์ค์ต ์ฝ๋๊ฐ ์๋๋ผ ํ์์ ํ ์ด ํ๋ก์ ํธ์์ ๊ฐ์ ธ์จ ์ฝ๋ ์ผ๋ถ๋ถ์ด๋ค.
- ์
๋ ฅ
Form
์ ๋ฌธ์๋ฅผ ์ ๋ ฅํ ๋๋ง๋คState
๋ฅผ ๊ฐฑ์ ํ๋ค.
ํ๊ณ
Mui
์TextField
Component
๋ฅผ ์ฌ์ฉํ ์ค์ต ์ฝ๋์ธ๋ฐ, ๋ค์์๋ ์ง์ Component
๋ฅผ ๋ง๋ค์ด ๋ด์ผ๊ฒ ๋ค.
This post is licensed under CC BY 4.0 by the author.