【问题标题】:How to overwrite part of <template> element in custom element inheritance?如何在自定义元素继承中覆盖 <template> 元素的一部分?
【发布时间】:2019-08-15 08:39:53
【问题描述】:

我有父自定义元素 BasicSwitcher,它有它的 shadow dom html 模板:

const template_basic_switcher = document.createElement('template');
template_basic_switcher.innerHTML = `
<style>
    @import url("https://use.fontawesome.com/releases/v5.6.3/css/all.css")
</style>

<div id="controls-container">
    <span>ON</span>
    <span>OFF</span>
</div>
`;

现在我有另一个自定义元素 ModeSwitcher,它继承自 BasicSwitcher。它有完全不同的开关。

有没有办法只覆盖模板的controls-container 部分,同时仍然使用其他部分?该元素似乎不支持任何类型的继承。

【问题讨论】:

  • 可以重载定义模板的方法
  • @Supersharp,过载?您实际上是指“覆盖”吗?你能详细说明一下吗?

标签: shadow-dom custom-element html-templates javascript-inheritance


【解决方案1】:

1) 使用默认的 render() 方法为您创建基本自定义元素类。

class BasicSwitcher extends HTMLElement {
    render() {
        this.shadowRoot.innerHTML = baseTemplate      
    }
}  

2) 为继承的 Custum 元素扩展上述类,并重新定义 render() 方法并使用对新模板的引用。

class ModeSwicher extends BasicSwitch () {
    render() {
        this.shadowRoot.innerHTML = otherTemplate      
    }
}  

下面是一个工作的sn-p:

class BasicSwitcher extends HTMLElement {
    constructor() {
        super()
        this.attachShadow( { mode: 'open' } )
        this.render()
    }
    render() {
        this.shadowRoot.innerHTML = BS.innerHTML
    }
}
customElements.define( 'basic-switch', BasicSwitcher ) 

class ModeSwitcher extends BasicSwitcher {
    render() {
        this.shadowRoot.innerHTML = MS.innerHTML
    }
}
customElements.define( 'mode-switch', ModeSwitcher )
<template id=BS>
  <style> :host { display: inline-block ; border: 1px solid gray } </style>
  <span>Basic Switch</span>
</template>

<template id=MS>
  <style> :host { display: inline-block ; border: 1px dotted blue ; color: red } </style>
  <span>Mode Switch</span>
</template>

<basic-switch></basic-switch>

<mode-switch></mode-switch>

【讨论】:

  • 你是一个非常聪明的人!令人印象深刻!
猜你喜欢
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 2011-04-09
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多