๐ฉ๐ปโ๐พ
[JS/React] 1๏ธโฃ ๊ฐ๋จํ ์ผ๊ธฐ์ฅ ๋ง๋ค๊ธฐ ๋ณธ๋ฌธ
ํฌ์คํ ์ ํ๊ธฐ์ ์์ ์ฌ๋ด ํ๋๋ฅผ ์๊ธฐํ์๋ฉด,
์ธํ๋ฐ์ ๋ฆฌ์กํธ ๊ฐ์๋ค์ด ๊ฝค ๋ง๊ณ ๊ฐ๊ฐ์ ๊ฐ์๋ค์ ํด๋น ๊ฐ์๋ฅผ ์๊ฐํ๋ฉด ์ต์ 1๊ฐ์์ ๋ง๊ฒ๋ 4-5๊ฐ์ ํ๋ก์ ํธ๋ฅผ ์์ฑํ ์๊ฐ ์๋ค. ๋ด๊ฐ ์๊ฐ ์ค์ธ ๋ฆฌ์กํธ ๊ฐ์๋ '๊ฐ์ ์ผ๊ธฐ์ฅ' ํ๋ก์ ํธ๋ฅผ ๋ง๋ค ์ ์๋๋ฐ ์๋ง์ ๊ฐ์๋ค ์ค ๋ด๊ฐ ์ด ๊ฐ์๋ฅผ ์ ํํ ์ด์ ๊ฐ ์ข ํฉ๋นํ๋ค.
๋ํ๊ต 1ํ๋
๋๊ฐ ์ฑ์คํ ์ด ์ธ๊ธฐ ์ ๋ฃ ์ฑ์ 'MOODA'๋ ๊ฐ์ ์ ๊ธฐ๋กํด์ ์ผ๊ธฐ๋ฅผ ์์ฑํ ์ ์๋ ์ฑ์ด ์์๋ค. ์ฑ ์์ด์ฝ๊ณผ ์์ธ ํ๋ฉด ์ฌ์ง์ ๋ดค์ ๋, UI๊ฐ ์๋นํ ์๊ธฐ์๊ธฐ(์๊ธฐ์๊ธฐํ ๊ฑฐ์ ๋ง์์ด ์ฝํ ํธ)ํ์ฌ ๊ตฌ๋งคํ๊ฒ ๋์๊ณ 2๋
๋์์ ๊ฝค ์ ์ฌ์ฉํ ๊ฑฐ ๊ฐ๋ค.
์ฌํผ, ๊ทธ๋์ ์กธ์
์ํ์์ ๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํ๊ฒ ๋ผ์ ์ฒ์ ์ฌ์ฉํด๋ณด๋ ํฐ๋ผ ๋ฆฌ์กํธ ๊ฐ์๋ฅผ ์ฐพ์๋ณด๊ณ ์์๊ณ , ํด๋น ๊ฐ์๋ฅผ ๋ฐ๊ฒฌํ๊ฒ ๋์๋ค. ์ด ์์
์ ๋ค์ผ๋ฉด ๋ ๊ฐ์ ์ด์ง๋ MOODA ๊ฐ์ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด ๋ณผ ์ ์๋ค๋๋ผ๋ ์ ๊ธฐํ ๋ง์์ด ๋ค์ด์ ์ ํํ๊ฒ ๋์๋ค...ใ
(๋ฆฌ๋ทฐ๋ ๋ง๊ธด ํ๋ค...)


๋ณธ๋ก ์ผ๋ก ๋์์์, ์ด๋ฒ ํฌ์คํ ์์๋ ๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ ์ผ๊ธฐ์ฅ ํ์ ๊ตฌํํ ์ฝ๋์ ๋ํด ์์ฑํ๋๋ก ํ๊ฒ ์ต๋๋ค. (์ดํ์ ๊ธฐ๋ฅ๋ค์ด ์ถ๊ฐ๋ ๋๋ง๋ค ํด๋น ๊ธ์ ์ด์ด์ ํฌ์คํ ์ ์ ๋ก๋ํ๋๋ก ํ๊ฒ ์ต๋๋ค.)

