- react : 16.8.3
- yarn : 1.12.3
- Add To do
- Delete To do
- Check To complete
handleCreate = () => {
const { input, todos } = this.state;
this.setState({
input: '',
todos: todos.concat({
id: this.id++,
text: input,
checked: false
})
});
};
- state ๋ด๋ถ์ ๋ฐฐ์ด์ ์์๋ฅผ ๋ํ ๋ ์ ๋ push ๋ฉ์๋๋ฅผ ์ฐ์ง ์๋๋ค. ๋ฆฌ์กํธ๋ setState() ๋ฉ์๋๊ฐ ํธ์ถ ๋ ๋ ๋ฆฌ๋ ๋๋ง ๋๋๋ก ๊ตฌํ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ ๋๋ง์ด ๋ถํ์ํ ๊ฒฝ์ฐ์๋ ์ผ์ด ๋ ์ ์๋ค. shouldComponentUpdate ์ ๊ฐ์ ๋ผ์ดํ ์ฌ์ดํด api๋ฅผ ํตํด ์ด๋ฐ ์ํฉ์ ๋ฐฉ์งํ๋ค. ์ด๋ฅผ ์ํด์๋ ์ด์ state์ ๋ค์ state์ ๋น๊ต๊ฐ ์ผ์ด๋๊ฒ ๋๋๋ฐ, push ๋ฉ์๋๋ฅผ ์ฌ์ฉ ํ ๊ฒฝ์ฐ, ๊ฐ์ ๋ฐฐ์ด์ ๋ฆฌํดํ๊ธฐ ๋๋ฌธ์ ์ ์ ํ ๋น๊ต๊ฐ ์ด๋ฃจ์ด์ง์ง ์๋๋ค. ๋ฐ๋ฉด concat์ ๊ธฐ์กด๋ฐฐ์ด์ ์ถ๊ฐํ๋ ์์๋ฅผ ๋ํ ์๋ก์ด ๋ฐฐ์ด์ ๋ฆฌํดํจ์ผ๋ก ์ ์ ํ ๋น๊ต๊ฐ ๊ฐ๋ฅํด์ง๋ค. (์ ๊ฐ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด๋ ๊ด์ฐฎ๋ค.)
handleToggle = (id) => {
const { todos } = this.state;.
const index = todos.findIndex(todo => todo.id === id);
const selectd = todos[index];
const nextTodos = [...todos]; // ๋ฐฐ์ด์ ๋ณต์ฌ
nextTodos[index] = {
...selectd,
checked: !selectd.checked
};
this.setState({
todos: nextTodos
});
};
- javascript์ ๊ฐ์ฒด๋ ๋ฐฐ์ด์ ๊ธฐ๋ณธ์ ์ผ๋ก shwallow copy(์ฃผ์๊ฐ์ ๊ณต์ )๋ฅผ ์ํํ๋ค. ๋๋ฌธ์ deep copy(๊ฐ์ ๋ณต์ฌํ์ฌ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ๋๋ค)๋ฅผ ์ํํ๊ธฐ ์ํ์ฌ ์ ๊ฐ์ฐ์ฐ์๋ฅผ ํตํด ์๋ก์ด ๋ฐฐ์ด์ ๋ง๋ค์ด ์ค๋ค.
const TodoListTemplate = ({form, children}) =>{
return (
<main className="todo-list-template">
<div className="title">
์ค๋ ํ ์ผ
</div>
<section className="form-wrapper">
{form}
</section>
<section className="todos-wrapper">
{children}
</section>
</main>
);
};
- children์ TodoListTemplate ํ๊ทธ ์ฌ์ด์ ๊ฐ์ด ๋ค์ด๊ฐ
- TodoListTemplate.js ๋ ํจ์ํ ์ปดํฌ๋ํธ์ด๋ค. ํจ์ํ ์ปดํฌ๋ํธ๋ ์ฒซ ๋ง์ดํ ์๋์ ์์ด 7%~11% ๋น ๋ฅด๋ฉฐ ์ปดํฌ๋ํธ ์์ฒด ๊ธฐ๋ฅ์ด ์๊ณ props๊ฐ ๋ค์ด๊ฐ๋ฉด ๋ทฐ๊ฐ ๋์จ๋ค๋ ๊ฒ์ ๋ช ์ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. ์ด๋ ์ปดํฌ๋ํธ๋ state๋ ๋ผ์ดํ ์ฌ์ดํด api๋ฅผ ์ ํ ์ฌ์ฉํ์ง ์๋๋ค.
- ํนํ Redux๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ๋ค์ ๊ตฌ์ฑ ํ ๋, Container ์ปดํฌ๋ํธ๋ ํด๋์คํ, Presentational ์ปดํฌ๋ํธ๋ ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ค.
class TodoItem extends Component {
shouldComponentUpdate(nextProps, nextState){
return this.props.checked !== nextProps.checked;
}
render(){
const { text, checked, id, onToggle, onRemove} = this.props;
return (
<div className="todo-item" onClick={() => onToggle(id)}>
<div className="remove" onClick={(e) => {
e.stopPropagation();
onRemove(id)
}}>
×
</div>
<div className={`todo-text ${ checked ? ' checked' : '' }`}>
<div>{text}</div>
</div>
{
checked && (<div className='check-mark'>✓</div> )
}
</div>
);
}
}
- onToggle๊ณผ ๊ฐ์ด ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฃ์ด์ค์ผ ๋๋ ํจ์๋ ()=>onToggle(id)์ ๊ฐ์ด ์์ฑํ๋ค. onToggle(id)๋ฅผ ๋๊ฒจ์ค ๊ฒฝ์ฐ ํด๋น ํจ์๊ฐ ๋ ๋๋ง ๋ ๋๋ง๋ค ํธ์ถ๋๊ณ , ํธ์ถ๋๋ฉด ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๊ณ ๋ค์ ๋ฆฌ๋ ๋๋ง๋๋ ๋ฌดํ๋ฐ๋ณต์ด ์ผ์ด๋ ์ ์๋ค
- ์ผ๋ฐ html ํ๊ทธ ๋ด์ onclick์ ์ธ๋ผ์ธ js๋ฅผ ์คํ์ํค๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ()๋ฅผ ๋ถ์์ผ๋ก์ ํธ์ถ์ ํด์ฃผ๋, ๋ฆฌ์กํธ ๊ฐ์ ๊ฒฝ์ฐ๋ addEventHandler์ ๊ฐ์ด ๋ฐ์ธ๋ฉํ๊ธฐ ๋๋ฌธ์ ํจ์ ๊ฐ์ฒด๋ง ๋๊ฒจ์ค๋ค.
- ํด๋์ค ๋ค์์ ๋์ ํ ๋น ํ๊ธฐ ์ํด ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด๋ฅผ ์ฌ์ฉํ์๋ค.