ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Create만들기 (전체 정리)
    프론트엔드/react(생활코딩) 2020. 2. 10. 18:09

     

    App.js

    Create 기능 뿐만 아니라, 전체적으로 복습 겸 아래 흐름을 되짚어 보자.

     

    ■ this.max_content_id = 3 의 의미는, 그 밑에 create를 통해 content id 를 1개씩 추가해주기 위해, 초기 값을 정해준 것이다. (이 때, 초기값 3은 id this.state.contents의 마지막 id값이 3이기 때문.

     

    이를 state안에 두지 않는 이유는, ui 와 전혀 상관없는 로직이기 때문에 밖에다 둔 것이다. (안에 두어도 되긴 하지만, 불필요함 / 성능 저하 

     

    ■ 컴포넌트는 총 5개로 구성 되어 있다.

     

    1) Subject

    2) TOC

    3) Contol

    4) ReadContent

    5) CreateContent

     

    각 각의 컴포넌트에 대해서 아래 하나씩 살펴보자.

    import React, { Component } from 'react';
    import TOC from "./components/TOC";
    import ReadContent from "./components/ReadContent"
    import CreateContent from './components/CreateContent';
    import Subject from "./components/Subject"
    import Control from "./components/Control"
    import './App.css';
    
    
    class App extends Component {
      constructor(props) {
        super(props);
        this.max_content_id = 3;
        this.state = {
          mode: 'read',
          selected_content_id: 2,
          subject: { title: 'WEB', sub: 'World Wid Web!' },
          welcome: { title: 'Welcome', desc: 'Hello, React!!' },
          contents: [
            { id: 1, title: 'HTML', desc: 'HTML is for information' },
            { id: 2, title: 'CSS', desc: 'CSS is for design' },
            { id: 3, title: 'JavaScript', desc: 'JavaScript is for interactive' }
          ]
        }
      }
      render() {
        var _title, _desc, _article = null;
        if (this.state.mode === 'welcome') {
          _title = this.state.welcome.title;
          _desc = this.state.welcome.desc;
          _article = <ReadContent title={_title} desc={_desc}></ReadContent>
        } else if (this.state.mode === 'read') {
          var i = 0;
          while (i < this.state.contents.length) {
            var data = this.state.contents[i];
            if (data.id === this.state.selected_content_id) {
              _title = data.title;
              _desc = data.desc;
              break;
            }
            i = i + 1;
          }
          _article = <ReadContent title={_title} desc={_desc}></ReadContent>
        } else if (this.state.mode === 'create') {
          _article = <CreateContent onSubmit={function (_title, _desc) {
            this.max_content_id = this.max_content_id + 1;
            var _contents = this.state.contents.concat(
              { id: this.max_content_id, title: _title, desc: _desc }
            )
            this.setState({
              contents: _contents
            })
          }.bind(this)}></CreateContent>
        }
        return (
          <div className="App">
            <Subject
              title={this.state.subject.title}
              sub={this.state.subject.sub}
              onChangePage={function () {
                this.setState({ mode: 'welcome' });
              }.bind(this)}>
            </Subject>
            <TOC
              onChangePage={function (id) {
                this.setState({
                  mode: 'read',
                  selected_content_id: Number(id)
                });
              }.bind(this)}
              data={this.state.contents}></TOC>
            <Control onChangeMode={function (_mode) {
              this.setState({
                mode: _mode
              });
            }.bind(this)}></Control>
            {_article}
          </div>
        );
      }
    }
    
    export default App;

     

    Subject.js 컴포넌트

    import React, { Component } from 'react';
    class Subject extends Component {
        render() {
            return (
                <header>
                    <h1><a href="/" onClick={function (e) {
                        e.preventDefault();
                        this.props.onChangePage();
                    }.bind(this)}>{this.props.title}</a></h1>
                    {this.props.sub}
                </header>
            );
        }
    }
    
    export default Subject;

    TOC 컴포넌트

    import React, { Component } from 'react';
    
    class TOC extends Component {
        shouldComponentUpdate(newProps, newState) {
            console.log("===>TOC render shouldComponentUpdate",
                newProps.data,
                this.props.data);
            if (this.props.data === newProps.data) {
                return false;
            }
            return true;
        }
        render() {
            console.log('===>TOC render');
            var lists = [];
            var data = this.props.data;
            var i = 0;
            while (i < data.length) {
                lists.push(<li key={data[i].id}>
                    <a
                        href={"/content/" + data[i].id}
                        data-id={data[i].id}
                        onClick={function (e) {
                            e.preventDefault();
                            this.props.onChangePage(e.target.dataset.id)
                        }.bind(this)}
                    >{data[i].title}</a></li>);
                i = i + 1;
            }
            return (
                <nav>
                    <ul>
                        {lists}
                    </ul>
                </nav>
            );
        }
    }
    
    export default TOC;

    Control 컴포넌트

    import React, { Component } from 'react';
    class Control extends Component {
        render() {
            return (
                <ul>
                    <li><a href="/create" onClick={function (e) {
                        e.preventDefault();
                        this.props.onChangeMode('create');
                    }.bind(this)}>create</a></li>
                    <li><a href="/update" onClick={function (e) {
                        e.preventDefault();
                        this.props.onChangeMode('update');
                    }.bind(this)}>update</a></li>
                    <li><input onClick={function (e) {
                        e.preventDefault();
                        this.props.onChangeMode('delete');
                    }.bind(this)}
                        type="button" value="delete"></input></li>
                </ul>
            );
        }
    }
    
    export default Control;

     

    ReadContent 컴포넌트

     

    import React, { Component } from 'react';
    
    class ReadContent extends Component {
        render() {
            return (
                <article>
                    <h2>{this.props.title}</h2>
                    {this.props.desc}
                </article>
            );
        }
    }
    
    export default ReadContent;

    CreateContent 컴포넌트

    import React, { Component } from 'react';
    
    class CreateContent extends Component {
        render() {
            return (
                <article>
                    <h2>Create</h2>
                    <form action="/create_process" method="post"
                        onSubmit={function (e) {
                            e.preventDefault();
                            this.props.onSubmit(e.target.title.value, e.target.desc.value);
                        }.bind(this)}
                    >
                        <p><input type="text" name="title" placeholder="title"></input></p>
                        <p>
                            <input type="text" name="desc" placeholder="description"></input>
                        </p>
                        <p>
                            <input type="submit"></input>
                        </p>
                    </form>
                </article >
            );
        }
    }
    
    export default CreateContent;

     

    '프론트엔드 > react(생활코딩)' 카테고리의 다른 글

    이벤트  (0) 2020.01.18
    state 개념잡기  (0) 2020.01.17
    컴포넌트 파일로 쪼개기(4)  (0) 2020.01.17
    props 만들기(3)  (0) 2020.01.17
    컴포넌트 만들기(2)  (0) 2020.01.16
Designed by Tistory.