프로젝트를 앞두고 React의 개념을 전반적으로 정리해보려 한다.
Angular
Vue
React : 생태계가 활성화 되어있고, React Native(앱개발)의 사용으로 인해 사용자가 꾸준히 증가하기 때문에 React를 배우고자 한다.
: React는 선언적이다.
이전 UI 상태를 메모리에 유지해서, 변경될 UI의 최소 집합을 계산하는 기술
즉, DOM은 트리구조로 이루어져있는데, 바뀌는 부분만 찾아서 바꿔주는 기술
➡️ 불필요한 UI 업데이트는 줄고 성능이 좋아진다.
npx create-react-app westagram-react
node-modules
, package.json
,.gitignore
package.json
의 "dependencies"에 필요한 pakage들을 넣어두면 .gitignore
에 해당 pakage가 들어 있어도 master에서 git clone을 할 때도 다른 팀원에게 적용된다 !index.html
, index.js
, <Routes />
<Routes />
라는 컴포넌트를 index.js
으로 import하여 index.html에 render 되도록 구조를 설정해준다.public
폴더src
폴더reset.scss
, common.scss
기본 셋팅 !재사용 가능한 UI 구성 단위
class 형
함수형
✏️ 추가로, Component의 Lifecycle
: constructor
→ render
→ componentDidMount
→ ( setState
) → render
Create React App(CRA)에 특별히 routing을 위한 로직이 없다. (UI를 담당하기 때문에)
npm install react-router-dom --save
후 사용하면 된다.
Routing을 위해 필요한 요소
✔️ <Router />
: 라우팅 기능을 위해서 감싸주는 컴포넌트
✔️ <Switch />
: 경로에 따라 어떤 컴포넌트가 보여지게 되는지 지정
✔️ <Route />
: 실제 경로와 실제 보여주는 컴포넌트 지정
➡️ 이를 사용하기 위해서는 Routes.js
에
import { BrowserRouter as Router, Switch, Route } from 'react-router-dom';
를 해주어야 사용가능하다.
<Link>
컴포넌트 사용하는 방법 - <Link to="/signup">회원가입</Link>
withRouterHOC
로 구현하는 방법 - this.props.history.push('/signup')
<Link>
vs. withRouterHOC
➡️ <Link>
: 클릭 시 바로 이동하는 로직 구현 시에 사용한다.
ex. Nav Bar, Aside Menu, 아이템 리스트 페이지에서 아이템 클릭 시 > 상세 페이지로 이동
➡️ withRouterHOC
: 페이지 전환 시 추가로 처리해야 하는 로직이 있는 경우 사용한다.
ex. 로그인 버튼 클릭 시
- Backend API로 데이터(User Info) 전송
- User Data 인증 / 인가
- response message
- Case 1 : 회원 가입되어 있는 사용자 > Main 페이지로 이동
- Case 2 : 회원 가입이 되어 있지 않은 사용자 > Signup 페이지로 이동
withRouterHOC
code - example
import React from 'react';
import { withRouter } from 'react-router-dom';
class Login extends React.Component {
goToMain = () => {
if(response.message === "valid user"){
this.props.history.push('/main');
} else {
alert("회원가입을 해주세요")
this.props.history.push('/signup');
}
}
render() {
return (
<div>
<button
className="loginBtn"
onClick={this.goToMain}
>
로그인
</button>
</div>
)
}
}
export default withRouter(Login);
<Link>
vs. <a>
<a>
- 외부 사이트로 이동하는 경우 : 완전히 전환될 때 사용함. 내부이동 때는 사용하지 않지만, 완전히 외부로 이동할 때 사용함.<Link>
- 프로젝트 내에서 페이지 전환하는 경우 : a로 컴파일 되지 만 새롭게 파일을 받아오는 요청을 하지 않음. 경로만 바꿔줌. 필요 없는 부분 렌더링 하지 않음.: 이 부분은 작성한 코드를 리팩토링, 리뷰하면서 채워나가기 🙌🏻
- 컴포넌트 내부에서 가지고 있는 컴포넌트의 상태값
- state: 화면에 보여줄 컴포넌트의 정보(상태를 가지고 있는 객체)
- 컴포넌트의 속성값 (Property)
- 부모 컴포넌트로부터 전달 받은 데이터를 가지고 있는 객체
- 실제 API(Application Programming Interface)에서 받아온 데이터가 아닌 프론트앤드 개발자가 필요에 의해 샘플로 만들어본 데이터
data.js
public
폴더 > data
폴더 > data.json
(fetch의 형태로 받아오기 때문에 추후 통신을 위해서라면 이 방법을 사용하는게 더 낫다고 생각한다.🔑)