This git repository has untracked files or uncommitted changes:

~

~~

~~~

~~~~

Remove untracked files, stash or commit any changes, and try again.

error Command failed with exit code 1.

info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.



$ yarn eject


를 하려고 했더니, 다음과 같은 에러가 발생했다.

아니 깃은 무슨 깃이여?

깃 설정 아무것도 안했는데?

하지만, 에러가 났으니 해결 방법을 검색했고 찾았다.


커밋을 해줘야한다고 한다.

솔직히 왜 해줘야 하는지도 잘 모르겠다.

하지만, 다음과 같이 


$ git add .

$ git commit -m "commit text"

와 같이

add를 하고 commit을 해주면~?

정상적으로 에러안나고 

yarn eject가 실행된다.

이유는 솔직히 모르겠다.

위에는 에러!!!


아래는 해결!!!



Posted by sungho88
,

yarn run v1.10.1

error Couldn't find a package.json file in "C:\\Users\\Jang\\Desktop\\routertest"


이건 뭐지 


만들자마자 실행했는데 왜 에러지?

한참을 찾았는데

황당한 이유였다.

리액트 라우터 관련 예제를 실습해보기 위해

routertest라는 폴더를 하나 만들고 그 곳에다가,

create-react-app react-router-tutorial

이라고 입력했다.

그랬더니

routertest 폴더 안에 react-router-tutorial 폴더를 만들고 그 안에 리액트가 설치되었다.


즉, routertest 폴더에서 아무리

npm start

또는

yarn start를 한다고 실행이 될까?

리액트는 하위 폴더인 react-router-tutorial에 설치되었는데.

따라서,

$ cd react-router-tutorial

를 통해 react-router-tutorial 폴더로 이동한 뒤에

실행을 시켜야 작동을 하게 된다.

황당한 실수.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

참고로, 

생성한 routertest 폴더에 리액트를 설치하려면 어떻게 할까?

create-react-app 뛰에 점(.)만 붙여주면 된다. 

붙이지 말고 한 칸 띄어서..

create-react-app .

으로 하면, 해당 디렉토리에 리액트가 설치된다.

이상으로 어이없는 문제 하나 해결!

위는 routertest에서 실행했을 때, 에러 발생. 

왜냐? 설치는 하위 폴더인 react-router-tutorial에 설치되었기 때문이다.




여기에 이렇게!!!!



Posted by sungho88
,

SPA = Single Page Application의 약자이다.

말 그대로, 페이지가 하나인 어플리케이션이다.

예전에는 어떤 웹 어플리케이션을 만들때, 여러 페이지로 구성되었다.

A.html , B.html, C.html , D.html ....

그리고 페이지를 로딩할때마다 서버에서 리소스를 전달받아와서 렌더링했다.

즉, 웹 어플리케이션 뷰를 서버에서 담당했었다.

하지만, 규모가 커지고 사용자와의 상호 작용이 많아짐에 따라, 

데이터 정보 전송 과부화로 인한 속도 저하 등 문제점이 생기게 되었다.

그래서 요즘 나오는 라이브러리 또는 프레임워크는 뷰 렌더링을 서버가 아닌 웹 브라우저가 담당한다.

 

예전에는 페이지를 요청할때마다 서버로 접속하여 받아왔기 때문에, 페이지가 매번 새로고침 되었지만,

SPA의 경우 서버에서 제공하는 페이지가 한 개이며, 

로딩을 한 번 하고난 후에는 브라우저 내에서 나머지 페이지들을 정의하여 보여준다.

일단, 첫 번째 페이지를 받아온 후 다른 페이지로 이동할때는 서버에 새로운 페이지를 요청하는게 아니라,

새 페이지에서 필요한 데이터만 받아와서 다른 종류의 뷰를 만든다.

주소에 따라 다른 뷰를 보여주는 것을 라우팅(Routing)이라 부른다. 

