프론트엔드 개발을 위한 자바스크립트 오픈소스 라이브러리이다.
선언형
: 하나의 파일에 명시적으로 작성할 수 있게 JSX를 활용한 선언형 프로그래밍을 지향한다. 무엇에 집중하여 프로그래밍 하는 것이다.
=> 코드를 자세히 분석하지 않고도 실제 기능을 상상할 수 있는 것.
<=> 명령형(절차형) 프로그래밍은 '어떻게'에 집중하여 프로그래밍 하는 것이다.
컴포넌트 기반
: 독립적으로 나뉘어진 코드 조각들로 UI를 구성한다.
범용성
: 어느 자바스크립트 환경이든 유연하게 사용 가능하고, 리액트 네이티브로 모바일 앱 개발도 할 수 있다.
JavaScript XML의 줄임말로 이 문법을 활용해서 UI를 구성하는 React 엘리먼트를 만들 수 있다. JavaScript 문법과 HTML 문법을 동시에 이용해 기능과 구조를 한눈에 확인할 수 있다.
// JSX 없이 활용한 React
return React.createElement("h1", null, `Hello, ${formatName(user)}!`);
// JSX 를 활용한 React
return <h1>Hello, {formatName(user)}!</h1>;
}
map() 메소드
를 사용한다.Warning : Each child in a list should have a unique "key" prop.
function Blog() {
const blogs = posts.map((post) => (
<div key={post.id}>
<h3>{post.title}</h3>
<p>{post.content}</p>
</div>
));
return <div className="post-wrapper">{blogs}</div>;
}
이 메소드는 새로운 배열을 반환할텐데, 이게 어떻게 작동하지? 생각했는데 한 번 실험을 해보니 배열과 쉼표를 그냥 무시하고 렌더링이 되는 것 같다.
직접 모든 데이터를 코드에 작성하는 것을 하드코딩(hard coding)이라고 부른다.
컴포넌트는 "하나의 기능 구현을 위한 여러 종류의 코드 묶음이다." 혹은 "UI를 구성하는 필수 요소이다."
<App>
이 대표적이다.HTML으로 구조를 만들고 CSS로 스타일을 더하고 JS로 DOM을 조작하여 페이지를 인터렉티브하게 만들어줬었다. 하지만 조금 아쉬운 점이 있다. 유튜브에서 헤더 부분을 왼쪽으로 옮기고 싶다면?
html 구조를 바꾸고 > CSS를 수정하고 > 변경된 구조와 디자인에 맞춰 DOM 조작 로직을 수정해야 한다.
하지만 리액트를 이용한 컴포턴트 기반 개발을 한다면? 변경하려는 UI에 맞춰 컴포턴트의 위치만 수정하면 된다. App에서 컴포넌트 불러오는 위치에 따라 구조가 쉽게 바뀐다는 거 정말 너무 신기했다!
=> 컴포넌트를 먼저 완성시키고, 레이아웃에 따라 유동적으로 컴포넌트의 위치를 변경할 수 있는 상향식 개발 (Bottom-up) 방식에 적합하다.
페이지를 만들기 이전에 어떤 컴포넌트를 만들고 이들을 조합할지부터 구상한다.
와이어 프레임
: 디자인에 들어가기 전 단계로 선을 이용해 윤곽선을 잡는 것목업
: 데스크톱, 스마트폰 프레임을 덧씌워 직관적으로 이해하기 쉽게 디자인 한 것 SPA는 서버로부터 완전히 새로운 페이지를 불러오는 것이 아니라,
화면을 업데이트하기 위해 필요한 데이터만 서버에서 전달받아 브라우저에서 해당하는 부분만 업데이트하는 방식이다.
장점
단점
SPA를 쉽고 빠르게 개발할 수 있도록 만들어진 툴 체인이다.
const proverbs = ["오늘을 살자", "미래를 두려워하지 말자", "넘어질 때 배운다", "반복하는 일을 잘하게 된다", "세상엔 중요한 것도 무가치한 것도 없다"];
let getRandomIdx = (length) => {
return parseInt(Math.random() * length)}
//...
{proverbs[getRandomIdx(proverbs.length)]}
o<= x < 1 사이의 난수
다른 주소에 따라 다른 뷰를 보여주는 과정을 "경로에 따라 변경한다."라는 의미로 라우팅(Routing) 이라고 한다. React SPA에서는 라우팅을 위해 React Router 라는 라이브러리를 가장 많이 사용한다.
React Router의 주요 컴포넌트
0.
- npx create-react-app <프로젝트명>
cd <프로젝트명>
npm start
- npm install
- npm install react-router-dom@5.3.0
1. index.html 파일
- id 값 root를 가지는 div 태그가 있다.
2. index.js 파일
- App 컴포넌트를 불러온다.
- ReactDOM.render(<App />, document.getElementById('root'));
=> 무슨 뜻이냐면? html 엘리먼트에 접근을 해서 우리가 리액트 개발을 한 부분 App을 여기 넣어주겠다.
3. App.js 파일
- Sidebar, Tweets, MyPage, About 컴포넌트를 불러온다.
- react-router-dom 라이브러리에서 BrowserRouter, Route, Switch 컴포넌트를 불러온다.
1. <BrowserRouter>로 리턴하는 태그들 전체를 감싸서 SPA를 위한 환경설정을 세팅한다.
2. 각각의 컴포넌트를 main 태그 안에 넣는다.
3. 주소값에 따라 다른 페이지뷰를 넣어줄 공간을 <Switch> 컴포넌트로 감싼다.
4. <Route> 컴포넌트에 path 속성을 넣고 주소값을 지정한다. <Route> 컴포넌트 안에 해당 주소값에서 보여줄 컴포넌트를 불러온다.
4. Footer.js 파일
- 모든 페이지마다 공통적으로 가지고 있는 컴포넌트이다.
5. Sidebar.js 파일
- react-router-dom 라이브러리에서 Link 컴포넌트를 불러온다.
1. 아이콘을 누르면 연결되는 주소값을 Link 컴포넌트에 to 속성을 이용해 넣는다.
2. 아이콘을 누르면 주소창의 주소값이 to에 넣어준대로 바뀌는 것을 확인할 수 있다.
6. Tweets.js 파일
- map 메소드를 활용해서 dummyTweets 라는 배열의 요소 하나 하나(여기에선 객체)를 가져와서 다른 값으로 지정해준다.
- 댓글 하나 하나를 li로 해주는 것.
Q. id와 key 값이 동일해도 상관이 없는건가?
7. MyPage.js 파일
- filter 메소드를 활용해서 dummyTweets 라는 배열의 요소 하나 하나(여기에선 객체)를 가져와서 원하는 조건을 만족하는 값들만 남긴다.
8. About.js 파일
6-8번 파일에는 모두 Footer 컴포넌트를 불러오고 있다.
let langs = ["JavaScript", "HTML", "Python"];
return (
<div>
{langs.map((it) => {
return <p>{it}</p>;
})}
</div>
);
D.
let langs = ["JavaScript", "HTML", "Python"];
return (
<div>
{langs.map((it) => (
<p>{it}</p>
))}
</div>
);
콜백함수의 리턴.. 리턴의 리턴.. 리턴 리턴의 반복... tweet 안에는 배열의 요소인 객체 하나 하나를 의미하는 거다. 배열의 각 요소에 적용이 되는 콜백함수.
Q. jsx에서는 if문을 쓰면 안 되고 삼항 연산자를 사용해야 한다. 근데 else if처럼 조건이 여러개라면 어떻게 해야 하나?
Q. 원래 맨 처음에는 npm install 에 직접 --save-dev 이런 거 해서 깔아줬었는데.. 그냥 npm install만 해도 되는 건가? 이제?