DatePicker를 사용할 수도 있지만,


npm을 설치해서 리액트 캘린더를 사용하려고 한다.


먼저, 


https://www.npmjs.com/package/react-calendar


이 사이트에 들어가면 확인할 수 있다.


1. 설치


$ npm install react-calendar 또는

$ yarn add react-calendar으로 설치하면된다.



2. Import

사용하기 위해서는 임포트(Import)해야한다.

import Calendar from 'react-calendar'

으로 선언한뒤에,

<Calendar /> 호출하게 되면, 달력이 나온다.


새로운 date 값을 얻기 위해서는 onChange 이벤트를 사용하면 된다.


또한, 오늘 날짜를 강조하고 싶다면, value값으로 Date() 를 주면 된다.


              <Calendar

                className={classes.calendar}

                onChange={this.onDateChange} 

                value={this.state.date}

              />


state에서는 


state= {

    date: new Date(),

}

이런식으로 있을 것이다. 



  onDateChange = date => { 

    this.setState({

      date: moment(date).format("YYYY-MM-DD")

    })

  };



이렇게 하게 되면, 선택한 날짜가 dete값으로 들어가 원하는대로 날짜를 찾을 수 있다.
















Posted by sungho88
,

class App extends Component {

  render() {

    return (

      <div className="body">

        <Login />

    );

  }

}


이렇게 있는데, 가로 100%, 세로 100%로 크기를 지정하고 싶다면,


쉽게 생각하면


가로 width : 100%


세로 height : 100%


로 하면 될 것 같다. 하지만, 가로는 적용되지만, 세로는 적용되지 않는다.




위에 사진의 경우 아랫쪽 배경이 흰색이라 보이지 않지만, 로그인 폼 부분의 높이만 aqua색이 적용된 것이다.

그렇다면, 어떻게 높이를 전부 바꿀 수 있을까?

HTML이라면, body를 바꾸면 되지만, React에서는 다른 방법이 존재한다.

바로, 단위를 % 말고, 다른 것으로 하면 된다.


여기서 답을 찾았다.


https://webdesign.tutsplus.com/ko/articles/7-css-units-you-might-not-know-about--cms-22573


바로 vh와 vw 단위를 사용하면, 너비값과 높이값을 부모 요소에 맞게 사용할 수 있다. 


vh 요소는 높이값의 100분의 1의 단위입니다. 


예를 들어 브라우저 높이값이 900px일때 1vh는 9px이라는 뜻이다. 즉, 100vh는 브라우저 높이의 전체이다.


이와 유사하게 뷰포트의 너비값이 750px이면 1vw는 7.5px이 됩니다. 따라서, 100vh는 브라우저 너비 전체이다.


즉, 최대 높이값이를 제작할때 100vh로 사용하면 된다.


height를 px등으로 지정하는 것과 달리, 브라우저의 높이가 줄어들거나 늘어나도


vh단위는 1/100 이므로 100vh 설정을 했기 때문에 항상 전체 높이를 잡을 수 있다.


















Posted by sungho88
,

드디어 리액트에서 scss를 사용하기 편리해졌다.


v2가 릴리즈되면서 매우 편해졌다.


지난번까지는 


yarn eject를 해서, css 부분을 복사해 하단에 붙여넣고 sass-loader를 추가하고 


나름 복잡한 작업을 해줘야 SCSS를 인식했다.


하지만, 업데이트되면서,


node-sass만 설치해준뒤,


CSS파일을 불러오듯이,  --> import './App.css';


SCSS파일을 불러와서 사용하면 된다. --> import './App.scss';


와우!


편해졌다.





만약,  node-sass를 설치하지 않고 scss를 사용하려고 한다면 다음과 같은 에러가 발생한다.



쉽게 해석하면,


sass 파일을 import하기 위해서는 node-sass를 설치하라!


라는 의미이다.


yarn add node-sass


또는


npm install node-sass 를 입력한다.


 



(예제)


TestComponent.js를 하나 만든다. 그리고, scss 파일을 import한다.



import React from 'react';
import './TestComponent.scss';


const TestComponent = () => {
return (
<div className="MyComponent">
<h1 className="header01">Test Component</h1>
</div>
);
};


export default TestComponent;


TestComponent.scss를 만든다.



.MyComponent {
background: yellow;
color: black;
padding: 1rem;
.header01 {
background: white;
color: black;
font-size: 3rem;
text-align: center;
padding: 1rem;
}
}

 

App.js에서 TestComponent.js를 import한 뒤, 삽입한다.



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


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


