๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
WEB/Front-End๐ŸŒ

[React] Update ๊ธฐ๋Šฅ ๊ตฌํ˜„, ๋ฆฌํŒฉํ† ๋ง

by narang111 2021. 10. 12.

 

์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค Update๋Š” ์ด๋ฏธ ์“ฐ์—ฌ์ง„ ๋ชฉ๋ก์„ ๊ณจ๋ผ์„œ desc๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋™์ž‘์„ ํ•  ๊ฒƒ์ด๋‹ค.

 

์šฐ์„  Update ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  js ํŒŒ์ผ์„ CreateContent ํŒŒ์ผ์„ ๋ณต์‚ฌํ•ด์„œ ๋งŒ๋“ค๊ณ  h2 ํƒœ๊ทธ๋งŒ update๋กœ ๋ฐ”๊ฟ”์ฃผ์—ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  updatecontent ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‹คํ–‰๋  ๋–„ ์ž…๋ ฅ ๊ฐ’์œผ๋กœ contentd id๋ฅผ ์ฃผ์ž…์‹œ์ผœ์ค„ ๊ฒƒ์ด๋‹ค.

 

form ์ œ์–ดํ•˜๊ธฐ

props ๋ฐ์ดํ„ฐ๋Š” read only์ด๋‹ค. value ๊ฐ’์œผ๋กœ ์ง€์ •ํ•ด๋ฒ„๋ฆฌ๋ฉด react๊ฐ€ ๋‚˜์„œ์„œ ๋ง‰์•„๋ฒ„๋ฆฐ๋‹ค.

๊ทธ๋ž˜์„œ ์ž…๋ ฅ์ฐฝ์˜ ๊ธ€์”จ๋ฅผ ๋ฐ”๊พธ๋ ค๊ณ  ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค. 

value๊ฐ’์œผ๋กœ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ๊ฐ€๋ณ€์ ์ธ ๋ฐ์ดํ„ฐ, stateํ™”๋ฅผ ์‹œ์ผœ์ค˜์•ผ ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  value ๊ฐ’์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก input ๊ฐ’์„ ๋ฐ”๊ฟจ์„ ๋•Œ state ๊ฐ’์„ ๋ฐ”๊ฟ”์ค˜์•ผ ํ•˜๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ onChange๋ฅผ ์จ์•ผํ•œ๋‹ค.

 

 

update ํ•˜๋ ค๋Š” ๋ชฉ๋ก์„ ํด๋ฆญํ•˜๋ฉด ๊ทธ ๋ชฉ๋ก์ด ์ž…๋ ฅ์ฐฝ์— ๋“ค์–ด๊ฐ„๋‹ค.  

์˜ค๋ฅธ์ชฝ ์‚ฌ์ง„์€ HTML์„ ๋ˆ„๋ฅธ ํ›„ update๋ฅผ ๋ˆ„๋ฅธ ๋ชจ์Šต์ด๋‹ค.

desc๋„ ๋™์ผํ•˜๊ฒŒ ํ•ด์ค€๋‹ค

 

 

desc๋„ ๋˜‘๊ฐ™์ด ์ฒ˜๋ฆฌํ•ด์ฃผ๋ฉด onChange ํ•จ์ˆ˜์˜ ์ค‘๋ณต์ด ์ƒ๊ธฐ๋Š”๋ฐ ์ด๊ฒƒ์„ ์—†์• ์ค„ ๊ฒƒ์ด๋‹ค.

๊ธฐ๋Šฅ์ ์œผ๋กœ๋Š” ๋ฌธ์ œ์—†์ง€๋งŒ ๊ทธ๋ƒฅ ๋ณด๊ธฐ ์ข‹๊ฒŒ ํ•˜๊ธฐ์œ„ํ•ด์„œ!

 

์—ฌ๊ธฐ์„œ ์ตœ์‹  javascript ๊ธฐ๋Šฅ์ด ๋‚˜์˜ค๋Š”๋ฐ

[e.target.name]ํ•˜๋ฉด target์˜ name ๊ฐ’์ด ๋“ค์–ด์˜จ๋‹ค.

 

๋˜ ์—ฌ๊ธฐ์„œ ๋’ค์—์žˆ๋Š” .bind(this)๋ฅผ constructor์—์„œ ํ•ด์ค„ ์ˆ˜๋„ ์žˆ๋‹ค.

 

๋งˆ์ง€๋ง‰์œผ๋กœ update๋ฅผ ํ•˜๋ ค๋ฉด ์–ด๋””๋ฅผ update๋ฅผ ํ• ๊ฑด์ง€์— ๋Œ€ํ•œ ์‹๋ณ„์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

onSubmit์ด๋ผ๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ์ด ์ปดํฌ๋„ŒํŠธ๋กœ ๋“ค์–ด์˜จ onSubmit props๋ฅผ ์‹คํ–‰ํ•˜๋Š”๋ฐ ์—ฌ๊ธฐ๋‹ค๊ฐ€ id ๊ฐ’์„ ์ค€๋‹ค.

 

App.js์—์„œ๋„ ์ฝ”๋“œ ์ˆ˜์ •์„ ํ•ด์•ผํ•œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋Šฅ ์ค‘์—

Array.from(this.state.contents)์„ ํ•˜๋ฉด this.state.contetns๋ฅผ ๋ณต์‚ฌํ•œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์ด ์ƒ๊ธด๋‹ค.

