1. 엘리먼트(Element)
1) 정의
- Element: 요소, 성분이라는 뜻으로 어떤 물체를 구성하는 성분
- DOM 엘리먼트와 리액트 엘리먼트 비교
DOM 엘리먼트 | 리액트 엘리먼트 |
- 웹 사이트에 대한 모든 정보를 담고 있는 객체인 DOM(Document Object Model)에서 사용하는 용어로 HTML요소를 나타냄 - 실제로 화면에서 볼 수 있는 HTML 요소 - 리액트 엘리먼트에 비해서 많은 정보를 담고 있어서 상대적으로 크고 무거움 |
- 리액트 앱을 구성하는 가장 작은 블록요소 - 화면에 나타나는 내용을 기술한 자바스크립트 객체로 DOM 엘리먼트 형태 - DOM 엘리먼트의 가상표현: 리액트 엘리먼트가 기술한 내용을 토대로 실제 화면에서 보게되는 DOM 엘리먼트가 만들어짐 |
2) 생김새
리액트 엘리먼트는 자바스크립트 객체 형태로 존재함
엘리먼트는 컴포넌트 타입(type)과 속성(props) 및 내부의 모든 자식(children)에 대한 정보를 포함하고 있는 일반적인 자바 스크립트 객체(불변성을 갖는 객체)
React.createElement(
type,
[props],
[...children]
)
// 버튼을 나타내기 위한 엘리먼트로 단순한 자바 스크립트 객체
{
type: 'button', // type에 HTML 태그 이름이 문자열로 들어가는 경우, 엘리먼트는 해당 태그 이름을 가진 DOM Node를 나타냄
props: { // 속성을 나타냄
className: 'bg-green',
children: {
type: 'b',
props: {
children: 'Hello, element!'
}
}
}
}
// 위 엘리먼트가 렌더링이 된다면 아래와 같은 DOM 엘리먼트가 됨
<button class='bg-green'>
<b>
Heelo, elemenet!
</b>
</button>
// 버튼을 나타내기 위한 리액트 컴포넌트 엘리먼트 자바 스크립트 객체
{
type: Button, // type에 HTML 태그 이름이 문자열 또는 리액트 컴포넌트의 이름이 들어감(여기에선 리액트 컴포넌트 이름이 들어감)
props: { // 속성을 나타냄(class, style 등의 attributes보다 좀 더 상위에 있는 개념)
color: 'green',
children: 'Hello, element!' // HTML 태그 하위에 다시 여러개의 HTML 태그가 나오는 경우로 자식 엘리먼트가 됨
}
}
// 리액트 컴포넌트
function Button(props) {
return (
<button className={`bg-${props.color}`}>
<b>
{props.children}
</b>
</button>
)
}
function ConfirmDialog(props) {
return (
<div>
<p>내용을 확인하셨으면 확인 버튼을 눌러주세요.</p>
<Button color='green'>확인</Button>
</div>
)
}
// ConfirmDialog 컴포넌트 엘리먼트
{
type: 'div',
props: {
children: [
{
type: 'p', // HTML 태그인 p태그이기 때문에 곧바로 렌더링 될 수 있는 상태
props: {
children: '내용을 확인하셨으면 확인 버튼을 눌러주세요.'
}
},
{
type: Button, // 리액트 컴포넌트 이름인 Button, 이 경우 리액트는 Button 컴포넌트의 엘리먼트를 생성해서 합침
props: {
color: 'green',
children: '확인'
}
}
]
}
}
// 리액트 컴포넌트 Button 컴포넌트의 엘리먼트를 생성하여 적용한 최종 엘리먼트
{
type: 'div',
props: {
children: [
{
type: 'p', // HTML 태그인 p태그이기 때문에 곧바로 렌더링 될 수 있는 상태
props: {
children: '내용을 확인하셨으면 확인 버튼을 눌러주세요.'
}
},
{
type: 'button', // 리액트 컴포넌트 이름인 Button, 이 경우 리액트는 Button 컴포넌트의 엘리먼트를 생성해서 합침
props: {
color: 'bg-green',
children: {
type: 'b',
props: {
children: '확인'
}
}
}
}
]
}
}
3) 특징
- 불변성(Immutable): 한 번 생성된 엘리먼트는 변하지 않음 -> 엘리먼트 생성 후에는 children이나 attributes를 바꿀 수 없음
=> 화면에 변경된 엘리먼트를 보여주기 위해서는 새로운 엘리먼트를 만들어서 기존 엘리먼트와 바꿔치기 해야 함
2. 렌더링 하기
// root라는 이름을 가진 <div> 태그
<div id="root"></div>
Root DOM node
<div>태그 안에 있는 모든 엘리먼트들이 렌더링됨 -> <div>태그 안에 있는 모든 것들이 리액트 DOM에 의해서 관리되기 때문
오직 리액트만으로 만들어진 모든 웹사이트들은 단 하나의 Root DOM node를 가지게됨
// element를 생성하고 생성된 엘리먼트를 root div에 렌더링하는 코드
const element = <h1> 안녕, 리액트!</h1>;
ReactDOM.render(element, document.getElementById('root')); // render(리액트 엘리먼트, HTML엘리먼트)함수를 사용
=> 리액트 엘리먼트는 리액트의 Virtual DOM에 존재하며 HTML 엘리먼트는 실제 브라우저의 DOM에 존재하는 것
=> 리액트의 엘리먼트가 렌더링 되는 과정은 Virtual DOM에서 실제 DOM으로 이동하는 과정
3. 렌더링된 엘리먼트 업데이트
- 엘리먼트의 특징인 불변성으로 인해 한 번 생성되면 바꿀 수 없기 때문에 업데이트를 위해서는 다시 생성해야함
- 새로운 엘리먼트를 생성하여 기존 엘리먼트와 바꿔치기 하는 것
'Front-end > React' 카테고리의 다른 글
[React] State와 생명주기(LifeCycle) (0) | 2023.05.10 |
---|---|
[React] 컴포넌트(Component) (0) | 2023.05.09 |
[React] JSX(JavaScript and XML) (0) | 2023.05.07 |
[React] 리액트 시작하기 (0) | 2023.05.07 |
[React] 리액트 (0) | 2023.05.04 |