๐ ๊ตฌํํ ์ผ๊ธฐ์ฅ์ ๊ตฌ์กฐ
์๋จ - ์์ฑ์
์ค์ - ์ผ๊ธฐ๋ด์ฉ
ํ๋จ - ๊ฐ์ ์ง์
์ด๋ ๊ฒ 3๊ฐ์ input์ ์ ๋ ฅ ๋ฐ์์ ๋ฒํผ์ ๋๋ ์ ๋, ์ ์ฅ ์ฑ๊ณตํ๋ค๋ ์๋ฆผ์ด ๋ธ
๐ฉ๐ปโ๐ป ์ ์ฒด ์ฝ๋
import React, { useState, useRef } from "react";
const DiaryEditor = () => {
const [state, setState] = useState({
author: "",
content: "",
emotion: 1,
});
const authorInput = useRef(); // focus()๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด Input์ฐฝ์ ์ ๊ทผ
const contentInput = useRef();
const handleChangeState = (e) => {
setState({
...state,
[e.target.name]: e.target.value,
});
};
const handleSubmit = () => {
if (state.author.length < 1) {
authorInput.current.focus();
return;
}
if (state.content.length < 5) {
contentInput.current.focus();
return;
}
alert("์ผ๊ธฐ ์ ์ฅ ์ฑ๊ณต");
};
return (
<div className="DiaryEditor">
<h2>์ค๋์ ์ผ๊ธฐ</h2>
<div>
<input
ref={authorInput}
name="author"
value={state.author}
onChange={handleChangeState}
></input>
</div>
<div>
{/* ์ฌ๋ฌ ์ค ์
๋ ฅ ๊ฐ๋ฅ */}
<textarea
ref={contentInput}
name="content"
value={state.content}
onChange={handleChangeState}
></textarea>
</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}>Save</button>
</div>
</div>
);
};
export default DiaryEditor;
const [state, setState] = useState({
author: "",
content: "",
emotion: 1,
});
const authorInput = useRef(); // focus()๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด Input์ฐฝ์ ์ ๊ทผ
const contentInput = useRef();
โฌ๏ธ ์ ์ฒด ์ฝ๋์์ ํด๋น ์ฝ๋๋ input์ผ๋ก ๋ค์ด์ค๋ ์ ๋ ฅ๊ฐ๋ค์ ์ด๊ธฐ๊ฐ๊ณผ ์ดํ์ focus ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ํด ๊ฐ์ฒด์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋๋ก ์ ์ธํด ๋์ ๋ณ์๋ค์ ๋๋ค.
์ด์ , handleChangeState() ํจ์์ handleSubmit() ํจ์๋ฅผ ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
const handleChangeState = (e) => {
setState({
...state,
[e.target.name]: e.target.value,
});
};
โฌ๏ธ ์ด ํจ์๋ ์์ฑ์, ์ผ๊ธฐ๋ด์ฉ, ๊ฐ์ ์ง์๊ฐ input์ผ๋ก ์ ๋ ฅ์ด ๋ค์ด์์ ๋ onChange ์ด๋ฒคํธ์์ ์ฌ์ฉ๋๋ ํจ์์ ๋๋ค.
spread ์ฐ์ฐ์๋ก useState๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ํ ์ด๊ธฐ๊ฐ๋ค์ ์ฌ์ฉํ๋, ์ ๋ ฅ ๋ค์ด์จ ๊ฐ์ฒด์ value๊ฐ์ ๋ณ๊ฒฝํด์ค๋๋ค.
const handleSubmit = () => {
if (state.author.length < 1) {
authorInput.current.focus();
return;
}
if (state.content.length < 5) {
contentInput.current.focus();
return;
}
alert("์ผ๊ธฐ ์ ์ฅ ์ฑ๊ณต");
};
โฌ๏ธ ์ด ํจ์๋ ์์ฑ์๋ฅผ ์ ๋ ฅํ๋ ์นธ์ด๋ ์ผ๊ธฐ ๋ด์ฉ์ ์ ๋ ฅํ๋ ์นธ์ ์ผ์ ๊ธ์์๋ฅผ ์ฑ์ฐ์ง ์๊ณ Save ๋ฒํผ์ ๋๋ ์ ๋, onChange ์ด๋ฒคํธ์์ ์ฌ์ฉ๋๋ ํจ์์ ๋๋ค.
์ด๋, useRef๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋๋ก ํ์์ผ๋ฏ๋ก '๋ณ์๋ช '.current.focus();๋ฅผ ์ฌ์ฉํ์ฌ focus ๊ธฐ๋ฅ์ ์ฃผ๊ฒ ๋ฉ๋๋ค.
๊ธ์์๋ฅผ ๋ชจ๋ ๋ง์กฑํ๋ค๋ฉด ์๋ฆผ์ฐฝ์ด ๋จ๊ฒ ๋ฉ๋๋ค.
๊ฐ๊ฐ์ ์ปดํฌ๋ํธ๋ค์ ์์ฑํ๋ ๊ณผ์ ์ ์ด๋ ต์ง ์์ผ๋ฏ๋ก ์ ์ฒด ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์๋ฉด ๋๊ฒ ์ต๋๋ค๐
'Language > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ธํ๋ฐ/JS] ๋๊ธฐ & ๋น๋๊ธฐ ๊ฐ๋ (0) | 2023.04.09 |
---|---|
[JS] ํ๋ก๊ทธ๋จ์์ ์ ๋ ฅ ๋ฐ๊ณ ์ถ๋ ฅํ๋ ๋ฐฉ๋ฒ (0) | 2023.03.21 |