혹시나 잘못된 개념 전달이 있다면 댓글 부탁드립니다. 저의 성장의 도움이 됩니다
facebook에서 개발한 Javascript 오픈소스 라이브러리
선언형 Declarative
: What에 집중하여 어떤 것을 표현하는지를 묘사하는 방식
결과물을 중심으로, 구현하는 과정보다는 어떤 결과물을 도출할 것인지에 초점이 맞춰있는 방식
cf. 명령형 프로그래밍 : How에 집중하여 어떤 과정을 거쳐 구현하는 방식
-> 구현하는 과정은 리엑트가 담당
컴포넌트 기반 Component-Based
: 기능 별로 구분한 코드 묶음
범용성 Learn Once, Write Anywhere
: Javascript로 작성한 프로젝트라면 사용 가능
cf. React native(프레임워크)를 통해 모바일 개발도 가능
cf. 앵귤러는 프론트엔드 프레임워크로 정해진 형식이 있기 때문에 유연하게 수정하기가 힘듦
JavaScript XML
html과 Javascript가 결합된 문법으로 React에서 UI를 표현할때 사용
/*---- only React ----*/
return React.createElement('h1', null,`좋은아침, ${formatName(user)}님!`);
//JSX 없이 React element를 만들 수는 있지만 복잡해서 가독성 떨어짐
/*---- JSX ----*/
return (<h1>좋은아침, {formatName(user)}님!</h1>);
// 직관적으로 이해하기 쉬움
Babel
: 브라우저에서 실행할 수 있도록 JSX를 Javascript로 컴파일
npm install
로 바벨이 자동 설치
-> 컴파일 단계를 거쳐야 하기 때문에 라이브서버 등으로 확인 할 수 없고, npm run start
를 사용함
/*---- DOM ----*/
const user = {
firstName: "HTML",
lastName: "DOM"
};
function formatName(user) {
return (user.firstName + " " + user.lastName);
}
const heading = document.createElement("h1");
heading.textContent = `Hello, ${formatName(user)}`;
document.body.appendChild(heading);
/*---- React with JSX ----*/
import React from "react";
function App() {
const user = {
firstName: "React",
lastName: "JSX Activity"
};
function formatName(user) {
return (user.firstName + " " + user.lastName);
}
return (<h1>Hello, {formatName(user)}!</h1>);
// return React.createElement("h1", null, `Hello, ${formatName(user)}!`);
}
export default App;
React Component의 return값은 하나의 JSX 표현식
-> 여러 요소를 추가하려면 하나의 요소 속에 넣어서 리턴
-> Opening tag 와 Closing tag로 감싼 상태
<div className="wrap">
// element 1
<div>
<h1>hello!</h1>
</div>
// element 2
<div>
<h1>nice to meet you!</h1>
</div>
</div>
cf. 표현식 : 변수에 담길 수 있는 값으로 변환 가능한 묶음
``` jsx
/*---- 변수에 담기지 않음 ----*/
if(isTrue){true;}
/*---- 변수에 담김 ----*/
true
'hello'
(isTrue)? true : false;
```
요소에 클래스명을 추가할 때, className
으로 표기
: class
는 이미 Javascript의 클래스 키워드로 사용되어 클래스로 인식
<div className="userInfo">Mr.smith</div>
JSX에서 Javascript 기본 문법을 사용하려면 { }
중괄호 안에서 사용
function App() {
const user = 'Mr. smith'; // Javascript 표현식
return (<div> Good Morning, {user}! </div>);
}
Component의 이름은 대문자로 시작
function Comment() {/* 컴포넌트 내부 생략*/}
function List() {
return (<Comment />);
}
조건에 따라 렌더링할 때, if문 대신 삼항연산자 사용
-> 표현식으로 변수에 값을 담을 수 있음
(boolean) ? (trueReturn) : (falseReturn);
<div>
{ (1+2 === 3) ? <p>정답입니다.</p> : <p>오답입니다.</p>; }
</div>
여러 개의 html 요소를 반복적으로 표시할 때, map() 사용
: 배열 형태의 데이터를 활용하여 여러 태그 묶음을 추가할 때, map()
로 반복적인 코드를 담은 배열을 새 변수에 할당하여 Component의 return값으로 사용
map()
에서 리턴되는 코드 묶음 중 최상위 태그(하나로 감싸는 태그)Math.random()
을 사용할 경우 불필요한 DOM 노드, 컴포넌트 인스턴스 등을 생산하여 성능저하 발생.const diary = [
{id: 1, title: "6월 1일 일기", contents: "오늘은 ..."},
{id: 2, title: "6월 2일 일기", contents: "오늘은 ..."},
];
function Blog(){
const posts = diary.map((day)=>{
<div key={day.id}>
<h3>{day.title}</h3>
<p>{day.contents}</p>
</div>
});
return (<div className="post-wrapper">{posts}</div>);
const posts = [
{ id: 1, title: "Hello World", content: "Welcome to learning React" },
{ id: 2, title: "Installation", content: "You can install React from npm" }
];
export default function App() {
// 한 포스트의 정보를 담은 객체 post를 매개변수로 받고
// obj를 JSX 표현식으로 바꿔 리턴해주는 함수 postToJSX
const postToJSX = (post) => {
return (
<div key={post.id}>
<h3>{post.title}</h3>
<p>{post.content}</p>
</div>
);
};
return (
<div className="App">
<h1>Hello JSX</h1>
{posts.map(postToJSX)}
</div>
);
}
사용자가 사용하는 독립적인 하나의 기능 구현을 위해 필요한 코드의 묶음(기술적 특징 X)
UI를 구성하는 요소
-> 최소 1개의 component를 조합하여 어플리케이션 완성
-> 복잡한 구조도 작은 단위를 계층적으로 조합하여 구조화
// 기능 : 로딩중일 경우 로딩 메세지, 아니면 일반적이 footer 메세지 렌더링
export default Footer () {
const isLoading = true;
const footerContent = isLoading? "로딩 중..." : "by Codestates";
return (<footer>{footerContent}</footer>);
}
Root component
최소 1개의 컴포넌트로 이루어진 어플리케이션에서 최상위 component를 의미
근원이 되는 Root Component는 자식 compononet를 가져 트리구조로 표현됨
-> 계층적 구조 hierarchy
재사용, 유지보수 용이
: 이미 완성된 컴포넌트들을 독립적인 부품을 조합한 방식이므로 기능을 추가하며 레이아웃 변경이 필요할 때, 새로운 component를 추가하고 기존의 component는 UI에 맞춰 위치만 수정
터미널에서 npm을 활용하여 React로 SPA를 개발하기 위해 필요한 툴, 패키지 등을 한번에 받을 수 있는 툴 체인
cf. SPA : Single Page Application
VScode 터미널에서 프로젝트 디렉토리 위치로 이동
: cd
, mkdir
등으로 파일 생성하여 프로젝트 설치 위치로 이동
Create react app 생성
: 화면에 Happy hacking! 이 찍히면 성공적으로 설치 완료
-> 설치한 디렉토리에 프로젝트 디렉토리 생성됨
npx create-react-app <프로젝트명>
npm run start
진행하면 브라우저에 리엑트앱 실행됨import
: Javascript 파일 내부에서 패키지나 다른 파일 불러올 때 사용import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
ReactDOM.render(element , container, callback)
// container부분에 element 추가하여 렌더링
// element : 리엑트로 개발한 요소
// container : DOM으로 영역 선택
npm run start
로 React 개발 시작
Font Awesome 아이콘 태그의 class
-> className
변경
조건에 따라 클래스명 추가
// 매개변수 tweet
// 더미데이터에 username 속성에는 글쓴이 이름 저장되어있음
const isParkHacker = tweet.username === 'parkhacker';
const usernameClass = (isParkHacker)? 'tweet__username--purple' : 'tweet__username';
// return 코드 묶음 중에서 일부
<span className={usernameClass}>{tweet.username}</span>
라이브러리
다른 프로그램에서도 호출하여 사용할 수 있는 일종의 함수 집합
배열의 각 요소는 각각 변수에 담길 수 있는 하나의 JSX 표현식
const Hello = ()=>{
return (
[<div>안녕하세요</div>, <div>반갑습니다</div>, <div>헬로우</div>]
)
};
const stacks = ['javascript', 'python', 'html', 'react'];
const showStacks = () =>{
return (
<div>
{stacks.map((stack)=>(<p>{stack}</p>))}
</div>
)
};
Chapter1. React Intro
Chapter2. Create React App
npx create-react-app
으로 새로운 리액트 프로젝트를 시작할 수 있다.create-react-app
으로 간단한 개발용 React 앱을 실행할 수 있다.이해도 자가 점검 리스트의 결과를 토대로 자기주도적 학습 계획을 수립하고 실천해 보세요.
오늘 학습이 어려웠다면(0~4개)
오늘 학습이 수월했다면(5~7개)
추가적인 학습을 하고 싶다면(7~8개)
느낀점
요즘 유독 수업 후에 지친다. 쉬는시간 없이 달려서 그런가...
오늘 수업 내용 자체는 별로 어렵지 않았던 것 같은데, 막상 사용하려고하니 익숙치 않다. 리엑트 완전히 처음 듣고 어떻게 사용하는지도 처음 알았는데 엄청 유용한 것 같다. 매번 html,JS 왔다갔다하기 불편했는데 확실히 컴포넌트가 눈에 보여서 가독성이 좋다. 이래서 리엑트가 대세인가보다. 앞으로의 내용은 어려워질테니 못한 정리 주말에 하면서 실습더 해봐야겠다.
개선점 및 리마인드
체력 관리, 에너지 관리
**