리액트에서는 이 라우팅 기능이 기본으로 내장되어 있지 않기 때문에, 

라우팅 관련 라이브러리인 react-router를 설치해서 구현할 수 있다.

이 라이브러리는 클라이언트 사이드에서 진행하는 라우팅 과정을 쉽게 해준다.

리액트 라우터를 사용하면 페이지 주소를 변경했을 때, 주소에 따라 다른 컴포넌트를 렌더링 해준다.

또한, 주소 정보(파라미터, URL 쿼리 등)를 컴포넌트의 props에 전달하여 컴포넌트 단에서

주소 상태에 따라 다른 작업을 하도록 설정한다.

 

[SPA 단점]

앱 규모가 커질수록 자바스크립트 파일 크기도 너무 커지게 된다는 것이 단점이다.

페이지를 로딩할 때, 실제로 방문하지 않을 수도 있는 페이지와 관련된 컴포넌트 코드도 불러오기 때문.

 

(이후 추가할 예정...)

 

 

 

벨로포트님 블로그 참고했습니다. 추천 100번 합니다!

 

https://www.10000duck.com/ducks/38

 

10000duck - 안전을 위한 법이 우리의 보금자리를 위협합니다.

온라인 모금함을 통해 기부하세요.

www.10000duck.com

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Posted by sungho88
,

http://reactfordesigners.com/

1. 리액트 배우는 3개 강좌

2. 리액트 다른 사람이 만든 코드 보기 3개

 

https://www.taniarascia.com/getting-started-with-react/

- 초보자들을 위해 정리 겁나 잘 해놓은 문서

- 당연히 영어.

- 공식 홈페이지보다 깊이 있지 않지만, 짧고 간결하게 개념을 설명해준다. 

https://reactjs.org/tutorial/tutorial.html

Tic Tac Toe 게임 만들기 공식 홈페이지 강좌


https://velopert.com/reactjs-tutorials

- 한국어로 검색하다보면 결국은 이 velopert 블로그로 가게 되있다.

- 한국어로 된 가장 잘 설명된 블로그인 것 같다.

Posted by sungho88
,

[What Is React?]


공식 홈페이지 링크 주소 : https://reactjs.org/tutorial/tutorial.html#what-is-react

React는 사용자 인터페이스(UI)를 구축하기위한 

선언적이고 효율적이며 유연한 JavaScript 라이브러리이다. 

이 도구를 사용하면 "구성 요소(Component)"라는 작고 분리된 코드 조각으로 

복잡한 UI를 작성할 수 있다. 기본 예제는 다음과 같다.


class ShoppingList extends React.Component {
render() {
return (
<div className="shopping-list">
<h1>Shopping List for {this.props.name}</h1>
<ul>
<li>Instagram</li>
<li>WhatsApp</li>
<li>Oculus</li>
</ul>
</div>
);
}
}

위와같이 재미있는 XML과 유사한 태그를 사용할 것이다. 

컴포넌트를 사용하여 React에게 화면으로 보고 싶은 것을 알려준다.  

데이터가 변경되면 React는 효율적으로 Component를 업데이트하고 다시 렌더링한다.

여기서 ShoppingList는 React Component 클래스 또는 React Component 유형이다. 

Component는 props ("속성[properties]"의 약자)라는 매개 변수를 사용하고,

render 메서드를 통해 표시 할 뷰의 계층을 반환한다.

render 메서드는 화면에 표시 할 내용에 대한 설명을 반환한다.

React는 설명을 취해 결과를 표시한다. 

특히, render는 React 요소를 반환하는데, 이것은 렌더링 할 내용에 대한 간단한 설명이다. 

대부분의 React 개발자는 "JSX"라는 특수 구문을 사용하여 이러한 구조를보다 쉽게 ​​작성한다. 

<div /> 구문은 빌드시 React.createElement ('div')로 변환됩니다. 위의 예는 다음과 같다.


