# React-19.4. create 구현 - form

 

1. CreateContent 컴포넌트에 글작성 폼 추가

1.1 제목, 내용, 버튼 추가

: CreateContent.js - retun 구문에 form 테그 추가
<form>
  <p>
    <input type="text" name="title"
    placeholder="title"></input>
  </p>
  <p>
    <textarea name="desc" placeholder="description"></textarea>
  </p>
  <p>
    <input type="submit"></input>
  </p>
</form>

1.2 form 액션 설정

 - 서브밋 버튼(제출) 클릭시 메시지창을 띄우며 화면전환이 되지 않도록 작성

: CreateContent.js - form 테그 속성 정의
<form action="/create_process" method="post"
  onSubmit={function(e){
    e.preventDefault();
    alert('submit!!');
  }.bind(this)}
>

 

* 다음 기능

 - app.js 컴포넌트의 content 끝에 form 에서 작성한 사용자의 입력정보를 추가

# React-19.3. create 구현 -  mode 전환 기능

 

1. create 클릭시 Content 영역 변경

1.1 조회시 기본 화면 : 읽기(read) 모드에 해당하는 Content 화면(HTML, CSS, JavaScript..) 표시

 > 진행을 위해 Content > ReadContent 로 변경 (초기에 작성한 Article 컴포넌트를 Content로 진행함)

: app.js - import 구문 (Article.js에는 정의하지 않은 export 설정)
import ReadContent from './components/ReadContent';

: app.js - render() Article 구분 
<ReadContent title={_title} desc={_desc}></ReadContent>
: ReadContent.js - Article.js(Content.js) 파일명 및 컴포넌트 구조 변경
import React, { Component } from 'react';

export class ReadContent extends Component {
  render() {
    // this.props.title = 'hi ';
    console.log("ReadContent render");
    return (
      <article>
        <h2>HTML</h2>
        {this.props.desc}
      </article>
    );
  }
}

export default ReadContent;

1.2 create 클릭시 Create 화면으로 변경

 - CreateContent 컴포넌트 추가 (이전작업으로 create 클릭 시 mode가 create로 변경되는 상태)

 > mode 변경에 따라 ReadContent 를 CtreatContent 로 변경 

1.2.1 app.js에서 ReadContent 로  return 하던 구문을 동적으로 상황(create)에 맞게 표시하기 위해

  _article 변수를 추가하여 ReadContent 표시구문을 적용

: app.js - return에서 ReadContent 구문 동적구성
{_article}

1.2.2 추출된 _article 변수는 render 처리를 위한 변수로 선언하고, 

 mode 에 따른 표시정보를 구성하는 로직에 ReadContent 구문을 적용

: app.js - _article 변수 선언(_article 추가)
var _title, _desc, _article = null;

: app.js - render() 구성시 기존 ReadContent 적용 로직
if(this.state.mode === 'welcome'){
  ...
  _article = <ReadContent title={_title} desc={_desc}></ReadContent>
}else if(this.state.mode === 'read'){
  ...
  _article = <ReadContent title={_title} desc={_desc}></ReadContent>
}

1.2.3 변경사항 확인

 - 기능의 변화 없이 _article로 추출한 ReadContent 정상표시여부 확인

1.2.4 mode 값이 create 로 변경될 경우 _article 영역에 CreateContent 표시

 - import에 CreateContent 추가

 - state.mode 가 create 인 경우 _article 영역에 CreateContent 표시

: app.js - import 구문추가 (CreateContent)
import CreateContent from './components/CreateContent';

: app.js - render()의 mode 별 처리로직에 CreateContent 표시로직 추가

if(this.state.mode === 'welcome'){
  ...
  _article = <ReadContent title={_title} desc={_desc}></ReadContent>
}else if(this.state.mode === 'read'){
  ...
  _article = <ReadContent title={_title} desc={_desc}></ReadContent>  
}else if(this.state.mode === 'create'){
  _article = <CreateContent></CreateContent>
}

 

 

