JSX(JavaScript Syntax Extension and occasionally referred as JavaScript XML)
const element = <h1>{title}</h1>;
- JSX은 HTML가 아니라 js이므로 camelCase 사용
- React는 별도의 파일에 마크업 & 로직을 넣어 인위적으로 분리 대신
둘다 포함하는 '컴포넌트'라는 단위로 관심사를 분리
- JSX는 주입 공격 방지(렌더링 하기 이전에 문자열로 변환되어 XSS 방지)
- Babel은 JSX를 React.createElement() 호출로 컴파일
DangerouslySetInnerHTML
function createMarkup() {
return {__html: 'First · Second'};
}
function MyComponent() {
return <div dangerouslySetInnerHTML={createMarkup()} />;
}
브라우저 DOM에서 innerHTML을 사용하기 위한 React의 대체 방법
* 사용은 하지만 innerHTML은 위험하다는 내용 상기
Rendered Element
- React Element들은 생성된 이후에 immutable
-> it represents the UI at a certain point in time.
State
- setState() state update는 비동기 처리 (State update May Be Asynchronous - React may batch multiple setState() calls into a single update for performance.)
- state Updates are merged
constructor(props) {
super(props);
this.state = {
posts: [],
comments: []
};
}
예를 들어 위와 같은 코드가 있을때
componentDidMount() {
fetchPosts().then(response => {
this.setState({
posts: response.posts });
});
fetchComments().then(response => {
this.setState({
comments: response.comments });
});
}
위와 같은 코드를 실행하면 상태 변경 merge됨 (The merging is shallow, so this.setState({comments}) leaves this.state.posts intact, but completely replaces this.state.comments.)
- 데이터는 단방향(아래로 흐른다)
Event
- 이벤트는 합성 이벤트
function Form() {
function handleSubmit(e) {
e.preventDefault(); console.log('You clicked submit.');
}
return (
<form onSubmit={handleSubmit}>
<button type="submit">Submit</button>
</form>
);
}
여기서 e는 리엑트 고유의 합성 이벤트(synthetic event)라 cross-browser 호환성을 걱정하지 않아도 된다
제어 컴포넌트 (Controlled Component)
<input>, <select> 등이 있을때 컴포넌트의 상태, props로 주어진 값을 활용하는 컴포넌트
ex) input 태그의 value 값을 useState로 제어)
비제어 컴포넌트
<input> 등이 자체적으로 상태를 갖는 경우 - (useRef등으로 관리)
해당 데이터와 UI의 동기가 이뤄지진 않으니 주의 (해당 상태가 변해도 컴포넌트의 상태가 변한게 아니므로 리렌더링이 일어나지 않는다)
ex) <input type="file"/> 의 경우 File API를 통해 js로 조작 가능한데 값이 읽기 전용이고 사용자만이 값 설정이 가능해서 비제어 컴포넌트
Key
가상돔 갱신할때 휴리스틱한 알고리즘으로 연산 속도를 돕는다
가정 :
- 서로 다른 타입의 두 엘리먼트는 서로 다른 트리를 만들어낸다.
- 개발자가 key prop을 통해, 여러 렌더링 사이에서 어떤 자식 엘리먼트가 변경되지 않아야 할지 표시해 줄 수 있다.
비교대상 - sibling
배열의 index를 key로 사용시 뒤죽박죽 되므로 변하지 않고 예상 가능한 '유일값' 사용
Hook
클래스 컴포넌트에서 함수 컴포넌트로 바꾼 동기 요약
1. 간결하고(simplify) 빠르게
2. 빠르게(performance)
3. 재사용성(Reusing logic & avoid Giant components & Confusing classes)
그외 이유
1. 기존 클래스 컴포넌트에서는 컴포넌트간 로직의 재사용이 힘들었는데
hook을 쓰면 상태 관련 로직을 재사용하기 쉽게 만들어준다.
-> 생명주기 메서드 기반으로 쪼개는것보다 hook을 통해 서로 비슷한 일을 하는 함수 묶음으로 컴포넌트를 나눈다.
2. 클래스 기반은 사람과 기계를 혼동시킨다
자바스크립트의 class와 this는 사람을 혼동시킨다.
-> hook은 class 없이 사용하는 방법을 제시
hook 규칙
react hooks API은 hooks임을 네이밍에서부터 드러내기 위해 use-* prefix를 사용
1. 오직 React 내에서만 hook 호출
2. 최상위에서만 호출
훅은 전역 배열로 관리되고 생성되는 순서에 따라 컴포넌트를 key로 해 인덱스로 관리
-> 항상 최상위에서 호출되야한다 (호출 순서 흐름이 항상 예상 가능해야한다)
function Ex(){
const [a, setA] = useState(0);
const [b, setB] = useState(0);
}
정확한 비유는 아닐 수 있지만.. 위 같은 예시는 내부적으로
[a, setA, b, setB ...];
이런식으로 저장될텐데 if 분기문같은 이유로 인해 hook 호출 순서가 바뀌면 원치 않은 값을 사용할 가능성이 생김
useEffect의 Effect란?
sideEffect 할때 그 Effect!
데이터 가져오기, dom 수동 수정, dom 수정 등 이 모든게 side Effect
리엑트 상태(FSM)와 연관 없는 부분을 side Effect라 부르는듯?
useRef
일종의 자바스크립트 객체값(plain object)를 반환(참조값)하기 때문에
리엑트의 상태 & 렌더링 생명주기와 연관없이 고유의 값을 가진다
(useRef 바뀌어도 리렌더링 되지 않는다)
reference
'Front-end > React' 카테고리의 다른 글
react 17(개인 공부용) (1) | 2022.06.09 |
---|---|
React18(개인 공부 메모용) (0) | 2022.06.09 |
drag and drop으로 창 크기 조절 (0) | 2022.03.18 |
redux, redux-saga로 로딩, 에러 페이지 구현 (0) | 2022.02.12 |
redux 기본 구조 (0) | 2022.02.02 |