return React.createElement('div', {className: 'shopping-list'},
React.createElement('h1', /* ... h1 children ... */),
React.createElement('ul', /* ... ul children ... */)
);

createElement ()에 대한 자세한 내용은 API 참조 문서에서 확인할 수 있지만 

이 튜토리얼에서는 사용하지 않을 것이다. 대신에 JSX를 계속 사용할 것이다.

JSX는 JavaScript의 모든 기능을 제공한다. 

JSX 내부의 중괄호 안에 JavaScript 표현식도 넣을 수 있다. 

각 React 요소는 변수에 저장하거나 프로그램에서 전달할 수있는 JavaScript 객체이다.

위의 ShoppingList 구성 요소는,

 <div /> 및 <li />와 같은 HTML에서 사용되는 기본 제공 DOM 구성 요소 만 렌더링한다. 

그러나 사용자 정의 React 구성 요소도 작성하고 렌더링 할 수 있다. 

예를 들어 ShoppingItem이라는 컴포넌트를 생성하여, 이 컴포넌트를 호출하여 사용할 수 있다.

<ShoppingItem />과 같이 작성하면 된다. 이렇게 하면, 쇼핑 항목을 참조 할 수 있다. 

각 React 구성 요소는 캡슐화되어 독립적으로 작동 할 수 있다. 

이를 통해 간단한 구성 요소를 조각조각 모아 하나의 복잡한 UI를 작성할 수 있게 된다.


 









Posted by sungho88
,


이것을 설치하게 되면, React 관련 템플릿을 단축키로 작성할 수 있게 된다.


rccclass component skeleton
rrc→class component skeleton with react-redux connect
rccp→class component skeleton with prop types after the class
rcjc→class component skeleton without import and default export lines
rcfc→class component skeleton that contains all the lifecycle methods
rwwd→class component without import statements
rpc→class pure component skeleton with prop types after the class
rscstateless component skeleton
rscp→stateless component with prop types skeleton
rsf→stateless named function skeleton



가장 기본적인 단축키로 rcc와 rsc가 존재한다.


rcc 는 class 형태의 컴포넌트 템플릿이고, rsc는 stateless 즉, 함수형 컴포넌트를 만들어준다.


vs code에서 .js 자바스크립트 파일을 생성한 뒤,


rcc 또는 rsc를 입력하면 자동으로 생성하면 코드가 자동으로 생성된다.


Posted by sungho88
,

리액트 공식 홈페이지


리액트 예제는 


실습 위주의 예제와,


개념(Concept) 위주의 예제로 구분되어 설명된다.


실습 위주의 예제는 Tic Tac Toe 게임을 만들어보며 개념을 익힐 수 있게 된다.


Setup for the Tutorial will give you a starting point to follow the tutorial.


Overview will teach you the fundamentals of React: components, props, and state.

Completing the Game will teach you the most common techniques in React development.

Adding Time Travel will give you a deeper insight into the unique strengths of React.


자바스크립트 개념 설명


이것 역시 영어 사이트이다. 


개발자 영어가 필요한 이유를 또한번 느꼈다.


최근에 올라온 한글 버전 블로그도 찾았다.


React 예제 한글화


  

개발은 하는 것은


브라우저에서 하는 것이 매우 쉽게 할 수 있고, 로컬에서 코드를 작성할 수도 있다.


브라우저에서 하는 것은 Codepen을 사용한다.


개인 PC에서 개발하기 위해서는 리액트를 별도로 설치해줘야 한다.


리액트 설치


0. 최신 버전의 Node.js가 설치되어 있는지 확인하고, 설치해둔다.


1. 리액트를 설치한다.

$ npm install -g create-react-app


2. 리액트 프로젝트를 생성 및 세팅한다. my-app이라는 폴더에 설치가 될 것이다.

$ create-react-app my-app


























Posted by sungho88
,

state는 무엇인가?


- 컴포넌트 내부에서 자체적으로 읽고, 업데이트할 수 있는 값을 사용하기 위해 state가 존재한다.

