Intro
์ค๋์ React๋ก ๊ฐ๋จํ ์ผ๊ธฐ์ฅ ๋ง๋ค๊ธฐ ์ค์ต์ ์์ํ๋ค!!
์ค๋ ํ์ตํ ๋ด์ฉ
React์์ ์ฌ์ฉ์ ์ ๋ ฅ ์ฒ๋ฆฌํ๊ธฐ
์ธ๋ถ ๋ชฉํ
- ํ ์ค ์ ๋ ฅ ์ฒ๋ฆฌํ๊ธฐ
- ์ฌ๋ฌ ์ค ์ ๋ ฅ ์ฒ๋ฆฌํ๊ธฐ
- ์ ํ ๋ฐ์ค ์ ๋ ฅ ์ฒ๋ฆฌํ๊ธฐ
- ์ฌ์ฉ์ ์ ๋ ฅ ๋ฐ์ดํฐ ํจ๋ค๋งํ๊ธฐ
๊ธฐ๋ฅ์ด ๋น์ทํ state๋ ํ๋๋ก ๋ฌถ๊ธฐ
: ํ๋์ ๊ฐ์ฒด๋ก ์ ์ฅํ์ฌ ์ฝ๋๋ฅผ ๊ฐ๋จํ๊ฒ ์์ ํ ์ ์๋ค.
- ์ด์ ์ฝ๋
import { useState } from 'react';
const DiaryEditor = () => {
const [author, setAuthor] = useState('์ด๊ฐ์ฐ');
const [content, setContent] = useState('');
return (
<div className="DiaryEditor">
<h2>์ค๋์ ์ผ๊ธฐ</h2>
<div>
<input
value={author}
onChange={(e) => {
setAuthor(e.target.value);
}}
/>
</div>
<div>
<textarea
value={content}
onChange={(e) => {
setContent(e.target.value);
}}
/>
</div>
</div>
);
};
export default DiaryEditor;
- ์์ ์ฝ๋
import { useState } from 'react';
const DiaryEditor = () => {
const [state, setState] = useState({
author: '',
content: '',
});
const handleChangeState = (e) => {
setState({
...state,
[e.target.name]: e.target.value,
});
};
return (
<div className="DiaryEditor">
<h2>์ค๋์ ์ผ๊ธฐ</h2>
<div>
<input name="author" value={state.author} onChange={handleChangeState} />
</div>
<div>
<textarea name="content" value={state.content} onChange={handleChangeState} />
</div>
</div>
);
};
export default DiaryEditor;
React์์ DOM ์กฐ์ํ๊ธฐ - useRef
์ธ๋ถ ๋ชฉํ
- ์ผ๊ธฐ ์ ์ฅ ๋ฒํผ์ ํด๋ฆญํ์ ๋ ์์ฑ์์ ์ผ๊ธฐ๊ฐ ์ ์์ ์ผ๋ก ์ ๋ ฅ๋์๋์ง ํ์ธํ๊ณ ์๋๋ผ๋ฉด focus
DOM์ ์กฐ์ํ๊ธฐ ์ํด React์ useRef๋ฅผ ์ฌ์ฉํ๋ค.
import { useState, useRef } from 'react';
const DiaryEditor = () => {
const authorInput = useRef();
const contentInput = useRef();
const [state, setState] = useState({
author: '',
content: '',
emotion: 1,
});
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} />
</div>
<div>
<textarea ref={contentInput} name="content" value={state.content} onChange={handleChangeState} />
</div>
<div>
<label>์ค๋์ ๊ฐ์ ์ ์: </label>
<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์์ ๋ฆฌ์คํธ ๋ ๋๋งํ๊ธฐ
์ธ๋ถ ๋ชฉํ
- ๋ฐฐ์ด์ ์ด์ฉํ์ฌ React์์ LIST๋ฅผ ๋ ๋๋ง ํด๋ณด๊ณ ๊ฐ๋ณ์ ์ธ ์ปดํฌ๋ํธ๋ก ๋ง๋ค์ด๋ณด๊ธฐ
์ผ๊ธฐ๋ฆฌ์คํธ (DiaryList) ์ปดํฌ๋ํธ ๋ง๋ค๊ธฐ
: ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฑธ ๊ตฌํํ๊ธฐ ์ ์ ๋๋ฏธ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์ด ๋ฏธ๋ฆฌ ํ ์คํธํด ๋ณธ๋ค.
import './App.css';
import DiaryEditor from './DiaryEditor';
import DiaryList from './DiaryList';
const dummyList = [
{
id: 1,
author: '์ด๊ฐ์ฐ',
content: '๋ ์จ ํ๋ฆฌ๊ณ ๋น์ด',
emotion: 4,
created_date: new Date().getTime(),
},
{
id: 2,
author: 'ํ๊ธธ๋',
content: '์ค๋์ ์ง์์ ์ฝฉ๋๋ฌผ ๋ถ๊ณ ๊ธฐ๋ฅผ ํด๋จน์๋ค. ๋ง์์๋ค.',
emotion: 3,
created_date: new Date().getTime(),
},
{
id: 3,
author: '๊น๋ฐ๋ณด',
content: '์ค๋์ ๋ฆฌ์กํธ๋ฅผ ๊ณต๋ถํ๋ค. ์ฌ๋ฐ์๋ค.',
emotion: 5,
created_date: new Date().getTime(),
},
];
function App() {
return (
<div className="App">
<DiaryEditor />
<DiaryList diaryList={dummyList} />
</div>
);
}
export default App;
- state ๋ณ์ dummyList๊ฐ undefined์ผ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด ๊ฐ ์ด๊ธฐํ (.defaultProps)
DiaryList.defaultProps = {
diaryList: [],
};
- map์ผ๋ก ์์๋ฅผ ๋ง๋ค ๋ key๊ฐ์ ์ง์ ํด ์ค์ผ ํ๋ค. (๋๋๋ก id๊ฐ์ ์ฌ์ฉํ๊ณ index๊ฐ์ ์ฌ์ฉํ๋ ๊ฑด ์ง์ํจ)
const DiaryList = ({ diaryList }) => {
console.log(diaryList);
return (
<div className="DiaryList">
<h2>์ผ๊ธฐ ๋ฆฌ์คํธ</h2>
<h4>{diaryList.length}๊ฐ์ ์ผ๊ธฐ๊ฐ ์์ต๋๋ค.</h4>
<div>
{diaryList.map((item) => (
<div key={item.id}>
<div>์์ฑ์: {item.author}</div>
<div>์ผ๊ธฐ: {item.content}</div>
<div>๊ฐ์ : {item.emotion}</div>
<div>์์ฑ ์๊ฐ(ms): {item.created_date}</div>
</div>
))}
</div>
</div>
);
};
DiaryList.defaultProps = {
diaryList: [],
};
export default DiaryList;
๊ฒฐ๊ณผ๋ฌผ
๋ง๋ฌด๋ฆฌ
๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๊ตฌํํ๋ ๊ฒ ๋ณด๋ค ํจ์ฌ ๊ฐ๋จํ๊ฒ ๋ฆฌ์กํธ๋ก ํ๋ฉด์ ๊ตฌํํ ๊ฒ ๊ฐ๋ค.
๋ฆฌ์กํธ์์ DOM์ document.querySelector๋ก ์ง์ ํธ์ถํ์ง ์๊ณ useRef๋ก ๊ฐ๋จํ๊ฒ ์์๋ฅผ ํธ์ถํด์ฌ ์ ์๋ ๊ฒ ์ฝ๋ ๊ฐ๋ ์ฑ๋ ์ข๊ณ ๋ฆฌ์กํธ์ ์ฅ์ ์ธ ๊ฒ ๊ฐ๋ค.
๋ฆฌ์กํธ๋ฅผ ์ ํ์ฉํด์ ์์ผ๋ก ๋ ์ฌ๋ฐ๋ ํ๋ก์ ํธ๋ฅผ ์งํํด ๋ณผ ์ ์์ ๊ฒ ๊ฐ๋ค.
