Skip to content

๐Ÿ‡ฐ๐Ÿ‡ทReact๋ฅผ ์ด์šฉํ•œ ToDoList

Notifications You must be signed in to change notification settings

koogk7/React_ToDoList

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

11 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

React Tutorial - To Do List Demo

Environment

  • react : 16.8.3
  • yarn : 1.12.3

Screen Shot

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2019-05-29 แ„‹แ…ฉแ„’แ…ฎ 7 19 40

Function

  • Add To do
  • Delete To do
  • Check To complete

Structer

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2019-05-29 แ„‹แ…ฉแ„’แ…ฎ 7 44 20

Review

App.js

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(๊ฐ’์„ ๋ณต์‚ฌํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น๋ฐ›๋Š”๋‹ค)๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์ „๊ฐœ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ์ค€๋‹ค.

TodoListTemplate.js

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 ์ปดํฌ๋„ŒํŠธ๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

TodoItem.js

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)
                }}>
                    &times;
                </div>
               <div className={`todo-text ${ checked ? ' checked' : '' }`}>
                    <div>{text}</div>
                </div>
                {
                    checked && (<div className='check-mark'>&#x2713;</div> )
                }
            </div>
        );
    }
}
  • onToggle๊ณผ ๊ฐ™์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋„ฃ์–ด์ค˜์•ผ ๋˜๋Š” ํ•จ์ˆ˜๋Š” ()=>onToggle(id)์™€ ๊ฐ™์ด ์ž‘์„ฑํ•œ๋‹ค. onToggle(id)๋ฅผ ๋„˜๊ฒจ์ค„ ๊ฒฝ์šฐ ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ๋ Œ๋”๋ง ๋ ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋˜๊ณ , ํ˜ธ์ถœ๋˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ณ  ๋‹ค์‹œ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ๋ฌดํ•œ๋ฐ˜๋ณต์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค
  • ์ผ๋ฐ˜ html ํƒœ๊ทธ ๋‚ด์— onclick์€ ์ธ๋ผ์ธ js๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ()๋ฅผ ๋ถ™์ž„์œผ๋กœ์„œ ํ˜ธ์ถœ์„ ํ•ด์ฃผ๋‚˜, ๋ฆฌ์•กํŠธ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” addEventHandler์™€ ๊ฐ™์ด ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ ๊ฐ์ฒด๋งŒ ๋„˜๊ฒจ์ค€๋‹ค.
  • ํด๋ž˜์Šค ๋„ค์ž„์„ ๋™์ ํ• ๋‹น ํ•˜๊ธฐ ์œ„ํ•ด ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

Reference

About

๐Ÿ‡ฐ๐Ÿ‡ทReact๋ฅผ ์ด์šฉํ•œ ToDoList

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published