export default App;




이렇게한뒤, 


css를 사용하는 것처럼 적용된다.









Posted by sungho88
,

import 문에서 궁금한 점이 생겼다.


어떤 것은 그냥 import하고, 어떤 것은 중괄호{ } 안에 변수? 를 적어준다는 것이다.


무슨 차이가 있는지 검색해봤다.


만약, 아래와 같은 코드가 있다고 해보자.  



import React from 'react';
import { render } from 'react-dom';



이 파일은 이제부터 React와 render라는 변수를 사용할 수 있다. 


React변수는 react패키지에서 불러왔고, 


render 변수는 'react-dom'이라는 패키지에서 불러왔다.


그런데, 


첫 번째는 그냥 React인데, 두 번째는 { render }처럼 괄호 안에 감싸져 있다. 


차이점은, 보내주는 export 방식의 차이였다. 


모듈을 불러올 때 import라고 써주는 것처럼, 


모듈을 다른 파일로 보내려면 export라고 명시적으로 써줘야한다. 


예를 들어보면,


App.js에서 다음과 같이 선언한다.


const a = 1;
const b = 2;
export { a };
export const c = 3;
export default b;



위와같이 App.js에서 세 가지 방식으로 export를 했다. 


변수 a는 객체에 담아서 export하고, 변수 c는 선언 및 초기화와 동시에 바로 export 했다. 


또한, 변수 b는 독특하게 앞에 default라는 키워드를 붙인 채 export했다. 



또 다른 함수 Sub.js에서 App.js에 export한 것들을 불러오려고 한다.


import d, { a, c as e } from './Example';
console.log(a, d, e); // 1, 2, 3


와 같이 작성한다.


(해석)


App.js에서 export한 값들을 불러오려면,


Sub.js에서는 코드 윗쪽에 import를 선언하면 된다.


from './App' 부분이 App.js로부터 해당 파일로 불러와 사용하겠다는 의미이다. (js는 생략해도 된다) 

 


그런데 뭔가 이상하다.


처음보는 d는 괄호 없이 불러오고, 


나머지 a, c는 괄호 안에서 불러옵니다. 또한, c는 뒤에 as e라고 되어있네요.


default는 번역하면 기본이라는 뜻이다. 


말그대로,default 로 export한 b는 괄호를 사용하지 않아도 import할 수 있습니다. 


그리고 변수명도 Sub.js에서 마음대로 지을 수 있습니다. 


위 코드에서는 변수 d가 바로 변수 b를 import한 것이다. 


나머지 a와 c는 반드시 export할 때의 이름을 그대로 import해야 하며, 괄호 안에서 불어와야 합니다.


괄호 안의 변수도 이름을 바꾸고 싶다면, as 라는 키워드를 사용해 바꿀 수 있습니다. 


c as e라고하면, 변수 c의 값을 변수 e로 넘겨주는 겁니다. 


이렇게 하면 변수 e를 c 대신 사용할 수 있습니다. 


이것은 두 개 이상의 패키지에서 같은 변수 이름을 사용해 변수가 겹칠 때, 


이름을 다르게 바꿀 수 있어 유용하다.



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
,

[리액트 개발 시, state 관리의 문제점]


상태(state)가 업데이트되면 컴포넌트가 렌더링된다.


그리고, 이 컴포넌트의 하위 컴포넌트들은 모두 자동으로 리-렌더링된다.


리-랜더링이 된다는 말은 로딩 시간이 더욱 길어진다는 뜻이다. 불필요한 렌더링은 막아야 한다.


소규모 프로젝트에서는 이러한 불필요한 렌더링을 shouldComponentUpdate를 구현하여  방지할 수 있다.


이 shouldComponentUpdate 함수를 사용하면 render()함수를 실행시키지 않기때문에 렌더링을 하지 않는다.


하지만, 프로젝트가 대규모가 된다면 트리 구조 상 너무 복잡해지며, 일일히 잡아주기도 한계가 있다. 


또한, 하나의 상위 컴포넌트에서 모든 상태(state)를 관리한다면,


2단계 컴포넌트 자신은 필요가 없는데, 3단계 자식 컴포넌트 때문에 갖고 있어야 한다.


따라서, 불필요한 props의 개수가 많아지게 된다.


여러 컴포넌트를 거처서 props를 전달하는 것은 비효율적이며, 가독성이 떨어지게 된다.


이러한 다양한 문제점을 방지하기 위해 Redux를 사용한다.


리액트에서 컴포넌트 트리를 정리해보면 다음과 같다.




