React ๋ ๋จ๋ฐฉํฅ์ผ๋ก๋ง ๋ฐ์ดํฐ๊ฐ ํ๋ฆ ๋๋ค.
๋ํ ๊ฐ์ ๋ ๋ฒจ์ ์๋ ์ปดํฌ๋ํธ ๋ ์๋ก ๋ฐ์ดํฐ๋ฅผ ๊ตํ ํ ์ ์์ต๋๋ค.
์ด๋ฐ ๊ฒฝ์ฐ ๊ณตํต ๋ถ๋ชจ์์๋ก ๋์ด์ฌ๋ ค์ ํด๊ฒฐ์ ํ ์ ์์ต๋๋ค.
โ ๊ตฌ์กฐ
- ๊ฐ์ ๋ ๋ฒจ์ด๋ผ ํจ์
DiaryEditor
์DiaryList
์ ๋๋ค. - ๊ณตํต ๋ถ๋ชจ์ธ
App
์ปดํฌ๋ํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐฐ์ด ํ์์state
๋ก ๋ฐ์ต๋๋ค. data
state ์ ๊ฐ์DiaryList
์๊ฒ ์ ๋ฌํ๋ฉด์ ๋ฆฌ์คํธ๋ฅผ ๋ ๋๋ง ํ๊ฒ ํ๊ณdata
state ๋ฅผ ๋ณํ ์ํฌ ์ ์๋ ์ํ๋ณํ ํจ์์ธsetData
๋ฅผDiaryEditor
์๊ฒ props ์ผ๋ก ์ ๋ฌํ๋ฉด ๋ฉ๋๋ค.
โ ์๋ฎฌ๋ ์ด์
data
state ๋ ๋ฐฐ์ด์ด๊ณ[itme1]
ํ๋์ ์์ดํ ์ ๊ฐ์ง๊ณ ์๋ ์ํ ์ ๋๋ค.data
๋ฅผ props ๋ก ๋ด๋ ค๋ฐ์DiaryList
์ปดํฌ๋ํธ๋[itme1]
๋ง ๋ ๋๋ง ํ๊ณ ์๋ ์ํ ์ ๋๋ค.- ์ด๋,
DiaryEditor
์ปดํฌ๋ํธ์์ ์๋ก์ด ์์ดํ ์ ๋ง๋ค๋ฉดApp
์ปดํฌ๋ํธ ์์DiaryEditor
์ปดํฌ๋ํธ์๊ฒ props ์ผ๋ก ์ ๋ฌํsetData
ํจ์๋ฅผ ํธ์ถ ํฉ๋๋ค.
- ์๋ก์ด ์์ดํ ์ ์ถ๊ฐ ํฉ๋๋ค.
App
์ปดํฌ๋ํธ๊ฐDiaryEditor
์ปดํฌ๋ํธ์๊ฒ props ์ผ๋ก ์ ๋ฌํsetData
ํจ์๋ฅผ ํธ์ถ ํฉ๋๋ค.setData
๋data
์ ์ํ๋ฅผ[itme1, item2 .... ]
์๋ก์ด ์์ดํ ์ ์ถ๊ฐ ํฉ๋๋ค.
โ App.js
import { useRef, useState } from 'react';
import './App.css';
import DiaryEditor from './DiaryEditor';
import DiaryList from './DiaryList';
function App() {
const [data, setData] = useState([]); // state-๋ฐฐ์ด๋ก ์ ์ฅํ ์์ (๋ฆฌ์คํธ)
const dataId = useRef(0);
const onCreate = (author, content, emotion) => {
const create_date = new Date().getTime();
const newItem = {
author,
content,
emotion,
create_date,
id: dataId.current, // 0 ์ ๊ฐ๋ฆฌํจ๋ค.
};
dataId.current += 1; // id ์ ๊ฐ์ด 1์ฉ ์ฆ๊ฐํ๋ค.
setData([newItem, ...data]); // ์๋ก์ด ์์ดํ
์ด ์๋ก ์ฌ๋ผ์ค๊ฒ ํ๊ธฐ ์ํด์ newItem ์ ๋จผ์ ์ฌ์ฉ
};
return (
<div className="App">
<DiaryEditor onCreate={onCreate} />
<DiaryList diaryList={data} />
</div>
);
}
export default App;
โ DiaryEditor.js
import { useRef, useState } from 'react';
const DiaryEditor = ({ onCreate }) => {
const authorInput = useRef();
const contentInput = useRef();
const [state, setState] = useState({
author: '',
content: '',
emotion: 1,
});
const handleChangeState = (e) => {
setState({
// ๋ณ๊ฒฝํ ํ๊ทธ์ ์ด๋ฆ์ธ author ์ content ๋ ์ค์ ๋ก ๋ฐ๊ฟ์ผ ํ๋ state ์์ฑ์ key ์ ๊ฐ์ต๋๋ค.
...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;
}
onCreate(state.author, state.content, state.emotion);
alert('์ ์ฅ ์ฑ๊ณต');
setState({
author: '',
content: '',
emotion: 1,
});
};
return (
<div className="DiaryEditor">
<h2>์ค๋์ ์ผ๊ธฐ</h2>
<div>
<input
ref={authorInput}
name="author"
value={state.author}
onChange={handleChangeState}
/>
</div>
<div>
<textarea
ref={contentInput}
name="content"
value={state.content}
onChange={handleChangeState}
></textarea>
</div>
<div>
<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}>์ผ๊ธฐ ์ ์ฅํ๊ธฐ</button>
</div>
</div>
);
};
export default DiaryEditor;
โ React ๋ก ๋ง๋ ์ปดํฌ๋ํธ๋ค์
- ํธ๋ฆฌ ํํ์ ๊ตฌ์กฐ๋ฅผ ๋๋ฉฐ, ๋ฐ์ดํฐ๋ ์์์ ์๋๋ก๋ง ์์ง์ด๊ฒ ๋๋ ๋จ๋ฐฉํฅ ๊ตฌ์กฐ ์ ๋๋ค.
- ์ถ๊ฐ, ์์ , ์ญ์ ๋ฑ ์ด๋ฒคํธ๋ค์
setData
๊ฐ์ ํจ์๋ฅผ props ๋ก ์ ๋ฌ์ ํ๊ณ - ์ด๋ฒคํธ๋ค์ ์๋์์ -> ์๋ก ์ฌ๋ผ๊ฐ๋ ๊ตฌ์กฐ ๋ผ๊ณ ์๊ฐ ํ ์ ์์ต๋๋ค.
โ ์ฐธ๊ณ
'๐ Front-End > React.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฆฌ์คํธ ๋ฐ์ดํฐ ์์ ํ๊ธฐ (0) | 2022.10.24 |
---|---|
๋ฆฌ์คํธ ๋ฐ์ดํฐ ์ญ์ ํ๊ธฐ (0) | 2022.10.24 |
React - ๋ฆฌ์คํธ ๋ ๋๋ง ( ์กฐํ ) (0) | 2022.10.23 |
useRef (0) | 2022.10.23 |
์ฌ์ฉ์ ์ ๋ ฅ ์ฒ๋ฆฌ (0) | 2022.10.23 |