- 모든 리액트 컴포넌트 안에 존재할 수 있는 오브젝트이다(필수는 아니므로 없어도 된다)

- 컴포넌트 내 state가 변경될때마다 해당 컴포넌트는 다시 렌더링된다(=render()함수가 실행된다)


state를 선언하는 방법


원래는 생성자(constructor) 안에 선언해야 하지만, 생성자 밖에 다음과 같이 선언할 수 있다.


state = {
greeting:"Hello World"
}


이런 형식으로 작성을 하고, 사용할때는 


render() {
return (
<div className="App">
<h1>Helio</h1>
{this.state.greeting}
</div>
);
}


이런식으로 호출해서 사용하며 결과는 다음과 같다.




state를 수정하는 방법(업데이트 하는 방법)


this.state.greeting = "Hello Jang";    


쉽게 생각하면 이렇게 직접 수정하면 될 것 같지만 직접적인 접근은 절대 안된다.


직접적으로 변경하면 render() 설정들이 작동을 하지 않으므로 값은 바뀌지 않는다(리-렌더링이 되지 않는다)


위와같이 코드를 실행하면 다음과 같은 경고가 발생한다.


Compiled with warnings.


./src/App.js

  Line 19:  Do not mutate state directly. Use setState()  react/no-direct-mutation-state


그러므로,  다이렉트로 state값을 수정해서는 안 되며, 


아래와 같이 setState()를 사용하여 값을 변경해야 한다.



this.setState({
greeting: "Hello Jang"
})


변경을 하려면, 이렇게 setState()를 사용한다. 그래야 render()가 정상적으로 리렌더링된다.


즉, setState가 사용되어 state를 변경하면 render()함수가 정상적으로 재작동하게 되며,


state의 값은 새롭게 변경된다. this.setState({}) 으로 기억해두자. 


메소드 ()안에 객체{} 값이 들어가니까..


항상 아래와 같은 구조를 지닌다.


this.setState({

...

.....

})


setState()메소드의 역할은 파라미터로 전달받은 필드를 업데이한 뒤, 컴포넌트가 리렌더링하게 한다.


만약, 렌더링 된 후 몇 초 후에 state값을 바꾸고 싶다면 어떻게 할까?


자바스크립트 문법 중 setTimeout() 함수를 사용하면 된다.


componentDidMount() {
setTimeout(() => {
this.setState({
// state 변경
})
}, 2000) // 시간. 2초 후 실행
}


위 코드는 setTimeout() 함수를 사용하여 2초 후에 setState()메소드를 사용하여 state를 변경하는 코드이다.


setTimeout() 함수를 사용하여 state 내 배열에 항목을 추가하려면 어떻게 할까?


state = {
person:[
{id:1, name:"JANG", age:"21"},
{id:2, name:"HONG", age:"32"},
{id:3, name:"KIM", age:"41"},
{id:4, name:"PARK", age:"55"}
]
}


componentDidMount() {
setTimeout(() => {
this.setState({
movies: [
...this.state.person,
{
name:"SUNGHO",
age:"120",
id:5
}
]

})
}, 2000)
}


2초 후에 person 목록에 추가된다.


그런데, 주의할 점이 있다. 


배열안에


...this.state.person


을 써줘야한다. 이것을 해야 기존 배열이 살아있고, 그 뒤에 추가가 되는 것이다.


이것을 써주지 않으면 person이라는 배열은 기존값들이 전부 사라지고 추가한 항목만 남게 된다.



state와 prop의 가장 큰 차이점은


props는 부모 컴포넌트가 설정하고, 해당 컴포넌트는 받아서 사용하는 "읽기 전용",


state는 해당 컴포넌트가 자체적으로 지난 값으로, 읽을수 있을뿐만 아니라 값을 업데이트하는 기능.

 

Posted by sungho88
,

[React] 02) 리액트(React) 설치 방법 및 구조

 

