24. 07. 22 TIL
props란?
부모 컴포넌트가 자식 컴포넌트에게 데이터를 전달하는 방법.
단방향으로 부모 -> 자식으로만 흐름
읽기 전용으로, 값을 변경하지 않음
children이란?
props 중 하나인 children은 부모 컴포넌트가 자식 컴포넌트에게 전달하는 또 다른 방법
컴포넌트의 구조는 동일하게 유지하면서 내용을 쉽게 바꿀 수 있어
공통적인 레이아웃을 가지면서 내용만 바꾸고 싶을 때 레이아웃 컴포넌트에서 사용한다.
children은 부모 컴포넌트가 자식 컴포넌트에게 전달할 내용을
자식 컴포넌트에서 원하는 위치에 넣기 위해 사용한다.
자식 컴포넌트는 children을 사용해 부모가 전달할 내용을 특정 위치에 렌더링한다.
state
* 꼭 onChange와 value를 둘 다 연결해야 하는지?
-> 리액트에서 input 요소의 value 속성과 onChange 이벤트를 함께 사용해 입력 필드의 상태를 관리하는 것이 일반적임. 이러한 패턴을 제어 컴포넌트라고 함
(리액트에 의해 값이 제어되는 컴포넌트가 제어 컴포넌트임)
그래서 입력 필드의 값이 항상 리액트 상태와 동기화되고 데이터의 일관성과 정확성을 유지할 수 있다.
불변성
= 값이 한 번 저장되면 변경할 수 없는 성질
불변성이 있는 경우 -> 원시 데이터는 변경 불가. 새로운 값 할당시 새로운 메모리 공간에 저장됨
불변성이 없는 경우 -> 객체, 배열, 함수는 값 변경 가능. 원본 데이터가 직접 변경됨
리액트에서는 상태의 변화를 감지하여 화면을 리렌더링하는데, 상태가 변했는지 확인할 때 메모리 주소를 비교함. 그래서 원본이 변경되면 메모리 주소가 동일하므로 변화 감지 못함.
그래서 리액트에서는 직접 수정하지 않고 새로운 배열을 생성하여 불변성을 유지해야 한다.
import React, { useState } from "react";
function App() {
const [dogs, setDogs] = useState(["말티즈"]);
function onClickHandler() {
setDogs([...dogs, "시고르자브르종"]); // 전개 연산자를 사용하여 새로운 배열 생성
}
console.log(dogs);
return (
<div>
<button onClick={onClickHandler}>버튼</button>
</div>
);
}
export default App;
컴포넌트
= 리액트의 핵심
리액트의 기본 빌딩 블록이며, ui를 표현하는 최소 단위
리액트 이전에는 직접 브라우저의 dom 객체를 조작해 ui를 변경했는데,
리액트는 컴포넌트를 선언하여 ui를 그리므로 더 쉽고 관리하기 편하다.
ex.
1. 명령형 프로그래밍 (DOM 조작)
= ui를 어떻게 그릴지 하나하나 절차를 명령
2. 선언형 프로그래밍 (리액트)
= 어떤 ui를 그릴지 선언하고, 리액트가 알아서 그리는 방식
렌더링
= 컴포넌트가 현재 상태(state)와 속성(props)에 기반하여 ui를 만드는 과정
렌더링 트리거
= 렌더링이 발생하는 경우
1. 앱이 처음 실행될 때
2. 상태나 속성이 변경될 때
3. 부모 컴포넌트가 렌더링 될 때
리렌더링
= 상태나 속성이 변경되어 기존 ui를 업데이트하는 과정
브라우저 렌더링
1. 리액트 렌더링 = 리액트가 컴포넌트를 렌더링하여 DOM을 그리는 과정
2. 브라우저 페인팅 = 브라우저가 업데이트된 DOM을 그리는 과정
리액트와 뷰 같은 프레임 워크는 가상 Dom을 사용해 브라우저에 화면을 그림
1. DOM
= 웹 페이지의 문서를 트리 구조로 표현한 것
엘리먼트
= 페이지를 구성하는 각 컴포넌트
노드
= 트리의 각 요소, html 요소에 접근하고 수정할 수 있는 api 제공
2. 가상 DOM
= 실제 DOM의 복사본이며, 메모리에 객체 형태로 저장됨
실제 DOM을 직접 조작하는 것보다 가상 DOM을 변경하는 것이 훨씬 빠름
리액트 렌더링 과정
1. 가상 DOM 생성 = 컴포넌트의 렌더 함수를 실행해 가상 DOM 생성
2. diffing = 새로운 가상 DOM과 이전 가상DOM 비교
3. reconciliation = 변경된 부분만 실제 DOM에 반영
브라우저 렌더링 (페인팅)
리액트가 실제 DOM을 업데이트 한 후, 브라우저는 다음 과정을 통해 화면에 반영함
1. 스타일 계산
2. 레이아웃
3. 페인팅
* 브라우저의 렌더링과 리액트의 렌더링은 서로 다른 독립적인 프로세스다.