# 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>

VSCode 가 뭔가 생소한 메시지를 표시한다.

 - 어제 업데이트 하라고 해서 업데이트 파일을 해당 vsCode 폴더에 덮어썼는데, 그때문에 발생하는 현상일듯.

 

 - 해당 경로에 등록된 코드가 신뢰되는 코드인지 확인하여 의도하지 않은 코드의 실행을 제한해 준다고 한다.

 > 내가 사용하는 워크스페이스의 폴더를 들이미는것으로 보아 업데이트 영향이 맞을 듯.

 

thanks:) 관련해서 아래 블로그 글 참고함.

https://websetnet.net/ko/Visual-Studio-%EC%BD%94%EB%93%9C%EC%97%90%EC%84%9C-%EC%9E%91%EC%97%85-%EC%98%81%EC%97%AD-%EC%8B%A0%EB%A2%B0%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C/

 

* https://code.visualstudio.com/docs/editor/workspace-trust

 

Visual Studio Code Workspace Trust security

Visual Studio Code Workspace Trust folder security

code.visualstudio.com

 

'tools' 카테고리의 다른 글

ecilpse 속도 개선  (1) 2023.09.12
vsCode git pull request  (0) 2023.04.16
오류  (0) 2022.10.24
git. push가 갑자기 안되네.. github가 잘못했네.  (0) 2021.10.15
Visual Studio Code  (0) 2021.06.20

# 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);
> }

# React-16.3. 이벤트에서 state 변경하기

이벤트 내에서 컴포넌트의 정보를 바인딩 하여 사용 할 때, 직접 변경할 수 없고, 함수형태로 변경해야 한다.

1. App으로 옮겨온 subject의 title 클릭시  mode로 정의한 state를 read로 변경

1.1 오류발생 코드

 - 이벤트가 호출된 상태의 this는 이벤트의 상태를 참조한다. (컴포넌트에 설정된 state를 사용할 수 없음

: src\App.js - render 로 옮겨온 subject 코드의 이벤트 수정
onClick={function(e){
  console.log(e);
  e.preventDefault();
  this.state.mode = 'welcome';
}}

1.2 이벤트에 컴포넌트의 this를 전달

 - 오류는 발생하지 않지만, 동작하지 않음 (mode 정보 설정)

onClick={function(e){
  console.log(e);
  e.preventDefault();
  this.state.mode = 'welcome';
}.bind(this)}

1.3 이벤트에서 컴포넌트의 값을 사용할 수 있도록 this 정보 설정

 - 설정 후 개발자도구에서 mode 값을 'read'로 변경하면 본문이 바뀜(컴포넌트의 state 값 변경으로 새로고침 됨)

 > 이후 subject의 title 클릭시 mode 값이 welcome 으로 변경되면서 본문 바뀜 (Hello, React !!)

onClick={function(e){
  console.log(e);
  e.preventDefault();
  // this.state.mode = 'welcome'; 동작하지 않음
  this.setState({
    mode:'welcome'
  });
}.bind(this)}

# React-16.2. 이벤트 설치

 

* subject와 toc의 title 클릭시 app의 state를 통해 article 영역(본문)에 해당 컨텐츠를 표시

1. subject 의내용을 풀어서 app에 적용

: src\components\Subject.js - render()의 return 코드
<header>
  <h1><a href="/">{this.props.title}</a></h1>
  {this.props.sub}
</header>

: src\App.js return의 아래 내용을 대체
<Subject 
  title={this.state.subject.title} 
  sub={this.state.subject.sub}>
</Subject>

: src\App.js return에 적용한 코드
<header>
  <h1><a href="/">{this.state.subject.title}</a></h1>
  {this.state.subject.sub}
</header>

2. 이벤트 적용

: 1차 적용 이벤트 - 실행 후 화면이 다시 로딩된다.
onClick={function(){
  alert('hi');
}}

: 2차 적용 이벤트 - 디버그로 로그 표시 (콘솔에서 e.preventDefault(); 로 새로고침 제한 테스트)
onClick={function(e){
  console.log(e);
  debugger;
}}

: 3차 적용 이벤트 - 화면 새로고침 방지 이벤트 적용
onClick={function(e){
  console.log(e);
  e.preventDefault();
}}

 - subject title을 클릭하면 e.preventDefault로 인해 새로고침이 되지 않음

+ Recent posts