* 다음 기능

 - CreateContent의 form 영역 구성

# React-19.2. create 구현 -  mode 변경 기능

 

1. button 영역 추가

: src\App.js - rander의 toc 컴포넌트 다음에 버튼영역 추가
<ul>
  <li><a href="/create">create</a></li>
  <li><a href="/update">update</a></li>
  <li><input type="button" value="delete"  ></input></li>
</ul>

2. 추가한 button 영역을 컴포넌트로 추출 : Control

: app.js - import 영역 추가
import Control from './components/Control';

: app.js - rander 영역 추출코드로 변경
<Control></Control>
: Control.js 추가
import React, { Component } from 'react';

export class Control extends Component {
  render() {
    console.log("Control render");
    return (
        <ul>
          <li><a href="/create">create</a></li>
          <li><a href="/update">update</a></li>
          <li><input type="button" value="delete"></input></li>
        </ul>
    );
  }
}

export default Control; // app.js에서 중괄호 없이 import 가능

3. app.js에서 Control 영역에 그려진 li 항목 선택시 이벤트 발생

 - Control 클릭시 app.js의 mode 정보 수정

3.1 Control 컨트롤러에 이벤트를 추가하여 app.js에 정의될 사용자 이벤트함수 호출

: Control.js - 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>

3.2 Control 컨트롤러 클릭시 호출할 사용자 이벤트 함수 정의

: app.js - return에서 호출하는 Control에 사용자 이벤트 함수 추가

<Control onChangeMode={function(_mode){
  this.setState({
    mode : _mode
  });
}.bind(this)}></Control>

 

* 다음 기능

 - mode(create, update, delete) 값에 따라 Content 표시영역 변경되도록 수정

# React-19.1. create 구현 -  소개 

 - CRUD 처리

 

1. 설계

1.1 Toc 목록 상단 에 버튼 컴포넌트 추가 : 생성, 수정, 삭제

1.2 create 버튼 : app의 mode 값을 create로 변경

 - read 모드의 Article 의 내용(컴포넌트)을 create 내용(컴포넌트)으로 교체

1.3 create 컴포넌트 : 입력폼 구성

 - create 정보 입력 후 저장 시

 > app 컴포넌트의 contents state에 새로운 contents 정보 추가(id, 제목, 본문)

 - toc에 표시될 내용에 추가된 내용 표시 : 생성기능

 

2. 화면 리뷰(작성된 상태)

2.1 toc 항목 위에 create, update, delete(버튼) 추가

2.2 create 클릭 

 - mode 값을 'create'로 변경

 - content 영역을 CreateContent(input form 구성)로 변경

2.3 CreateContent 영역의 input form 작성 후 submit 버튼 크릭 

 - event 발생(app contents 영역에 등록되어 있는 항목 끝에 input form으로 입력한 정보 등록)

 - toc 영역에 등록된 정보가 추가됨

 - CreateContent 입력 항목은 초기화 됨

2.4 toc에 표시된 항목 선택 (등록된 항목)

 - content 영역을 선택한 항목에 맞는 ReadContent로 변경

# React-18. 베이스 캠프

1. 리뷰

 - 실행, 배포, 컴포넌트 작성

2. 개념정리 

- 인포그라피 를 이용한 이미지 개념확인