위 링크에서 리액트를 설치했다면, 아래와 같은 src 폴더를 볼 수 있다.

 



기본적으로 루트 컴포넌트는 <App /> 이며, 파일 경로는 src/App.js이다.


이 컴포넌트에 다른 컴포넌트를 불러와서 사용하게 된다. 


불러오는 방법은 다음과 같다.  먼저 코드를 확인하자.


App.js

import React, { Component } from 'react';
import Basic from './components/Basic';

class App extends Component {
render() {
return (
<div className="App">
<Basic />
</div>
);
}
}

export default App;


두 줄만 추가하면 된다.


1. import Basic from './components/Basic';


2. <Basic /> 



import Basic from './components/Basic';  


위 문장은 App.js에서 다른 컴포넌트를 불러와서 사용한다고 선언한 것이다.


Basic 컴포넌트를 보여줄 것이므로 이 컴포넌트가 어디에 위치한 컴포넌트인지 정의하는 것이다.


이 과정을 생략하면, 어디서 불러오는 컴포넌트인지 알지 못하기 떄문에 에러가 발생한다.


불러온 컴포넌트를 화면에 보여주는 코드가 바로 


<Basic /> 이다. 


마치 HTML 같아보이지만 JSX 문법이다. 


저렇게 쓰면, Basic 컴포넌트가 화면에 렌더링된다.


참고로 Basic.js는 다음과 같다.


Basic.js

import React, { Component, PropTypes } from "react";

class Basic extends Component {
render() {
return (
<div>
<h1>나의 이름은 {this.props.name} 라고 한다!</h1>
</div>
);
}
}
export default Basic;


결과는 아래와 같다.



나의 이름은 라고 한다!



<h1> 태그를 사용했기 때문에, 굵은 제목의 텍스트가 정상적으로 출력된 것을 볼 수 있다. 근데 뭔가 이상하다.


{this.props.name} 부분이 나오지 않았다.


왜냐하면, {this.props.name}는 텍스트가 아니기 때문이다. 


JSX에서 중괄호 { }는 이용해서 변수, 함수 등 문자열이 아닌 여러 표현식(자바스크립트)을 사용하기 위해 사용된다.


그렇다면 this.props.name은 어디서 나온 것이며, 왜 아무것도 나오지 않는 것인가?


props는 properties를 줄인 표현으로 부모 컴포넌트로부터 물려받는 속성이다. 


클래스 컴포넌트에서 props에 접근하기 위해서는 this 키워드를 사용하면 된다.


이 props값은 해당 컴포넌트를 불러와서 사용하는 부모 컴포넌트에서만 설정할 수 있다. 


이 props라는 개념을 통해 부모 컴포넌트와 소통할 수 있다. 여기서 부모 컴포넌트는 App.js이다.


(해당 컴포넌트를 사용하는 컴포넌트를 부모라 부른다.)


부모 컴포넌트에서 전달하는 props가 바뀌면 자동으로 업데이트된다.


이것이 리액트가 동적으로 컴포넌트 값을 변경할 수 있게 해주는 핵심 개념이다.


하지만, 자식 컴포넌트 자신은 해당 props를 읽기 전용으로만 사용할 수 있으므로 제한적이라고 할 수 있다.


따라서, App.js 에서 <Basic /> 부분을 다음과 같이 추가한다.


<Basic name="Gil-Dong Jang"/>


이렇게 HTML 태그 속성 작성하듯 해주면, Basic에서는 props 값이 전달되고 값을 읽어들여 다음과 같이 출력된다.


(참고)


문자열 이외 다른 종류의 값을 컴포넌트에 전달할때는 반드시 { } 중괄호로 감싸야한다. 그렇지 않으면 에러가 발생한다. 



나의 이름은 Gil-Dong Jang라고 한다!





[defaultProps]


또는, 자식 컴포넌트에서 props의 기본값을 설정 해놓을 수 있다.