리액트는 이러한 계층 구조로 이루어진다. 또한, 루트 컴포넌트(App.js)에서 기본적으로 모든 상태를 관리한다.


그래서, App.js 컴포넌트의 상태를 업데이트하면 App 컴포넌트뿐만 아니라, 모든 하위 컴포넌트들도 리렌더링된다.

 

리액트 프로젝트 환경에서는 부모 컴포넌트(App.js)를 거처야 서로 소통이 가능하다.


부모 컴포넌트를 거치지 않고 직접 소통할 수는 있지만 코드가 꼬여버리기 때문에(스파게티 소스)


절대 그렇게 해서는 안 된다. 그러다보니, 위에서 말한 것과 같이 불필요한 props가 발생되는 것이다.


여러 컴포넌트를 거쳐서 props를 전달하는 것은 비효율적이다.


- 작업할 때, 가독성이 떨어지며,

- props의 개수가 너무 많아질 수도 있다.



만약, G에서 필요한 값을 위해서 App.js B와 C에 쓰이지도 않는 props를 G를 위해 선언해야 한다.


App.js에서는, <B name={"SUNGHO"} />


B에서는 , <C name={this.props.name} />


C에서는, <G name={this.props.name} />


이렇게 보내줘야 G에서 받아서 쓰는 것이다.


그런데, 만약 name 속성을 바꾼다면?  또 3개의 파일을 각각 열어서 name을 일일히 바꿔줘야 한다.


복잡해질수록, 유지보수 역시 최악으로 간다.



[리덕스 개념]


리덕스가 없는 리액트는 상태(state)를 컴포넌트 자신이 자체적으로 상태 관리한다.


반면, 리덕스를 사용한 리액트는 상태 관리의 로직을 컴포넌트 외부에서 관리하는 것이다.


즉, 상태를 좀 더 효율적으로 관리하는데 사용하는 상태 관리 라이브러리라고 할 수 있다.


리덕스를 사용하면 스토어(Store)라는 객체 내부에 상태에 대한 데이터를 담아 관리할 수 있게 된다.

스토어는 리액트 개발 프로젝트상의 상태에 대한 데이터값들을 내장하고 있다.

정리

리덕스를 사용하게되면,

1. 스토어에서 모든 상태 관리를 한다.

2. 상태에 어떤 변화를 일으켜야할 때는 액션스토어에 전달한다. 
    액션 = 객체 형태이고, 상태를 변화시킬 때 이 객체를 참조해서 변화를 일으킨다

3. 액션을 전달하는 과정을 디스패치(Dispatch)라 한다.

4. 스토어가 액션을 받으면 리듀서가 전달받은 액션을 기반으로 상태를 어떻게 변화시킬지 정한다.
    액션을 처리하면 새 상태를 스토어에 저장한다.

5. 스토어의 값이 바뀌면 스토어를 구독(subscribe)하고 있는 컴포넌트에 바로 전달한다.
   이렇게 부모 컴포넌트로 props를 전달하는 작업은 생략하며, 
   리덕스에 연결하는 함수를 사용하여 컴포넌트를 스토어에 구독시킨다.





스토어가 생기면,


G는 더이상 App.js -> B -> C 순으로 props를 받아서 쓰지 않고, 다이렉트로 스토어에 값을 달라고 요청을 한다.


이것을 "G 컴포넌트가 스토어에 구독(Subscribe)한다"고 말할 수 있다.


구독을 하게되면, 나중에 스토어 안에 있는 상태 변동이 있다면, 구독하고 있는 컴포넌트에 바로 전달한다.



만약, B에서 뭔가 이벤트가 발생해서 상태를 변경(Update)하고자할 때는,


dispatch라는 함수를 통해서 액션을 스토어에게 전달한다.


액션(Action)은 객체 형태로 되어 있으며, 상태를 변화시킬때 이 객체를 참조하여 변화를 일으킨다.


이 액션을 전달하는 과정을 디스패치(Dispatch)라 부른다.


스토어가 액션을 받으면 리듀서가 전달받은 액션을 기반으로 상태를 어떻게 변경해야 할 지 정한다.


액션을 처리하게 되면 새 상태를 스토어에 저장한다.


정리


1. 스토어 : 리액트 프로젝트 내 상태 값들을 내장하고 있는 객체.


2. 액션 : 상태 변화를 일으킬 때 참조하는 객체.


3. 디스패치 : 액션을 스토어에 전달하는 것을 의미함.


4. 리듀서 : 상태를 변화시키는 로직이 있는 함수.


