私はWebコンポーネント(ネイティブ、ポリマーなし)に関するいくつかのチュートリアルを読んでいます。コンポーネントを登録する2つの方法を見てきましたが、何を使用すればよいか少し混乱しています。 2つ目は、vscodeでTypeScriptエラーを実際に受け取ります:[ts] Property 'registerElement' does not exist on type 'Document'. Did you mean 'createElement'?
/**
* App
*/
export class App extends HTMLElement {
constructor() {
super();
}
connectedCallback() {
this.innerHTML = this.template;
}
get template() {
return `
<div>This is a div</div>
`;
}
}
// What is the difference between these two methods?
window.customElements.define('vs-app', App);
document.registerElement('vs-app', App);
結果に関しては、彼らはほとんど同じことを達成します。ただし、 Document.registerElement()
は非推奨であるため、代わりに CustomElementRegistry.define()
を使用する必要があります。
私の目には、主な違いは、.registerElement()
が新しい要素のコンストラクターを返すのに対し、.define()
を使用するとコンストラクターを指定できるため、汎用性が向上することです。次の例を検討してください。
_var MyElement = document.registerElement('me-me');
document.body.appendChild(new MyElement());
var myElement = document.getElementsByTagName('me-me')[0];
myElement.textContent = 'I am a custom element.';
_
_class MyElement extends HTMLElement {
connectedCallback() {
this.textContent = 'I am a custom element.';
}
}
customElements.define('me-me', MyElement);
document.body.appendChild(new MyElement());
_
ご覧のとおり、.define()
を使用すると、事前に内部テキストを指定できますが、.registerElement()
の場合は手動でテキストを指定する必要があります。これが私のポイントを示す非常に単純な例である場合、.define()
を使用すると、.registerElement()
を使用する場合よりも、カスタム要素のデフォルトの動作、外観、およびコンテンツに多くを追加できます。 。