concat๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด๋‹ค.

 

 

๐Ÿ”ฝ UpdateContent.js

import React, { Component } from 'react';

class UpdateContent extends Component{
    constructor(props){
      super(props);
      this.state = {
        id: this.props.data.id,
        title: this.props.data.title,
        desc: this.props.data.desc
      }
      this.inputFormHandler = this.inputFormHandler.bind(this);
    }
    inputFormHandler(e){
      this.setState({[e.target.name]:e.target.value});
    }
    render(){
      //console.log(this.props.data);
      return(
        <article>
            <h2>Update</h2>
            <form action="/create_process" method="post"
              onSubmit={function(e){
                e.preventDefault();
                //debugger;
                // CreateContent์˜ onSubmit์„ ํ˜ธ์ถœ
                this.props.onSubmit(
                  this.state.id,
                  this.state.title,
                  this.state.desc
                  // e.target.title.value,
                  // e.target.desc.value
                );
                //alert('submit!!');
              }.bind(this)}>
              <input
                type="hidden"
                name="id"
                value={this.state.id}
              ></input>
              <p>
                <input 
                  type="text" 
                  name="title" 
                  placeholder="title"
                  value={this.state.title}
                  onChange={this.inputFormHandler}
                ></input>
              </p>
              <p>
                <textarea 
                  name="desc" 
                  placeholder="description"
                  value={this.state.desc}
                  onChange={this.inputFormHandler}
                ></textarea>
              </p>
              <p>
                <input type="submit"></input>
              </p>
            </form>
        </article>
      );
    }
  }

  export default UpdateContent;

 

๐Ÿ”ฝ App.js (๋ฆฌํŒฉํ† ๋ง ํ›„)

- create์™€ update๋ฅผ ํ•˜๊ณ ๋‚˜๋ฉด ๋‹ค์‹œ read๋ชจ๋“œ๋กœ ๋Œ์•„๊ฐ€๋„๋ก ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.

create์˜ ๊ฒฝ์šฐ์—๋Š” ๋ฐฉ๊ธˆ๋งŒ๋“  ์ปจํ…์ธ ๋ฅผ ๋ณด์ด๋„๋ก ํ–ˆ๋‹ค.

import './App.css';
import React, { Component } from 'react';
import TOC from "./components/TOC"
import ReadContent from "./components/ReadContent"
import CreateContent from "./components/CreateContent"
import UpdateContent from "./components/UpdateContent"
import Subject from "./components/Subject"
import Control from "./components/Control"




// ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ (ํ…œํ”Œ๋ฆฟ)
// ๋ฆฌ์•กํŠธ์˜ Component๋ผ๊ณ  ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋Š”
// App ์ด๋ผ๋Š” ํด๋ž˜์Šค - render()๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
class App extends Component {
  constructor(props){
    super(props);
    // ๋งˆ์ง€๋ง‰ content id ๊ฐ’
    this.max_content_id = 3;
    this.state = {
      mode:'read',
      selected_content_id:1,
      subject:{title:'WEB', sub:'World Wide Web!'},
      welcome:{title:'Welcome', desc:'Hello, React'},
      contents:[
        {id:1, title:'HTML', desc:'HTML is HyperText ...'},
        {id:2, title:'CSS', desc:'CSS is for design ...'},
        {id:3, title:'JavaSript', desc:'JavaSript is ...'}
      ]
    }
  }
  getReadContent(){
    var i =0;
      while(i < this.state.contents.length){
        var data = this.state.contents[i];
        if(data.id === this.state.selected_content_id){
          return data;
          //_title = data.title;
          //_desc = data.desc;
          break;
        }
        i = i + 1;
    }
  }
  getContent(){
    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 _content = this.getReadContent();
      _article = <ReadContent title={_content.title} desc={_content.desc}></ReadContent>
    } else if(this.state.mode === 'create'){
      _article = <CreateContent onSubmit={function(_title, _desc){
        // add content to this.state.contents
        this.max_content_id = this.max_content_id+1;
        // ์•„๋ž˜์™€๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ contents์˜ ๋์—๋‹ค๊ฐ€ ์ถ”๊ฐ€ํ•œ๋‹ค.
        var _contents = this.state.contents.concat(
          {id:this.max_content_id, title:_title, desc:_desc}
        );
        this.setState({
          contents: _contents,
          mode: 'read',
          selected_content_id: this.max_content_id
        });
      }.bind(this)}></CreateContent>
    } else if(this.state.mode === 'update'){
        _content = this.getReadContent();
        _article = <UpdateContent data={_content} 
        onSubmit={function(_id, _title, _desc){
          var _contents = Array.from(this.state.contents);
          var i = 0;
          while(i< _contents.length){
            if(_contents[i].id === _id){
              _contents[i]={id:_id, title: _title, desc:_desc};
              break;
            }
            i = i+1
          }
          this.setState({
            contents: _contents,
            mode: 'read'
          });
        }.bind(this)}></UpdateContent>
      }
      return _article;
  }
  render(){
    return (
      <div className="App">
        <Subject 
          title={this.state.subject.title} 
          sub={this.state.subject.sub}
          onChangePage={function(){
            //alert('hihi');
            this.setState({mode:'welcome'})
          }.bind(this)}
        >
        </Subject>
        <TOC 
          onChangePage={function(id){
            //alert('hi');
            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>
        {this.getContent()}
      </div>  
    );
  }
  
}

export default App;