5. 구독 : 스토어 값이 필요한 컴포넌트들은 스토어를 구독.



리덕스는 리액트에 종속적(의존적)이지 않다.


즉, 리액트를 사용하지 않아도 리덕스를 사용할 수 있다.


<액션 & 액션 생성 함수>

[액션]
액션은 스토어에서 상태 변화를 일으킬 때 참조하는 객체이며, 이 객체는 반드시 type값이 있어야 한다.

type만 고정이며, 다른 것들은 유동적이므로 자유롭게 선택해 사용하면 된다.

액션 타입은 해당 액션이 어떤 작업을 하는 액션인지 정의한다.(대문자와 밑줄(_) 조합으로 생성)

하지만, 액션을 새로 만들때마다 직접 객체를 만든다면 액션 형식을 모두 알아야하므로 불편하다.

따라서, 액션을 만들어주는 함수를 사용하는데, 이를 액션 생성 함수라 부른다.

[액션 생성 함수]

1. 먼저 액션 타입을 상수값으로 정의한다.

const INCREMENT;
const POINT_NUMBER;

2. 액션 생성 함수를 생성한다.

const increment = () => ({
type: INCREMENT
})

const point = () => ({
type: POINT_NUMBER
})

type외에 다른 값이 들어가야 한다면, 파라미터에 넣으면 된다.

const point = (name) => ({
type: POINT_NUMBER
})


const INCREMENT = 'INCREMENT';
const POINT_NUMBER = 'POINT_NUMBER';


const increment = () => ({
type: INCREMENT
})


const point = (point) => ({
type: POINT_NUMBER,
point: point
})


console.log(increment());
console.log(point(19));


위에서 생성한 액션 생성 함수의 결과는 다음과 같다. 


<리듀서>


- 상태에 변화를 일으키는 함수이며, 파라미터를 두 개 받는다. 


1. 첫 번째는, 현재 상태

2. 두 번째는, 액션 객체


함수 내부에서는 switch문을 활용해서 action.type에 따라 새로운 상태를 만들어서 반환해야 한다. 


리듀서가 초기에 사용할 초기 상태값부터 먼저 설정해야 리듀서를 만들 수 있다.




리덕스 스토어를 구독한다는 것은 리덕스 스토어의 상태가 변경될 때마다 특정 함수를 실행시킨다는 의미.



리덕스를 사용할 때 주의해야 할 세 가지 


1. 스토어는 단 한 개


- 스토어는 언제나 한 개

- 스토어 여러개 생성 후 상태를 관리해서는 안 된다.

- 대신, 리듀서를 여러개 만들어서 관리할 수 있다.


2. state는 읽기 전용


- 리덕스의 상태(state)는 읽기 전용이다. 그러므로, 이 값을 절대로 수정해서는 안 된다.

- 수정을 하게 되면 리덕스의 구독 함수를 제대로 실행하지 않거나 컴포넌트의 리렌더링이 안 될 수 있다.

- 상태를 업데이트할때는 새 상태 객체를 만들어서 넣어주어야 한다.


3. 변화는 순수 함수로 구성


- 모든 변화는 순수 함수로 구성해야 함. 함수란 리듀서 함수를 뜻한다.

- 순수 함수에서 결과값을 출력할때는 파라미터 값에만 의존해야 하

Posted by sungho88
,

const SubClass = ({ children }) => {
return (
<div className="todos-wrapper">
{children}
</div>
);
};


export default SubClass;


원래는 함수형 컴포넌트이므로, (props)를 받아야하지만,


이렇게 비구조화 할당함으로써 가독성을 높일 수 있다.


또한, children의 경우 나중에 해당 컴포넌트 SubClass를 사용하게 될 때,


SubClass를 부르는 태그 안에 내용이 


위 children에 삽인된다. 


그럼 예제를 보자.


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

class App extends Component {
render() {
return (
<div className="App">
<SubClass>
여기에 적은 Text가 children에 들어간다~ <br/>
    <strong>아하하하</strong>
</SubClass>
</div>
);
}
}

export default App;

이렇게 하면, App.js에서 선언한 SubClass 구현 부분 <SubClass>와 </SubClass>안에 내용이 


SubClass.js에서 {children} 으로 대치되어 들어가게 된다.
















Posted by sungho88
,

React 개발환경 세팅을 하게되면 기본적으로 class형 컴포넌트로 이루어져 있다. (App.js) 


하지만, class형 컴포넌트보다 좀 더 간단하게 선언할 수 있다.


