๐ ๏ธ ๊ตฌํํ ๊ธฐ๋ฅ
์น ์ฌ์ดํธ ๋ด์์ ์ฌ์ฉ์๋ค์ด ์์ ๋กญ๊ฒ ๋ง์ง ์ถ์ฒ ๊ธ์ ์ฌ๋ฆด ์ ์๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ ์ถ๋ค.
As-Is: ํ์ฌ๋ ๊ธฐ์กด์ ์ฌ๋ผ์จ ๊ธ์ ๋ณผ ์ ์๊ธฐ๋ง ํจ
โก๏ธ To-be: ๋ง์ง ์ ๋ณด ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๊ธ์ Create, Read, Update ๊ทธ๋ฆฌ๊ณ ์ญ์ ๋ฒํผ์ ๋๋ฅด๋ฉด Delete ํ ์ ์๋ค.
๐ก ๊ตฌํ ๊ณผ์ - Create
1. input ์นธ์ ๋ง๋ ๋ค.
input์ ํ์ ์ ์๋์ ๊ฐ์ด ๋ค์ํ๋ ๊ณจ๋ผ์ ํ์ฉํด ๋ณด์.
// ์์๋๋ก
<input type = "date" />
<input type = "range" />
<input type = "checkbox" />
<input type = "input" /> or ๊ทธ๋ฅ <input/>
<input/> <select/>
<textarea/>
2. onChange ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ํ์ฉํ๋ค.
onChange ๋๋ onInput๋ผ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ฌ์ฉํด ์ฌ์ฉ์๊ฐ <input>์ ๋ฌด์ธ๊ฐ ์ ๋ ฅ ์, ์ค๊ดํธ ์์ ์๋ ์ฝ๋๊ฐ ์คํ๋๋๋ก ํ๋ค.
<input onChange={() => {console.log("์ฌ์ฉ์๊ฐ ์
๋ ฅํ๋ฉด ๋ํ๋๋ ๋ด์ฉ")}} />
์๋์ ๊ฐ์ด ์ฌ์ฉ์๊ฐ ๋ฌด์ธ๊ฐ๋ฅผ ์ ๋ ฅํ๋ฉด, ์์ ์๋ ์ฝ๋๊ฐ ์คํ๋๋ ๊ฒ์ด ๋ณด์ธ๋ค. ์ด์ธ์๋ ์คํฌ๋กค, ๋ง์ฐ์ค ์ค๋ฒ ๋ฑ๋ฑ ์๋ง์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ค์ด ์๋๋ฐ, ์ด๋ ๊ตณ์ด ์ธ์ธ ํ์๋ ์๊ณ ํ์ํ ๋๋ง๋ค ๊ทธ๋๊ทธ๋ ๊ฐ๋ค ์ฐ๋ฉด ๋๋ค.
3. input์ ์ ๋ ฅํ ๊ฐ์ ๊ฐ์ ธ์จ๋ค.
ํ๋ผ๋ฏธํฐ๋ฅผ ํ๋ ์ถ๊ฐํ๋ค. ์๋ฌด๊ฑฐ๋ ์จ๋ ๋๋ฉฐ ๋ด๊ฐ ์ ๋ ฅํ 'e'๋ ๋ณดํต ์ด๋ฒคํธ ๊ฐ์ฒด๋ผ๋ ์ญํ ์ ํ๋๋ฐ, input ํ๊ทธ์์ ๋ฐ์ํ๋ ์ด๋ฒคํธ์ ๊ด๋ จ๋ ์ฌ๋ฌ ๊ธฐ๋ฅ๋ค์ด ์ด ํ๋ผ๋ฏธํฐ ์์ ๋ด๊ฒจ ์๋ค. ์ด e์ .target์ ๋ถ์ด๋ฉด ํด๋น ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ html ํ๊ทธ๊ฐ ๋ฌด์์ธ์ง ์๋ ค์ค๋ค.
<input onChange={(e) => {console.log(e.target)}} />
๋๋ถ์ด, e.target ๋ค์ .value๋ฅผ ๋ถ์ด๋ฉด, ํด๋น ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ html ํ๊ทธ์ ์ ๋ ฅํ '๊ฐ'์ด ๋์จ๋ค. ๋ฐ๋ผ์ '์ ๋ ฅ'์ด๋ผ๊ณ ์ ๋ ฅํ๋ฉด ใ ๋ถํฐ ๋ง์ง๋ง ใฑ๊น์ง ์ฝ์์ ์ฐํ๋ค.
<input onChange={(e) => {console.log(e.target.value)}} />
4. input์ ์ ๋ ฅํ ๊ฐ์ ์ ์ฅํ๋ค.
์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๊ฐ์ ๋ณดํต ๋ณ์๋ state์ ์ ์ฅํด ๋๋๋ฐ, ์ฌ๊ธฐ์๋ state์ state ๋ณ๊ฒฝ ํจ์๋ฅผ ๋ง๋ค์ด์ ์๊น ์จ๋ console.log ๋ถ๋ถ์ ๋ฃ์ด์ฃผ์. ๊ทธ๋ผ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๊ฐ์ด state์ ์ ์ฅ๋๋ค.
let [inputValue, setInputValue] = useState('');
// ... ์๋ต
<input onChange={(e) => {setInputValue(e.target.value)}} />
์ด?
๊ทธ๋ฐ๋ฐ ์ฒ์์ ์ ๋ ฅํ ๊ฐ์ด ์ฝ์์ ์ฐํ์ง ์๊ณ , ๋ ๋ฒ์งธ ์ ๋ ฅํ ๊ฐ๋ถํฐ ์ฐํ๋ค.
์ ๊ทธ๋ด๊น?
state ๋ณ๊ฒฝ ํจ์๋ ๋ฆ๊ฒ ์ฒ๋ฆฌ๊ฐ ๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ก '๋น๋๊ธฐ์ '์ผ๋ก ์ฒ๋ฆฌ๊ฐ ๋๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ, state๊ฐ ๋ณ๊ฒฝ๋๊ธฐ ์ ์ console์ ์๋ ์ค์ ์คํํด ์ฃผ๋ ๊ฒ์ด๋ค.
๐ก ๊ตฌํ ๊ณผ์ - Read, Update
1. state ๋ณ๊ฒฝ ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
์๋ก์ด ๊ธ์ด ์ถ๊ฐ๋๋๋ก ํ๋ ค๋ฉด ์ ๋ ฅ๋ ๋ด์ฉ์ ์ ์ฅํ๊ณ ํ์ํด์ผ ํ๋ค. ํ์ฌ inputValue๋ผ๋ state ๋ณ๊ฒฝ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ ฅ๋ ๋ด์ฉ์ ์ ์ฅํ๊ณ ์์ผ๋ฏ๋ก ์ด state ๋ณ๊ฒฝ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก์ด ๊ธ์ ์ถ๊ฐํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ addPost ํจ์๋ฅผ ์ถ๊ฐ๋ก ์ ์ธํด ์ฃผ์๋๋ฐ, ์ด ํจ์๋ ์ ๋ ฅ๋ ๋ด์ฉ(inputValue)์ ์๋ก์ด ๊ธ๋ก ์ถ๊ฐํ๊ณ , ์ ๋ชฉ๊ณผ ์ข์์ ๋ฒํผ์ ๋ฐฐ์ด์ ์ ๋ฐ์ดํธํ ํ, inputValue๋ฅผ ์ด๊ธฐํํ๋ ์ญํ ์ ํ๋ค. ๋ฐ๋ผ์ ์ฌ์ฉ์๊ฐ ํน์ ๋ฒํผ์ ๋๋ฌ ํ๋์ ๊ธ์ด ์ถ๊ฐ๋ ๋ ์ ๋ฐ์ดํธ ๋์ด์ผ ํ ๊ฒ๋ค(์ ๋ชฉ, ์ข์์ ๋ฒํผ, ์ ๋ ฅ๋)์ addPost ํจ์์ ์กฐ๊ฑด๋ฌธ ์์ ๋ฃ์ด์ค๋ค.
// ...์๋ต
function App() {
let report = '๐ง ๋๋ง ์๋ ๋ง์ง ์ ๋ณดํ๊ธฐ';
let [title, setTitle] = useState(['์ฑ์์ญ', '๊ฐ๋จ์ญ', '์๊ตฌ์ ์ญ']);
let [thumb, setThumb] = useState([0, 0, 0]);
let [modal, setModal] = useState(false);
let [modalTitle, setModalTitle] = useState(0);
let [inputValue, setInputValue] = useState('');
// ๋ง์ง ์ ๋ณดํ๊ธฐ ๋ฒํผ
const addPost = () => { // ๊ธ์ด ์์ฑ๋๋ฉด
if (inputValue) {
setTitle([...title, inputValue]); // ์ ๋ชฉ ์
๋ฐ์ดํธ
setThumb([...thumb, 0]); // ์ข์์ ๋ฒํผ ์
๋ฐ์ดํธ
setInputValue(''); // ์
๋ ฅ๋ ์ด๊ธฐ ์ํ๋ก ์
๋ฐ์ดํธ
}
};
// ...์๋ต
2. onClick ์ด๋ฒคํธ๋ก ํจ์๋ฅผ ์ฐ๊ฒฐํ๋ค.
๋ฒํผ์ onClick ์ด๋ฒคํธ๋ก addPost ํจ์๋ฅผ ์ฐ๊ฒฐํ์ฌ ํด๋ฆญํ ๋ ์๋ก์ด ๊ธ์ด ์ถ๊ฐ๋๋๋ก ํ๋ค.
// ...์๋ต
return (
// ...์๋ต
{/* ์ถ์ฒ ๋ง์ง ์
๋ ฅ๋ */}
<textarea
className='reportArea'
placeholder = "์ถ์ฒ ๋ง์ง์ด ์๋์?"
value={inputValue}
onChange={(e) => {setInputValue(e.target.value);}} />
<p/>
{/* ๋ง์ง ์ ๋ณด ๋ฒํผ */}
<button
className='reportButton'
onClick={addPost}> // ๋ฒํผ ํด๋ฆญ์ ๊ธ ์์ฑ
{ report }</button>
<p/>
</div>
);
}
export default App;
์ด์ ๋ด์ฉ์ ์ ๋ ฅ์ฐฝ์ ์ ๋ ฅํ ํ, ๋ง์ง ์ ๋ณด ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์๋ก์ด ๊ธ์ด ์ถ๊ฐ๋ ๊ฒ์ด๋ค.
๐ก ๊ตฌํ ๊ณผ์ - Delete
1. splice๋ฅผ ์ฌ์ฉํด ๋ฐฐ์ด์ด ์ ๋ฐ์ดํธ๋๋๋ก ๋ง๋ ๋ค.
๊ธ์ ์ญ์ ํ ์ ์๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ค๋ฉด ๊ฐ ๊ธ์ ๋ํ ์ญ์ ๋ฒํผ์ ์ถ๊ฐํ๊ณ , ํด๋น ๋ฒํผ์ด ํด๋ฆญ๋์์ ๋ ํด๋น ๊ธ์ ์ ๊ฑฐํด์ผ ํ๋ค. ๊ธ ์ถ๊ฐ ๊ธฐ๋ฅ ๊ตฌํ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก deletePost ํจ์๋ฅผ ์ถ๊ฐํ๋ค. ์ด ํจ์๋ ์ธ๋ฑ์ค๋ฅผ ๋ฐ์์์ ํด๋น ์ธ๋ฑ์ค์ ์๋ ๊ธ์ ์ ๋ชฉ๊ณผ ์ข์์ ๋ฒํผ์ ๋ฐฐ์ด์์ ์ ๊ฑฐํ๋ ์ญํ ์ ํ๋ฉฐ, splice ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์๋ณธ ๋ฐฐ์ด์ ์ ๋ฐ์ดํธํ๋ค.
// ...์๋ต
function App() {
let report = '๐ง ๋๋ง ์๋ ๋ง์ง ์ ๋ณดํ๊ธฐ';
let [title, setTitle] = useState(['์ฑ์์ญ', '๊ฐ๋จ์ญ', '์๊ตฌ์ ์ญ']);
let [thumb, setThumb] = useState([0, 0, 0]);
let [modal, setModal] = useState(false);
let [modalTitle, setModalTitle] = useState(0);
let [inputValue, setInputValue] = useState('');
// ... ์๋ต
// ์ ๋ณดํ ๋ง์ง ์ญ์
const deletePost = (index) => { // ์ญ์ ํจ์๋ index๋ฅผ ๋ฐ์์ด
const newTitle = [...title];
const newThumb = [...thumb];
newTitle.splice(index, 1); // splice๋ก ์ ๋ชฉ ๋ฐฐ์ด ์
๋ฐ์ดํธ
newThumb.splice(index, 1); // splice๋ก ์ข์์ ๋ฒํผ ๋ฐฐ์ด ์
๋ฐ์ดํธ
setTitle(newTitle);
setThumb(newThumb);
};
// ... ์๋ต
๋ํ, title.map( ) ๋ฉ์๋ ๋ด์์ ๊ฐ post์ ๋ํ ์ญ์ ๋ฒํผ์ ์ถ๊ฐํ๋ค. ๋ฒํผ์ onClick ์ด๋ฒคํธ๋ก deletePost(i)๋ฅผ ์ฐ๊ฒฐํ์ฌ ํด๋ฆญํ ๋ ํด๋น ๊ธ์ ์ญ์ ํ๋๋ก ํ๋ค. i๋ ํ์ฌ ๊ธ์ ์ธ๋ฑ์ค๋ค.
// ...์๋ต
<p className="share">๐ฎ ๊ณต์ ํ๊ธฐ</p>
<button className="deleteButton" onClick={() => deletePost(i)}
>์ญ์ </button> {/* onClick์ผ๋ก ์ญ์ ์ด๋ฒคํธ ์์ฑ */}
</div>)
})
}
</div>
);
}
export default App;
์ด์ ๊ฐ ๊ธ ์์ ์ถ๊ฐ๋ ์ญ์ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ํด๋น ๊ธ์ด ์ญ์ ๋ ๊ฒ์ด๋ค.
๐ฅณ ๊ธฐ๋ฅ ๊ตฌํ
'๐ Project > Solo' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๐ ๋ง์ง ๊ณต์ ์ฌ์ดํธ] ๋ชจ๋ฌ์ฐฝ ๊ฐ์ ๋์ ์ธ UI ๋ง๋ค๊ธฐ (0) | 2023.05.11 |
---|
๋๊ธ