1. 터미널에 들어가서 해당 디렉토리에서 


code . 


을 입력하면 vs code가 바로 열린다.


하지만, 초기 세팅이 필요하다.


세팅없이 사용하려고 하면, 다음과 같은 에러가 발생한다.


not found이므로 found해주자.



-bash: code: command not found



설정 방법


1. VS Code 를 실행한다.


2. 명령팔레트를 실행한다. 이것은 보기 메뉴 맨 위에 위치한다. 영어로는 View - Command Pallete


3. Shell Command 입력 후 Install한다.


4. 다시 터미널로 돌아가서 재시도!


5. 뿅~



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
,

1) 컴포넌트 라이프사이클(Component Lifecycle) : 렌더링


컴포넌트는 생성되면서부터 여러 기능들을 정해진 순서대로 실행하는데 


이것을 Component Lifecycle이라 부른다.


컴포넌트 수명은 페이지 렌더링 되는 순간 시작해서, 페이지가 사라질 때 끝난다.


즉, render를 통해 우리에게 보여주고 그 다음 흐름까지 정해진 함수들이 존재한다.


이것은 개발자가 고려하지 않아도 자동으로 진행된다.


따라서, 반드시 구현해야 하는 메소드는 아니므로, 원할때 클래스 안에서 호출하여 사용하면 된다.


1) constructor(props)


constructor(props) {
super(props);
console.log('[App.js] Inside Constructor')
  state = {
persons: [
{ name: 'SUNG', age: 10 },
{ name: 'JANG', age: 25 },
{ name: 'Ho', age: 40 }
]
showPersons: false
}
}


2) componentWillMount()


3) render()


4) componentDidMount()


순서는 위와 같다. 콘솔로 확인을 해보면,


componentWillMount() {
console.log('[App.js] - componentWillMount()')
}

componentDidMount() {
console.log('[App.js] - componentDidMount()')
}

render () {

console.log('[App.js] - render()')

}



이렇게 구글 개발자 콘솔에서 확인할 수 있다.




메서드는 엄청 많다.


그 중에서, 


Will~~~ 붙은 것은 어떤 작업을 하기 전에 실행되는 메소드이며,

Did~~~ 가 붙은 것은 어떤 작업을 작동한 후에 실행되는 메소드이다.


라이프 사이클(Life Cycle)은 마운트, 업데이트, 언마운트 카테고리로 나눠진다.



01) 컴포넌트 라이프사이클(Component Lifecycle) : 마운트


DOM이 생성되고, 웹 브라우저상에 나타나는 것을 마운트(Mount)라고 한다.


마운트될 때, 호출하는 메소드는 다음과 같다.


1. constructor

- 컴포넌트를 새로 만들때마다 호출되는 클래스 생성자 메소드.


2. getDerivedStateFromProps



01) 컴포넌트 라이프사이클(Component Lifecycle) : 마운트


업데이트할때는 4가지 경우이다.


1. props가 변경될 때

2. state가 변경될 때

3. 부모 컴포넌트가 변경될 때

4.. this.forceUpdate로 강제로 렌더링할 때


Posted by sungho88
,

먼저, 


Splice의 사전적 정의는


(밧줄의 두 끝을 함께 꼬아서) 잇다   2. (필름・테이프 등의 두 끝을) 붙이다


이다.


삭제하는 메소드를 찾았는데 잇다, 붙이다라니? 이것이 과연 배열 요소를 삭제하는 메소드가 맞을까?


맞다!


1. splice를 이용해 삭제하는 방법


var a = [1, 2, 3, 4, 5, 6, 7];


이런 배열이 있다고 가정하다.


삭제하는 방법은 다음과 같다.


a.splice(0, 3);


이 명령어의 의미는 : 0번 배열부터 3개를 제거하라


따라서 a 배열은


[4,5,6,7]이 된다.


2. splice를 이용해 배열을 두개 만드는 방법


만약, var 에 변수에 값을 넣게 되면 어떻게 될까?


var b = a.splice(0, 3);


결과

console.log(a); // 결과 : [4,5,6,7]

console.log(b); // 결과 : [1,2,3]


즉, 떼버린 값을 b에 넣어 배열이 두 개로 쪼개졌다.

Posted by sungho88
,

HTML 작성시에는 워낙 잘 되서 필요가 없다.


하지만, 리액트에서 JSX파일을 수정할 때는 자동완성이 안되서 난감했다.


태그를 일일히 다 작성하고, 끝 태그(</..>)까지 일일히 맞춰줘야한다니...말도 안된다.


JSX에서 HTML을 작성할 수 있는 방법을 찾다가 못 찾았다.


대신, 자동으로 끝 태그를 생성해주는 패키지는 찾았다.


이름은 너무나 쉽다.


Auto Close Tag


