1. 시작하기
npm install yarn
yarn create react-app
Bash
복사
•
yarn eject 하면 기본적으로 깔려있는 툴들이 다 보인다.
◦
바벨
◦
웹팩
◦
ESList : 코드 오류 검사
◦
Jest : 테스팅 프레임워크
◦
PostCSS : css 전처리기
•
현업에서는 create react app 잘 안씀
2. 만들기
2.1 클래스 컴포넌트 vs 함수 컴포넌트
•
클래스 컴포넌트
◦
state 로 변수관리
◦
render로 출력 관리
◦
lifecycle 함수들 존재함
◦
종류
▪
React.Component
▪
React.PureComponent
class LikeButton extedns Component {
state = {
numberOfLikes: 0,
};
render() {
return <button> </button>
}
}
JavaScript
복사
•
함수 컴토넌트
◦
원래는 정적인 컴포넌트 만들떄 쓰던것
◦
React Hook으로 클래스 컴포넌트에서 하던거 가능
◦
종류
▪
function
▪
memo(function)
▪
React Hook
function App() {
return <button> </button>
// 정적인 컴포넌트 만들떄 쓰던것
}
JavaScript
복사
2.2 템플릿 프로젝트
•
구조
◦
public : static 한 내용
▪
manifest 삭제
▪
robots.txt 삭제
▪
logo 삭제
▪
index.html 에서 apple~, mani~, 주석 삭제
◦
src : 다이나믹한 내용
▪
serviceWorker.js 삭제 (백그라운드 돌릴떄 쓰는거라는데..?)
▪
test~ 파일 삭제
▪
logo 삭제
▪
App.js → app.js → app.jsx
•
import logo 삭제
▪
index.js
•
serverWorker 관련 코드 삭제
▪
components
•
규칙
◦
컴포넌트는 jsx 확장자로 구분한다.
◦
컴포넌트는 무조건 대문자
2.3 기본원리
•
작동원리
◦
기본 html에 root 딱 하나 있음
◦
index.js 에서 root에 react-dom을 연결함
•
App 컴포넌트를 <React.StrictMode> 로 감싸면 use strict 처럼 사용가능
2.4 JSX 정리
•
자바스크립트에서 바로바로 html을 쓸수있게 만들어둔것
•
html 과 차이점
◦
class="" → className=""
◦
onclick="" → onClick=""
•
엄밀히 말하면 html처럼 생긴 자바스크립트 코드
◦
나중에 바밸이 변환해주는거임
•
html 안에서 자바스크립트 : 중괄호로 묶으면 됨
<h1>Hello {name}</h1>
{ name && <h1>Hello {name}</h1>} //name 이 존재하면 출력
{['a', 'b'].map(item => (
<h1>{item}</h1>
)}
JavaScript
복사
•
여러개 노드 사용 불가 (무조건 한가지 태그로 감싸줘야함)
◦
div로 묶어서 해도 되지만
◦
<React.Fragment> 사용
◦
<> 이렇게만 해도 됨
2.5 클래스 컴포넌트
•
rcc 하면 자동으로 생김
•
app.js 에서 연결
•
변수
◦
초기화 : state = { count : 0 }
◦
참조 : {this.state.count}
◦
대입 : this.setState({ count : this.state.count + 1 })
◦
state 오브젝트를 직접적으로 수정하지 말것!
•
부모에서 넘어온 변수
◦
초기화 : <LikeButton title={'Like'} onClick={this.handleClick} />
◦
참조 : this.props.onClick
•
배열로 컴포넌트 여러개 만들기
◦
map 으로 컴포넌트를 여러개 출력한다.
◦
컴포넌트 별로 고유한 key를 넘겨줘야한다. 예) key={item.id}
◦
최적화를 위해 필요
◦
re-render 할떄 key가 없으면 어떤걸 render 할지 어려움
◦
Date.now() 로 고유한 id 만들수있다.
2.6 Form 만들기 (Refs 이용)
•
form 의 onSubmit은 submit이 되면 실행됨
•
event.preventDefault(); 로 refresh 되는거 방지
•
다른 노드에 접근하기
◦
inputRef = React.createRef(); refs 생성
◦
접근하고자하는 노드에 ref={this.inputRef} 속성 추가
◦
값 참조 : this.inputRef.current.value
2.7 성능
•
StrictMode 하면 render 에 오류가 없는지 두번씩 확인한다. (배포시에는 안함)
•
render 될때 Virtaul Dom 과 실제 Dom을 비교해서 변경된점만 실제 Dom에 적용한다.
•
PureComponent
◦
props 이나 state 가 변경되지 않으면 re-render를 하지 않음
◦
shallow comparsion 즉 레퍼런스만 비교하기때문에 오브젝트가 변경되지 않는이상 render가 일어나지 않는다.
◦
state에서 값을 변경하기 보다는 아예 새로운
2.8 LifeCycle
•
컴포넌트가 생성될떄 ComponentDidMount() 함수 구현시 자동 호출
◦
소켓 초기화 등등
•
컴포넌트가 제거될떄 ConponetWillUnmount() 함수 구현시 자동 호출
2.9 함수 컴포넌트
•
rsi 하면 자동으로 생김
function Habit(props) {
return ;
}
const Habit = props => {
return ;
}
JavaScript
복사
•
this 필요없음
•
클래스 컴포넌트와 동일
•
PureComponent 처럼 쓰는법
◦
props 가 변경되지 않으면 re-render 되지 않는다.
const Habbit = memo(props => {
return ;
})
JavaScript
복사
•
클래스가 아니기 떄문에 props 이나 state가 변경이 되면 전체 코드 블럭이 새로 호출된다.
◦
이렇게되면 하위 컴포넌트의 props의 함수 ref가 계속 변경되기떄문에 하위 컴포넌트들도 re-render 되버릴수있다.
◦
그래서 변수, ref, 함수 모두 리액트 훅으로 감싸서 써야한다.
◦
리액트 훅들도 물론 다시 호출되지만 리액트에서 이전 값을 알아서 기억한다.
2.10 React Hook
•
변수
◦
const [count, setCount] = useState(0)
•
Ref
◦
const spanRef = useRef()
•
함수
◦
const handleAdd = useCallback(() => {})
•
LifeCycle
◦
생성될떄, update 될때마다 호출됨 (props, state 변경시)
◦
두번째 인자로 특정 값이 변경될때만 호출하게끔 할수있음
◦
useEffect(() => {}, [변경시 호출된 변수])
◦
useEffect(() => {}, []) 처음에만 호출됨
배포하기
PossCSS
•
css를 간편하게 쓸수있게 해주는것
•
•
•
•
모듈화
◦
button.module.css
◦
import styles form './button.module.css'
◦
className={styles.button}