본문 바로가기

Front-End: Web/JavaScript

[코딩애플] js part 3-10. Web Components: 커스텀 HTML 태그 만들기

반응형

Web Components: 커스텀 HTML 태그 만들기

HTML을 쓰다보면 자주 출몰하는 덩어리들이 있다. 이걸 한 단어로 축약하고 싶은 충동이 든다. 이때 커스텀 태그로 치환할 수 있다.

Web Components

  • 자바스크립트 문법으로 구현할 수 있는 **브라우저 기본 기능**

[상식] 웹개발 잘하고 싶으면 브라우저 기능을 잘 알아야한다. 자바스크립트 문법은 도구일 뿐이다.

<커스텀태그>로 길고 복잡한 HTML 축약하는 법

<label><input> 태그를 <custom-input>으로 축약해보자.

<body>
    <custom-input></custom-input> ➡️ 이렇게 쓰면 label과 input이 나옴
    <script>
        class 클래스 extends HTMLElement {
            connectedCallback(){ // 정해진 함수명임
                this.innerHTML = `<label>이메일인풋이에요</label><input>`
            }    
        }

        customElements.define('custom-input', 클래스);
    </script>
</body>
  • **connectedCallback()** : 우리가 만든 태그가 HTML에 장착될 때 실행할 코드 적는 곳. 정해진 함수명임.
  • **this.innerHTML** : 새로 생성될 <custom-input> 요소

HTML 생성하는 다른 방법

this.innerHTML 대신 더 효율적으로 HTML을 생성하는 방법이 있다. 왜냐하면 HTML 생성 속도가 더 월등히 빠르기 때문이다.

let 변수 = document.creatElement('label');
this.appendChild(변수);

<커스텀 태그>의 장점

  1. HTML 중복 제거
  2. 다른 페이지에서 재활용 가능 (함수 문법이라 생각하면 됨)

<커스텀태그> 안에서도 파라미터문법같은거 구현 가능 -> this.getAttribute()

<body>
    <custom-input name="비번"></custom-input>
    
    <script>
    	class 클래스 extends HTMLElement {
            connectedCallback(){
                let name = this.getAttribute('name'); // name의 속성 가져오기
                this.innerHTML = `<label>${name}인풋이에요</label><input>`
            }
        }
        customElements.define('custom-input', 클래스);
    </script>
</body>
  • 각각 다른 내용 생성 가능

attribute 변경감지기능 제공 -> observedAttributes(), attributeChangedCallback()

React, Vue 특징: props(attribute) 변경되면 html이 자동 렌더링됨. 커스텀태그도 자동으로 감지 가능.

React Hooks의 useEffect를 생각하면 될 것 같다.

<body>
    <custom-input name="123"></custom-input> ➡️ 이렇게 쓰면 label과 input이 나옴
    <script>
        class 클래스 extends HTMLElement {
            connectedCallback(){
                this.innerHTML = `<label>이메일인풋이에요</label><input>`;
            }    
            static get observedAttributes()  { // name이라는 attribute 바뀌는지 감지해주세요
                return ['name']
                }
                attributeChangedCallback(){ // 바뀌면 이거 실행해줌
                    console.log(this.getAttribute('name'));
                }
            }
        }

        customElements.define('custom-input', 클래스);
    </script>
</body>
123

attribute 변경할 때마다 뭔가 코드실행도 되네~

만약 attribute 변경될 때마다 html을 재렌더링하고 싶다면?

attributeChangedCallback(){ // 바뀌면 이거 실행해줌
    this.innerHTML = `<label>이메일인풋이에요</label><input>`;
}

attribute 변경할 때마다 html 재렌더링하고 싶은 경우 사용한다. (React, Vue랑 비슷한 재렌더링 기능구현 방법임)

결론

Web COmponents 기능 쓰면 긴 HTML도 함수처럼 재사용 가능.

이런 작업들을 잘하는 라이브러리가 바로 React, Vue다. 걔네가 더 잘하고 더 다양한 기능도 제공한다.

또 Web Components 기능을 더 쉽게 쓸 수 있게 도와주는 라이브러리 Lit, Stencil 등이 있으니 쓰면 된다.

반응형