(그림 https://velog.io/@lllen/React-eig7ww7p)

 1. Props, State 차이점 

 * Props : 읽기전용 

 * State : setState이용하여 수정가능

 ** 읽기전용 propse

  - App에서 Article에 props로 _title 정보를 전달시 Article 컴포넌트에서 전달된 _title을 수정할 수 없다.

  > react에서 오류발생

: src\App.js - App에서 Article 컴포넌트 선언부에서 props로 _title 전달

<Article title={_title} desc={_desc}></Article>

: src\components\Article.js - render 응답요소를 구성하기 전 _title로 전달된 속성 변경

this.props.title = 'hi ';

* 오류발생
TypeError: Cannot assign to read only property 'title' of object '#<Object>'

 - 내부적인 필요 정보, 상테는 State 이용

2. 공통점 : render 함수를 호출함

(그림 https://github-wiki-see.page/m/hochan222/Everything-in-JavaScript/wiki/React-Basic)

Component : props(외부에서 컴포넌트를 사용 -제어 ), state(내부사용-구현자)

 - 컴포넌트는 props, state에 따라 특정 상태가 되며 실제브라우에 표현되는 HTML(DOM)에 영향을 준다. 

 

(그림 https://c17an.netlify.app/blog/React/redux-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0/article/)

* 컴포넌트의 상태가 변하면 변경된 상태를 참조하는 컴포넌트가 다시 그려진다. 

 1. 상위 컴포넌트가 하위 컴포넌트 수정시 props 수정

 - Toc 글목록은 date(props)의 값을 전달하여 화면에 목록정보 표시

 2. 하위 컴포넌트가 상위 컴포넌트 수정시 event 이용

 - Toc 클릭 시 상위 컴포넌트(App)의 props(mode)를 전달하기 위해 이벤트 사용

  > App 에서 Toc 컴포넌트의 props에 값을 전달하여 변경 

* 리덕스 

 - 컴포넌트의 상태를 하나의 저장소인 STORE를 이용하여 체계적으로 상태를 관리한다.

 > STORE의 특정 상태가 변경되면, 관련된 컴포넌트에 적용될 수 있게 처리

 

(정리)

* props, state 차이점

* 상위 컴포넌트, 하위컴포넌트 간 데이터 전달 방식 (props, event)

 

(다음내용) - react 등록, 수정, 삭제

# React-17.3. 컴포넌트 이벤트 만들기

 - 17.1 사용자 이벤트를 추가하여 App에서 선언한 이벤트를 Subject에서 호출하면, Article에 Subject의 내용 표시

 - 17.2 Toc의 요소를 선택하면 App의 mode 속성을 변경하도록 이벤트 등록

 - 17.3 : Toc의 요소를 선택하면 변경된 mode에 맞춰 Article에 표시할 정보 구성 및 Toc 이벤트와 컨텐츠의 클릭 이벤트 사이 정보전달

 

1. Toc 컨텐츠의 선택을 가정하고, 선택한 컨텐츠의 표시정보 구성

1.1. App에 Toc에서 선택한 요소를 처리하는 속성 추가

: src\App.js - constructor의 state에 속성추가
select_content_id:2,

1.2. 추가한 속성을 기준으로 read에 해당하는 render의 표시정보를 동적으로 설정

 - 반복문을 이용한 기준속성에 맞는 표시정보 설정

: src\App.js - render에서 read 속성에 따라 Article에 표시할 정보 설정

(임시 설정정보)
_title = this.state.contents[0].title;
_desc = this.state.contents[0].desc;

(동적 설정정보)
var i=0;
while (i < this.state.contents.length) {
  var data = this.state.contents[i];
  if(data.id === this.state.select_content_id){
    _title = data.title;
    _desc = data.desc; 
    break;
  }
  i = i + 1;
}

 > App 의 state에 선언왼 select_content_id의 값에 따라 toc에 등록된 contents 정보가 Article에 표시됨

2. Toc 이벤트와 컨텐츠의 클릭 이벤트 사이 정보전달

2.1 Toc 클릭시 이벤트에 선택한 정보 전달

:src\App.js - retun의 toc 요소에 선언된 onChangePage 이벤트에서 select_content_id 값을 변경하여 Article 표시정보를 설정
 - 임시값 설정
onChangePage={function(){
  this.setState({
    mode:'read',
    select_content_id:0
  });
}.bind(this)}

2.2 Toc 클릭이벤트를 이용하여 App 컴포넌트에서 정의한 onChangePage 이벤트를 실행할 때, 식별정보 전달

2.2.1 HTML 요소의 속성을 이용한 정보전달

 - data-id=식별정보 추가

 - onClick 함수에서 이벤트 객체를 이용한 data-id 정보 참조

 > e.tartet.dateset.id 참조정보를 onChangePage 함수의 파라미터로 전달 ( 주의 : 전달 정보의 자료형 맞춤)

 * 클릭이벤트의 이벤트객체 확인

:src\components\TOC.js render에서 contents 코드를 구성할 때, 
 클릭이벤트가 App에서 정의한 사용자이벤트를 호출하며 식별정보를 전달할 수 있도록
 a 테그에 data-id 속성을 추가하고, 
 클릭이벤트에서 해당 속성의 정보를 onChangePage 함수의 파라미터로 전달함
<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>

2.2.2 bind를 이용한 정보전달

 - 바인드의 두번째 인자(this 다음)로 값을 선언하면, 함수의 첫번째 인자로 참조 가능

 > 바인드의 this 속성은 고정이며, 뒤에 붙는 정보는 함수의 첫번째 부터 파라미터로 정의하고, 마지막에 이벤트 객체를 선언함.

: src\components\TOC.js - 바인드에 인자를 추가하고, 함수에서 파라미터로 추가한 인자를 참조
 - 순서 주의 (this 이후의 인자를 함수 첫 파라미터부터 선언하고, 이벤트객체를 함수의 마지막 파라미터로 선언)
<a 
  href={"/content/"+data[i].id}
  data-id={data[i].id}
  onClick={function(id, title, e){
    e.preventDefault();
    this.props.onChangePage(e.target.dataset.id);
  }.bind(this, data[i].id), data[i].title}
>{data[i].title}</a>

 

(정리)

Toc의 컨텐츠를 선택한다.

선택한 컨텐츠의 식별정보를 사용자 이벤트에 전달한다.

사용자 이벤트에서 대상정보를 화면에 표시한다.

 

(참고)

* 클릭시 함수의 이벤트객체(e) 참조방법

 - e.preventDefault(); 클릭 이벤트 실행에 따른 화면 새로고침 등의 이벤트 동작을 제한하는 기능

 - e.target : 이벤트가 발생한 HTML 요소(a 테그)

 - e.target.dateset : 이벤트를 발생한 HTML 요소(a)의 속성 중 data 속성으로 정의된 속성값(data-id) 참조

 > e.target.dataset.id : data-id 속성

* 이벤트객체의 속성으로 데이터를 참조할 때

, - data 뒤에 이름을 부여하여 해당 이름으로 target의 dateset 요소를 참조한다.

  > data-참조명 : e.target.dateset.참조명

# React-17.2. 컴포넌트 이벤트 만들기

 - 17.1 사용자 이벤트를 추가하여 App에서 선언한 이벤트를 Subject에서 호출하면, Article에 Subject의 내용 표시

 - 17.2 : Toc의 요소를 선택하면 App의 mode 속성을 변경하도록 이벤트 등록

 

1. App.js에서 호출하는 Toc 테그의 속성(props)으로 이벤트를 선언한다.

:src\App.js return의 Toc props에 사용자 이벤트 추가
onChangePage={function(){
  alert('hello.Toc');
}.bind(this)}

2. Subject.js에서 render로 호출하는 list 요소의 링크 속성에 앞서 선언한 이벤트를 호출한다.

src\components\TOC.js return에서 생성하는 리스트의 a테그 속성에서 이벤트 사용
onClick={function(e){
  e.preventDefault();
  this.props.onChangePage();
}.bind(this)}

1.3 생성한 이벤트:onChangePage() 에서 모드를 수정하여 Article의 내용이 변경되는지 확인

(정리)
:src\App.js - render()의 return 요소 중 subject porps에 사용자 이벤트 추가
<Toc 
  onChangePage={function(){
    this.setState({mode:'read'});
  }.bind(this)}
  data={this.state.contents}
></Toc>
  
:src\components\Toc.js retun 요소로 생생하는 리스트의 a테그에 App에 추가한 사용자이벤트를 사용하는 이벤트 추가
lists.push(
  <li key={data[i].id}>
    <a 
      href={"/content/"+data[i].id}
      onClick={function(e){
        e.preventDefault();
        this.props.onChangePage();
      }.bind(this)}
    >{data[i].title}</a>
  </li>);

# React-17.1. 컴포넌트 이벤트 만들기

 - 17.1 : 사용자 이벤트를 추가하여 App에서 선언한 이벤트를 Subject에서 호출하면, Article에 Subject의 내용 표시

 

* 앞서 App.js에서 임시로 작성한 subject의 동작을 이벤트를 이용하여 subject에서 처리되도록 이벤트 만들기

 - subject의 title인 'WEB'을 클릭했을 때, 이벤트를 만들어서 처리하자.

1.1 App.js에서 호출하는 Subject 테그의 속성(props)으로 이벤트를 선언한다.

:src\App.js return의 Subject props에 사용자 이벤트 추가
onChangePage={function(){
  alert('hello');
}.bind(this)}

1.2 Subject.js에서 render로 호출하는 title 의 링크 속성에 앞서 선언한 이벤트를 호출한다.

 - this.props.onChangePage();

:src\components\Subject.js return의 a테그 속성에서 이벤트 사용
onClick={function(e){
  e.preventDefault();
  this.props.onChangePage();
}.bind(this)}

1.3 생성한 이벤트:onChangePage() 에서 모드를 수정하여 Article의 내용이 변경되는지 확인

:src\App.js return의 Subject props에 추가한 이벤트 수정
onChangePage={function(){
  this.setState({mode:'welcome'});
}.bind(this)}

 

(정리)
:src\App.js - render()의 return 요소 중 subject porps에 사용자 이벤트 추가
<Subject 
  title={this.state.subject.title} 
  sub={this.state.subject.sub}
  onChangePage={function(){
    this.setState({mode:'welcome'});
  }.bind(this)}
></Subject>
  
:src\components\Subject.js retun 요소 중 a테그에 App에 추가한 사용자이벤트 사용 이벤트 추가
<header>
  <h1><a href="/" onClick={function(e){
    e.preventDefault();
    this.props.onChangePage();
  }.bind(this)}>{this.props.title}</a></h1>
  {this.props.sub}
</header>

# React-16.5. 이벤트 setState 함수 이해하기

 

* 이벤트에서 state 변경

 - 이벤트에서 컴포넌트의 state를 변경하기 위해 bind로 state 정보를 전달해야 함

1.1 전달된 state 정보의 비정상 변경방법

 - mode 값이 변경되지만, react가 인지하는 정상적인 방법이 아닌 관계로 

 > render를 다시 호출하지 않음 (변경 결과가 컴포넌트에 적용되지 않음)

this.state.mode = 'welcome';

1.2 전달된 state 정보의 정상 변경방법

 - mode 값이 변경되며 react가 인지하여 변경 결과가 적용됨

 > render를 호출하여 새로고침 실행

this.setState({
  mode:'welcome'
});

# React-16.4. 이벤트 bind 함수 이해하기

 

* 바인딩 : bind는 함수밖에 선언한 정보를 참조할 수 있도록 함수에 주입해준다

 - 개발자 도구 콘솔 테스트

// bintTest()에서는 함수 밖에서 선언한 obj를 참조할 수 없다
var obj = {name:'jkoogi'};
> undefined
function bindTest(){
  console.log(this.name);
}
> undefined
bindTest();
> undefined

// bind는 함수밖에 선언한 정보를 참조할 수 있도록 함수에 주입해준다
var bindTest2 = bindTest.bind(obj);
> undefined
bindTest2();
> jkoogi
> undefined

/ 바인딩 문법을 확인한다.
bindTest();
> undefined
bindTest().bind(obj);
> Uncaught TypeError: Cannot read property 'bind' of undefined
>     at <anonymous>:1:11
> (anonymous) 
bindTest.bind(obj);
> ƒ bindTest(){
>   console.log(this.name);
> }

+ Recent posts