728x90
React
- 자바스크립트 라이브러리
API는 라이브러리의 사용방법 - 구조가 MVC, MVVM과 같은 다른 프레임워크등과는 다르게 오직 View만 처리하는 라이브러리
- 라이브러리들이 하나씩 합쳐져서 뼈대를 이루고 있는게 프레임워크
- 첫페이지만 가져와서 수정이 있으면 그 부분만 change 해줌 = 이런것을 react의 virtual dom이 해줌
React git에서 가져오기
node.js 설치하고 설치하고, git으로 pull 당긴 후,
npm install - node.js 만들기
npm start - node start로 시작
SPA
- Single Page Application - 화면 하나만 가지고 처리하는 구조
- 어떻게? 번들러(Webpack)가 해줌
node.js를 통해 직접 설정할 수 있음. 그러나 리액트 프로젝트 생성시 자동으로 포함. 번들러는 종류가 많음
node.js 설치 및 사용
- 전역으로 사용해야 하기 때문에 경로 설정 따로 하지 않고 설치
- terminal 창에서 설치 확인
node -v
- react 프로젝트 생성
npm create react-app 프로젝트명
프로젝트 폴더 연결
- node.js 만들기
npm install - node.js 시작
npm start
ctrl + c : 나가기
JSX, Webpack Loader
리액트 기본
- index.html의 id = root를 index.js로 얻어옴
- React.StricMode는 옛날 기능을 사용할때 경고를 출력하는 기능 (클래스형 컴포넌트)
- root의 render함수는 App컴포넌트를 화면에 그림
- App.js 안의 App함수에서는 return을 JSX 문법으로 완성시킴
component (컴포넌트)
- 화면을 구성하는 요소들
- 부분 부분을 사용하기 위해 상속으로 쪼개서 사용
- 컴포넌트 이름의 규칙은 첫번째 글자는 대문자, 카멜 표기법
컴포넌트는 모듈로 export, import 해서 사용
JSX 문법 규칙
- 주석 alt + shift + a {/* 주석입니다, 반드시 중괄호를 달아야 한다는 아님 */}
- return 구문은 반드시 1개이어야 합니다. 반드시 하나의 태그를 리턴해야 함
- div를 사용(하나의 태그로 묶으면 사용가능)하고 싶지 않으면 Fragment 컴포넌트를 사용
- 함수 안에서 변수를 만들고 사용하고 싶으면 {name}를 사용
- if문 대신에 3항 연산자를 사용
- 화면에 그리고 싶은 내용이 없다면 null을 반환
- undefined를 반환하는 상황을 만들면 안됨 ▶ 초기화가 안 된 경우
- DOM에 직접 스타일을 하고 싶은 경우는 객체로 묶고 속성을 카멜표기법으로 사용 (단위 생략시 px)
- class 속성 대신에 className을 사용
- 홀로 사용하는 태그는 반드시 닫는 태그를 작성해야 함 (예: {/* <input /> <br /> */})
1. 함수형
- App 컴포넌트는 app.js에서 export하고, index.js에서 import해서 사용
- 함수의 return을 JSX문법으로 완성해서 export 해주고, import 하는 파일에서 태그처럼 사용 가능
app.js
import logo from './logo.svg';
import './App.css';
import { Fragment } from 'react';
function App() {
const name = "홍길동"; //변수
const age = 20;
const myStyle = {color: 'red', backgroundColor: 'beige', fontSize: 15};
return ( //JSX 문법
<Fragment>
<ul>
<li>1. 주석 alt + shift + a {/* 주석입니다, 반드시 중괄호를 달아야 한다는 아님 */}</li>
<li>2. return 구문은 반드시 1개이어야 합니다. 반드시 하나의 태그를 리턴해야 합니다.</li>
<li>3. div를 사용(하나의 태그로 묶으면 사용가능)하고 싶지 않으면 Fragment 컴포넌트를 사용합니다.</li>
<li>4. 함수 안에서 변수를 만들고 사용하고 싶으면 {name}를 사용합니다.</li>
<li>5. if문 대신에 3항 연산자를 사용합니다.</li>
<li>6. 화면에 그리고 싶은 내용이 없다면 null을 반환합니다.</li>
<li>7. undefined를 반환하는 상황을 만들면 안됩니다. ▶ 초기화가 안 된 경우</li>
<li>8. DOM에 직접 스타일을 하고 싶은 경우는 객체로 묶고 속성을 카멜표기법으로 사용합니다. (단위 생략시 px)</li>
<li>9. class 속성 대신에 className을 사용합니다.</li>
<li>10. 홀로 사용하는 태그는 반드시 닫는 태그를 작성해야 합니다. (예: {/* <input /> <br /> */})</li>
</ul>
<div className='App' style={myStyle}> {/* 첫번째 {} JSX문법 사용할거야, 두번쨰 {} 객체야 */}
안녕하세요<br/>
{name === '홍길동'? '홍길동입니다' : '홍길동이 아닙니다'}
{name === '이순신'? <h3>이순신입니다</h3> : <h3>이순신이 아닙니다</h3>}
{age === 30? <h3>20입니다</h3> : null} {/* 화면에 나타나는게 없음 */}
</div>
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
안녕하세요?
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>
</Fragment>
);
}
export default App;
2. 클래스형
- class 속성 대신에 className 사용
- 리액트에서 제공하는 Component라는 모듈을 상속 받아야 함 (extends Component)
- 클래스형에서는 생성자를 작성할 때 반드시 props를 받고, super를 통해서 부모 컴포넌트에 연결해야 함
- 클래스형 컴포넌트를 render 함수 안에서 return문을 작성
app.js
import { Fragment } from "react";
import MyComponent from "./component/MyComponent";
import MyComponent2 from "./component/MyComponent2";
import MyComponent3 from "./component/MyComponent3";
/* ES6 문법 */
const App = () => {
return (
<Fragment>
<h3>App.JS</h3>
<MyComponent /> {/* 하나로 끝나는 태그, 재활용 가능 */}
{/* <MyComponent /> 주석처리 가능 */}
{/* props: 하위 컴포넌트로 전달되는 데이터 값 */}
<MyComponent name={'홍길동'} age={20} email={'aaa@naver.com'} /> {/* (1) 상위 컴포넌트에서 값을 넣고 */}
<MyComponent2 name={'이순신'} />
<MyComponent2 name={'홍길자'}/>
{/* 클래스형 props */}
<MyComponent3 name={'세종대왕'}/>
</Fragment>
)
}
export default App;
MyComponent3.js
import { Component } from "react";
class MyComponent3 extends Component { /* 리액트에서 제공하는 Component라는 모듈을 상속 받아야 함 */
/*
state는 생성자 안에서 초기화를 합니다.
state의 접근은 this.state를 이용해서 접근합니다.
state는 반드시 객체모형 이어야 합니다.
클래스형에서는 생성자를 작성할 때 반드시 props를 받고, super를 통해서 부모 컴포넌트에 연결해야 합니다.
*/
constructor(props) { //이렇게 해줘야 error를 피할 수 있음
super(props);
this.state = { //this.state는 반드시 객체 모형이어야 함
a: 1,
b: props.name //부모로부터 전달받은 name
}
}
//클래스형 컴포넌트를 render 함수 안에서 return문을 작성
render() {
let {name} = this.props; //props
console.log(name);
return (
<>
<hr/>
<div>아... 이건 클래스형 컴포넌트</div>
state값: {this.state.a};
state값: {this.state.b};
</>
)
}
}
export default MyComponent3;
props [ 중요 ]
- 부모에게 자식으로 데이터 전달 가능
- 하위 컴포넌트로 전달되는 데이터 값
- src/index.js에서 두번씩 렌더링 될 때
1. 실습
- 첫번째 매개변수로 props를 받아서 찍어보면 객체가 나옴
- name, age, email을 설정 = 하위 컴포넌트에서 값을 뿌려줌
2. 실습 - 구조 분해 할당
3. 실습 - props하지 않고 직접 넣어서 사용
props의 기본값
props의 타입검증
오늘 하루
더보기
기억에 남는 부분
-
-
어려운 부분
-
-
문제 해결 부분
-
-
728x90
'클라이언트 > React' 카테고리의 다른 글
[React] css적용 (0) | 2023.01.18 |
---|---|
[React] Component 반복, 이미지 가져오기, hook(useState, userEffect, useRef, useReduce) (0) | 2023.01.17 |
[React] state, useState({객체}), 이벤트 핸들링 (3) | 2023.01.16 |
[React] ES6, class, module export & import (0) | 2023.01.13 |
[React] ES6 문법(let, const), spread operator, Destructuring assignment, for of문, Backtick, Arrow Function(forEach, filter, map) (1) | 2023.01.12 |