바로, 함수형 컴포넌트(Functional Component)를 사용하면 된다.


하지만, 조건이 있다.


1. 해당 컴포넌트에서는 state를 사용하지 않는다.

2. 해당 컴포넌트에서는 라이프사이클 API를 사용하지 않는다.


두 가지만 기억하면 된다. 함수형 컴포넌트를 사용하기 위해서는 위 2가지.

 

state와 컴포넌트 라이프사이클 메소드를 사용할 수 없다.


props를 전달받아서 뷰만 렌더링하는 역할만 하는 컴포넌트를 구현하고자 할 때 사용한다. 


[함수형 컴포넌트 생성 방법]


import React from 'react';


function Hello(props) {
return (
<div>Hello {props.name}</div>
)
}

export default Hello;


이렇게 간단하게 사용할 수 있다. 또는 더욱 간단하게,



import React from 'react';


const Hello = ({name}) => {
return (
<div>Hello {name}</div>
)
}


export default Hello;


이렇게 더 간단하게 사용할 수도 있다.


{name}의 경우 props에 들어있는 name 속성값이며 이를 받아서 사용한 것이다.


이것은 비구조화 할당 문법을 사용한 것이다.


클래스 컴포넌트와 다르게 props를 사용할 때, this를 사용하지 않는다.



Posted by sungho88
,

(설명)

JSX는 HTML이나 XML과 매우 비슷하게 생겼다.

하지만, HTML도 아니고 XML도 아니다.

자바스크립트의 확장 문법이다(공식 문법은 아니다)

나중에 babel-loader를 통해 자바스크립트로 변환된다.


(장점)

1. 가독성이 좋다  - 자바스크립트에 비해, JSX를 사용하면 보기 쉽고, 작성하기 쉽다.

2. 오류 검사가 가능하다 - babel-loader에 의해 오류를 감지할 수 있다.

3. 거부감없이, 쉽게 작성할 수 있다 - HTML과 유사하기 때문에 쉽게 작성이 가능하다.


(사용법)

1. 컴포넌트는 반드시 태그 하나로 묶기

- 컴포넌트에 여러 요소가 있으면, 반드시 하나의 태그로 감싸야 한다. 

- 그 이유는 컴포넌트 내부는 DOM 트리 구조 하나로 구성되어야 하기 때문이다.

- <Fragment>로 감싸면, 불필요한 div를 렌더링하는 것을 생략할 수 있다.

2. 자바스크립트 코드 삽입하기

- { 자바스크립트 표현식을 작성하려면 JSX 내부에서 중괄호{ } 안에 작성하면 된다.

3. if문 대신 삼항 연산자

- JSX 내부 자바스크립트 표현식에서 if문 사용 불가하므로 삼항 연산자를 사용할 것.

4. class 대신 className 사용

- class를 작성하면 경고 발생. class는 이미 존재하는 키워드이기 때문. className을 사용할 것.

5. 태그는 반드시 닫아야 한다.

- <br>, <input> 등의 태그는 HTML에서 닫지 않아도 작동했다. 

- 하지만, 리액트 JSX에서는 반드시 <br /> 또는 <br></br>과 같이 닫아야 오류가 발생하지 않는다.

6. 주석

- 주석은 { */ 주석임... */ } 으로 작성한다.

- 또는 주석 단축키(Ctrl + /)으로 주석을 하면 좀 더 편리하다.

- 흔히 알고 있는 // 나 /* */ 이 주석을 하게 되면 텍스트로 인식되어 그대로 화면에 표시된다.

7. &&을 사용한 조건부 렌더링

- 삼항 연산자를 쓰면 참일때 A화면 출력 거짓일때 B화면 출력을 했다.

- 하지만, 특정 조건을 만족하지 않을 때 아예 화면을 보여주고 싶지 않다면 어떻게 할까?

-  {condition ? '참이에요' : null} 과 같이 삼항연산자를 사용해도 되지만,

- {condition && '보여주세요'} 와 같이 작성해도 된다.

- 쉽다. 앞 condition이 참이면 뒤 '보여주세요'가 나오겠지만, 거짓이면 뒤에는 체크하지 않는다.


8. 인라인 스타일링 

-  CSS 스타일을 자바스크립트 객체 형식으로 생성하여 적용한다.

- 해당 키는 camelCase 형식을 사용한다.


위에 다음과 같이 선언.

const style {

backgroundColor : 'black',

border : 1px solid 'yellow'

...


사용시에는 다음과 같이 적용.

<div style={style}>BODY</div>


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
,