이다.


이것을 패키지 창을 열고(왼쪽 수직으로 정렬된 항목 중 가장 마지막 네모)



이것을 누른 후, Search Extensions...


에다가 입력한다.


그리고 선택 후, Install 고고~


그 다음 Reload한 뒤 해보면 적용이 된다!




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
,

리액트를 간단히 설치하는 방법이 존재한다.


바로 create-react-app을 사용하는 것이다.


사이트로 들어가서 살펴보자.


create-react-app을 설치한 뒤

(설치를 하지 않았을 경우 찾을 수 없다<command not found> 에러남)

 

$npm install -g create-react-app 

//위에 한 줄이면 설치끝!


설치가 정상적으로 되었다면 create-react-app을 통해 리액트 프로젝트를 만들수 있게 되었다.



$create-react-app test

// 이 명령어를 입력하면 해당 경로에 test라는 폴더를 생성 후 그 안에 리액트를 설치하게 된다.

$create-react-app .  

// 폴더를 굳이 생성하고 싶지 않다면 이렇게 .을 입력한다.

// 이렇게 하면 다른 디렉토리 생성 없이 그 위치에 세팅된다. 


$cd test

// 이 명령어로 설치된 test 폴더로 이동한다.

// 만약 create-react-app . 으로 했다면 안 해도 된다.


$npm start

// 리액트 프로젝트를 실행하는 명령어다.

그러면 웹페이지가 자동으로 열리며, 페이지가 하나 뜬다. 만약 안 뜨면 주소창에 


http://localhost:3000/


을 입력해보자. 기본 포트가 3000이기 때문에, Express.js에서 Port를 바꿔줘야한다. 


얘도 기본 포트가 3000이기 때문이다.


에러없이 문제없이 진행했다면 웹 브라우저 화면에 리액트 로고 및  글자가 뜬다.

그럼 설치는 성공이다!


감사하게도, 설명도 나온다.


시작하려면 


src/App.js를 수정하라고 한다.




구조는 다음과 같다.


App.js가 루트 컴포넌트이다.. 다른 컴포넌트를 생성한 후, 이 곳에서 불러다 사용할 것이다.

 








Posted by sungho88
,

리액트(React)는 프론트엔드 라이브러리이다.


간단 웹페이지는 프론트엔드 라이브러리를 쓸 필요없이 


HTML과 CSS 그리고 Javascript만 사용하면 만들 수 있다.


하지만, 요즘은 웹 페이지가 아니라 웹 애플리케이션이라고 부른다.


즉, 단순하고 정적인 웹 페이지로 정보만을 읽는 것이 아니라, 


빈번한 사용자와의 상호 작용과 다양하고 웹 서비스를 제공하게 되었다. 


그만큼 관리해줘야 할 것들이 많아졌다. 


프로젝트 규모가 커져서 사용자와의 인터렉션을 많이 하게되면서,


순수 자바스크립트로 DOM을 포함한 어플리케이션 구조를 직접 관리하는 것은 어려워졌다.


그래서, DOM 관리와 상태값 업데이트 관리 등을 최소화하고, 기능적인 개발, 


그리고 사용자 인터페이스(UI)를 구현하는 것에 집중할 수 있도록 하기위해 라이브러리들 혹은 


프레임워크들이 생성되었다.


이렇게 탄생한 보통의 프레임워크는 MVC, MVVM 등의 아키텍처 구조를 지니고 있다.


M = 모델(Model) - 어플리케이션에서 사용하는 데이터를 관리하는 영역

V = 뷰(View) - 유저에게 보여주는 부분.


[React]


하지만, 다른 프레임워크와 다르게 리액트는 오직 뷰만 중점적으로 보여주는 라이브러리이다.


특정 부분이 어떻게 생길지 정하는 선언체를 컴포넌트(Component)라 부른다.


사용자에게 화면에 뷰를 보여주는 것을 렌더링.


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
,


VS Code를 사용하다가, 변수 선언 중 색상이 다른 한 개를 발견했다.


다른것들은 하늘색인데, 이것만 회색...


뭔가 다른가해서 마우스를 갖다대보니...


위와 같이 경고가 뜬다.


'items'이(가) 선언은 되었지만 해당 값이 읽히지는 않았습니다.


선언은 되었으나 해당 파일에서 사용하지 않고 있다는 의미이다.


자바나 안드로이드 같은 경우 노란색으로 밑줄이 가는데, vs code에서는 경고 밑줄이 없어 놓치기 쉽다.


코드가 틀렸거나, 이 변수가 필요없거나 두 개 중 하나이다.


중복된 코드 부분을 복붙하다가 이 변수를 바꿔주는 것을 잊은 헤프닝이다.


쓸일이 없다면 제거해주면 된다.



Posted by sungho88
,