LoginSignup
0
1

More than 1 year has passed since last update.

Web Componentsを便利にするbenry関数

Last updated at Posted at 2019-06-25

Web Componentsをちょっと便利にするbenry関数の紹介です。

Web Componentsといえば、カスタム要素のクラスを作ることが主な作業になりますが
その一連の定形作業を自動化するのが目的の関数です。

  1. ShadowDOMの自動作成
  2. HTMLの自動挿入
  3. DOMの自動選択
  4. イベントの自動登録

benry関数の機能

HTMLをShadowDOMに登録する

  • this.htmlにHTML文字列かDOM要素をセットしておくと、自動的にShadowDOMに登録します
  • CSSもthis.html内に記述します

DOMの自動選択

  • idを持つタグにはthis.$id名でアクセスできます
  • shadowRootはthis.$shadow、ホスト要素はthis.$hostに予約されてます

イベントの自動登録

  • クラスに$id名_イベント名という名前のメソッドがあると、イベントとして登録されます
  • イベント内のthisは、クラスのthisと同じになります (通常はイベントを登録した要素)

benry関数の使用例

benry関数は、クラスのconstructor()connectedCallback()で使用します。
引数は常にthisを渡して下さい。

使用例
class MyAppElement extends HTMLElement{

    connectedCallback(){
        benry(this) // benry関数の実行。shadowDOMが作成され、HTML・イベントが登録される
        this.$p.textContent += ' Good-By' // id付きタグに簡単アクセス
    }

    $p_click(event){ // 登録したいイベント
        alert(this.$p.textContent) // イベント内でもクラスのthis
    } // イベントの解除は → this.$p.removeEventListener('click', this.$p_click)

    get html(){ // 登録したいHTML・CSS
        return `
        <p id="p">Hello</p>
        <style>#p{color:red;}</style>
        `
    }
}

customElements.define('my-app', MyAppElement) // <my-app></my-app> タグが使えるようになる
  • この使用例が覚えることの全てです。簡単
  • 操作したいタグには、あらかじめidを付けておくのがコツです。

benry関数のソースコード

ソースは関数が1つだけです。ご自由にお使いください

function benry(self){ // https://qiita.com/economist/items/6c923c255f6b4b7bbf84
    self.$host   = self
    self.$shadow = self.attachShadow({mode:'open'})

    if(self.html instanceof Node){
        self.$shadow.append(self.html)
    }
    else{
        self.$shadow.innerHTML = self.html ?? ''
    }

    for(const el of self.$shadow.querySelectorAll('[id]')){
        self[`$${el.id}`] = el
    }

    const methods = Object.getOwnPropertyNames(self.constructor.prototype).filter(v => typeof self[v] === 'function')

    for(const method of methods){
        self[method] = self[method].bind(self)
        const match  = method.match(/^(\$.*?)_([^_]+)$/)
        if(match){
            self[match[1]]?.addEventListener(match[2], self[method])
        }
    }
}

課題

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1