fetching
하고생성 + 데이터 대치
하고부모 요소를 호출
해서 innerHTML
로 자식 요소를 DOM에 추가프레임워크/라이브러리
사용하기로 했다.
React Component를 사용하여 코드 재사용성
이 개선되었으나,
간단한 페이지가 라이브러리에 의해 무거워지는 단점 발생했다.
실무에서 PHP CodeIgnitor 환경에서 작업을 했는데,
코드이그나이터에 리액트 환경을 조성하는게 너무 어려워서 포기했었다.
위의 단점은 브라우저의 기능
을 사용하여 해결할 수 있다.
웹 컴포넌트(Web Component)는
캡슐화
, 웹에 대한 사용자 인터페이스 단위의재사용
에 대해 표준화 된 결과물이다.
4개의 표준을 묶어 웹 컴포넌트라 한다.
Web Component
는 HTML5가 제공하는 요소 외에 여러 기능을 지원하는 요소가 필요하기 때문에 Web Component가 등장
<p>{현재 시간}<p>
<current-time>{현재 시간}</current-time>
<template>
와 <slot>
엘레먼트를 사용하여 재사용 가능한 HTML 마크업 템플릿 작성 가능모든 브라우저의 옛 버전에선 동작하지 않는다.
개발자가 직접 정의하여 Element를 사용할 수 있도록 제공되는 기능
캡슐화
Life Cycle
을 조작케밥 표기법(-)
를 사용<html>
<body>
<!-- NOTE: 적용 전 -->
<div class="card" data-name="asset0">
<img class="card-front" src="../img/asset0.svg" alt="카드 앞면" />
<img class="card-back" src="../img/question.svg" alt="카드 뒷면" />
</div>
<!-- NOTE: 적용 후 -->
<game-card></game-card>
</body>
</html>
export class GameCard extends HTMLElement {
// NOTE: 내부 상태(state), 내부에서만 관리한다
#isDisabled = false;
// NOTE: DOM에 추가될 때 렌더링 처리, 초기 동작 설졍
connectedCallback() {
...
}
// NOTE: DOM에서 제거될 때
disconnectedCallback() {
...
}
// NOTE: 속성이 추가/제거/변경될 때
attributeChangedCallback(attrName, oldVal, newVal) {
this[attrName] = newVal;
}
// NOTE: 내부 상태를 보여주는 getter 함수
// NOTE: 이런 구조를 사용하는 이유는 isDisabled(내부 상태)가 사용하는 곳들에서 값을 일괄적으로 바뀌게(한번에 통제할 수 있개) 만들기 위함이다.
get isDisabled() {
return this.#isDisabled;
}
// NOTE: 메소드
flip() {
...
}
// NOTE: 내부 상태를 변경하는 함수
disable() {
this.#isDisabled = true;
}
}
// NOTE: 정의
customElements.define('game-card', GameCard);
HTML과 CSS의 스코프를 독립적으로 다룰 수 있게끔 지원하는 개념 및 기능
<div id="spin-nav"></div>
// NOTE: <p>는 Shadow DOM이 된다.
// NOTE: document.querySelector("#spin-nav")는 shadow host가 된다.
document.querySelector("#spin-nav").attachShadow({ mode: "open" }).innerHTML = `
<p>
<slot name="nav1">캠페인 관리</slot>
</p>
<p>
<slot name="nav2">마이 페이지</slot>
</p>
`;
엘레먼트들을 재사용하고 모듈화 시키기 위해 사용하는 개념 및 기술
<template>
과 <slot>
으로 렌더링되지 않는 마크업 템플릿 작성<section class="main-container">
<!-- Template Element Area -->
</section>
<template id="list-container">
<ul class="items">
<li class=item>
<!-- value -->
</li>
</ul>
</template>
<script>
const $mainContainer = document.querySelector('.main-container');
const $template = document.getElementById('list-container');
const $clone = $template.importNode($template.content, true);
const $li = $clone.querySelector('.item');
$li.textContent = 'Hello Template Element';
$mainContainer.appendChild($clone);
</script>