만약, 부모인 App.js에서 실수로 props 를 빠트리거나 특정 상황에서 props를 일부러 비워두어야 할 때 유용하게 사용할 수 있다.


이것을 사용하면, 부모에서 name 값을 보내주지 않아도 정상적으로 기본값이 나오므로 이상한 문장( = 나의 이름은 라고 한다!) 을 방지할 수 있다.


import React, { Component, PropTypes } from "react";


class Basic extends Component {
render() {
return (
<div>
<h1>나의 이름은 {this.props.name} 라고 한다!</h1>
</div>
);
}
}


Basic.defaultProps = {
name :"Jang"
}
export default Basic;


위는 동일하고, 아래와 같이  class 밖에 하단에 다음과 같이 defaultProps를 정의해주면 된다.



Basic.defaultProps = {
name :"Jang"
}


이러고,


<Basic />


으로 name 속성을 빼게 되면,


나의 이름은 Jang라고 한다!


과 같이 정상적으로 출력된다. 이외에도 클래스 내부에서 정의하는 방법이 있다.


class 밑에



static defaultProps = {
name : 'Jang',
}


이렇게 하더라도, 동일한 결과가 나온다.


static을 붙이지 않으면 보이지 않는다는 점 명심하자.


 



[propsTypes]


컴포넌트의 필수 props를 지정하거나,

원하는 props 타입을 지정하고자한다면 propsTypes를 사용한다.

사용법은 defaultProps와 동일하다.


먼저, 



import PropTypes from 'prop-types';


을 선언한다.


그 다음 defaultProps와 동일한 위치에 사용한다.



Test.propTypes = {
name: PropTypes.string.isRequired
};



이렇게 작성하거나,


클래스 아래,


static propTypes = {
name: PropTypes.string
}


와 같이 작성하면 된다.


name은 props의 이름이며,


PropTypes.string의 경우 props의 타입을 의미한다.


PropTypes.string의 경우 props의 타입을 문자열로 설정하겠다는 의미이다.


만약 숫자를 입력하려고하면 에러가 발생한다.


자세히 말하면, 화면에 성공적으로 결과는 출력된다.


하지만, 콘솔창을 열어보면 에러가 발생한 것을 볼 수 있다.


index.js:1452 Warning: Failed prop type: Invalid prop `name` of type `number` supplied to `Test`, expected `string`.

    in Test (at App.js:9)

    in App (at src/index.js:7)





isRequired 의 경우, props를 지정하지 않았을 경우 발생하는 것이다.

즉, 필수적으로 props를 보내야하는 것을 isRequired 로 선언한다.





Posted by sungho88
,

리액트를 설치하면, 기본 파일이 생성된다.


App.js가 루트 컴포넌트이다.


이 파일에는 다음과 같이 작성되어 있다.


import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';


class App extends Component {
render() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<h1 className="App-title">Welcome to React</h1>
</header>
<p className="App-intro">
To get started, edit <code>src/App.js</code> and save to reload.
</p>
</div>
);
}
}


export default App;




 

여기서, render 함수 안에 return 안ㅔ html로 생긴 이것이 바로 JSX 코드이다.


<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<h1 className="App-title">Welcome to React</h1>
</header>
<p className="App-intro">
To get started, edit <code>src/App.js</code> and save to reload.
</p>
</div>


JSX 코드는 리액트 컴포넌트를 만들때 사용하는 언어이다.


.js로 파일을 생성하면, render() 에서 태그가 자동완성 되지 않아 고생이 많았다.


알고봤더니, React에서는 .jsx로 작성해야한다.


이렇게 하면, HTML 자동 완성이 된다.


하지만, 반전이 있다.


HTML 문법이지만, HTML이 아니다. 이것은 자바스크립트이다. 


리액트에서 빌드시, 고쳐준다고 한다. 고맙다.


JSX파일


다만, jsx보다는 js로  주로 사용된다.

Posted by sungho88
,