

1.선언형: 한 페이지를 보여주기 위해 HTML/CSS/JS로 나눠서 적지 않고 하나의 파일에 JSX(HTML과 JS가 결합한 문법)를 기반으로 명시적으로 코드를 작성 가능
2.컴포넌트 기반: 하나의 기능 구현을 위해 여러 종류의 코드를 묶어둔 컴포넌트를 기반으로 개발함. 독립적이고 재사용 가능해서 기능 자체에 집중하여 개발할 수 있음
3.범용성:JS가 사용된 프로젝트 어디에든 사용 가능해서 범용적임. Facebook에서 관리되어 안정적, 유명하며, 리액트 네이티브로 모바일 개발도 가능


React 로 엘리먼트 생성하기 예시
import React from "react";
function App() {
const user = {
firstName: "React",
lastName: "JSX Activity"
};
function formatName(user) {
return user.firstName + " " + user.lastName;
}
// JSX 없이 활용한 React
//return React.createElement("h1", null, `Hello, ${formatName(user)}!`);
// JSX 를 활용한 React
return <h1>Hello, {formatName(user)}!</h1>;
}
export default App;
//Hello, React JSX Activity!
암기필요!
2개 이상의 엘리먼트를 작성할때, 최상위에서 opening tag와 closing tag로 감싸주기

HTML class 속성은 class가 아니라 **className**으로 사용

3.JS 변수를 쓰고자 한다면, 중괄호{} 이용 -> 중괄호 사용안할시 일반 텍스트로 인식


5.Element의 조건부 렌더링은 삼항연산자로 작성(if문 X) 삼항연산자는 if문과는 다르게 '표현식'이기 때문에 변수에 할당 가능

6.여러개의 HTML 엘리먼트를 넣으려면 map() 함수 사용 . map() 사용시 반드시 'key' JSX속성을 넣어야함 -> map내부에 있는 첫 엘리먼트줄에 넣기

map() 함수 예시
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>
);
};
// postToJSX 함수를 이용하여 여러 개의 엘리먼트롤 표시
return (
<div className="App">
<h1>Hello JSX</h1>
{posts.map(postToJSX)}
</div>
);
}
//Hello JSX
//Hello World
//Welcome to learning React
//Installation
//You can install React from npm
리액트는 컴포넌트 기반 개발 라이브러리이다. 더 표현하자면 "UI를 구성하는 필수 요소", "리액트의 심장" 이라고 표현할 정도로 중요함
1.컴포넌트: 하나의 기능 구현을 위한 여러 종류의 코드 묶음

2.각자 독립적인 기능을 가지며 UI의 한 부분을 담당하기도 하는 컴포넌트 여러개로 앱을 만듬

3.모든 리액트 앱은 최소 1개의 컴포넌트를 가지고 있으며, 이 컴포넌트는 근원(root)이 되는 역할을 하고 다른 자식 컴포넌트들을 가질 수 있음 ->트리구조를 띔

ex)유튜브로 든 예시
1.아래와 같이 Header엔 컴포넌트인 검색창, 세팅 등이 있고 ContentList에는 동영상인 Content가 있음

2. 트리구조로 보면 독립적인 컴포넌트들을 여러 개 만들고 이들을 한데 모아 복잡한 UI를 구성하고 더 나아가 복잡한 애플리케이션도 만들 수 있음

3.기존의 헤더를 아래와 같이 화면 왼쪽으로 옮겨 사이드바를 만들려면?

→ 리액트를 사용해서 UI에 맞추어 기존 컴포넌트의 위치만 수정하면 되니 보수에 용이함
컴포넌트 기반 개발의 특징
학습목표
Create React App 소개를 보고, Create React App 이 무엇인지 대략적으로 이해할 수 있다.
npx create-react-app 으로 새로운 리액트 프로젝트를 시작할 수 있다.
create-react-app 으로 간단한 개발용 React 앱을 실행할 수 있다.
리액트 랜덤 명언 앱 튜토리얼을 따라 간단한 리액트 랜덤 명언 앱을 만들 수 있다.
Create React App으로 만들어진 리액트 프로젝트 구성을 대략적으로 이해할 수 있다.
create-react-app 를 사용한다면 터미널에서 단 한번의 명령 만으로 자신만의 리액트 프로젝트를 개발할 수 있음리액트 시작하는 방법
1.먼저 폴더를 만들고 mkdir 폴더이름
2.터미널에서 만들고자 하는 폴더에 들어가서 npx create-react-app 폴더이름 입력
3.만들어지면 터미널창에 react, react-dom, react-scripts 등이 보이고 마지막줄에 'Happy Hacking'이란 메시지가 나오면서 생성완료.
4. npm run start로 리액트 서버 열어서 실행 (실제 React Web App을 개발 모드로 브라우저에서 실행할 수 있음)
실제 Twitter와 유사한 Twittler를 React로 개발하는 과제였다.
JSX 기본 문법을 숙지하고, 컴포넌트 기반 개발을 처음으로 시작하는 단계이다.
React가 처음이라 낯설었다..

src/App.js에 import 된 ./static/dummyData.jsimport React from 'react';
import './App.css';
import { dummyTweets } from './static/dummyData';
// ! 위 코드는 수정하지 않습니다.
console.log(dummyTweets) // 개발 단계에서 사용하는 더미 데이터입니다.
import React from 'react';
import './App.css';
import './global-style.css';
import { dummyTweets } from './static/dummyData';
// ! 위 코드는 수정하지 않습니다.
console.log(dummyTweets); // 개발 단계에서 사용하는 더미 데이터입니다.
const Sidebar = () => {
return (
<section className="sidebar">
<i className = "far fa-comment-dots"></i>
</section>
);
};
//javascript 불러오려면 {} 중괄호 표시 해야함
const Counter = () => {
return (
<div className="tweetForm__input">
<div className="tweetForm__inputWrapper">
<div className="tweetForm__count" role="status">
{/* dummyTweet로 전달되는 데이터의 갯수 */}
{'/Total:'+ dummyTweets.length}
</div>
</div>
</div>
);
};
// 시멘틱 엘리먼트 <footer> 문제품
const Footer = () => {
return (
<div>
<img id="logo" src={`${process.env.PUBLIC_URL}/codestates-logo.png`} />
<footer> Copyright @ 2022 Code States</footer>
</div>
);
};
// TODO : Footer 함수 컴포넌트를 작성합니다. 시멘틱 엘리먼트 footer가 포함되어야 합니다.
const Tweets = () => {
return (
<ul className="tweets">
{dummyTweets.map((tweet) => {
const isParkHacker = tweet.username === "parkhacker" ? "tweet__username tweet__username--purple" : "tweet__username";
// username이 "parkhacker"인 경우를 할당한 isParkHacker 변수와
// 변수선언과 할당 동시에 삼항연산자 사용이 가능하다
// ex) 조건값(변수선언과 할당) ? true값 : false값
return (
<li className="tweet" key={tweet.id}>
<div className="tweet__profile">
{/* TODO: 트윗 저자의 프로필 사진이 있어야 합니다. 문제품 */}
<img src = {tweet.picture}></img>
</div>
<div className="tweet__content">
<div className="tweet__userInfo">
{/* TODO : 유져 이름이 있어야 합니다. 문제품*/}
<span className={isParkHacker}>{tweet.username}</span>
{/* TODO : 이름이 "parkhacker"인 경우, 이름 배경색을 rgb(235, 229, 249)으로 바꿔야 합니다. */}
{/* TODO : 트윗 생성 일자가 있어야 합니다. 문제품*/}
<span className="tweet__createdAt">{tweet.createdAt}</span>
</div>
<div className="tweet__message">{tweet.content}</div>
</div>
</li>
);
})}
</ul>
);
};
//<Footer/> 문제 품
const Features = () => {
return (
<section className="features">
<div className="tweetForm__container">
<div className="tweetForm__wrapper">
<div className="tweetForm__profile"></div>
<Counter />
</div>
</div>
<Tweets />
<Footer/>
</section>
);
};
const App = () => {
return (
<div className="App">
<main>
<Sidebar/>
<Features />
</main>
</div>
);
};
// ! 아래 코드는 수정하지 않습니다.
export { App, Sidebar, Counter, Tweets, Features, Footer };