是否可以将自定义属性/属性注入本机 Web 组件?

安德烈亚斯

我正在学习 Web 组件(本机和框架)。是否可以像我在 Vue.js 中所做的那样将属性注入到本机组件中?

这是我的component.js:

const templateComponent = document.createElement('template');
templateComponent.innerHTML = `<div>{{ test }}</div>`;

class MyComponent extends HTMLElement {

    connectedCallback() {
        this._container = this.querySelector("DIV");
    }

}

window.customElements.define("my-component", MyComponent);

这是 index.html:

<!doctype html>
<html lang="en">
<head>
    <title>Document</title>
</head>
<body>

<my-component test="Does this work?"></my-component>


<script src="my-component.js"></script>

</body>
</html>
间隔

是和否。

没有任何内置的模板。但这并不意味着你不能这样做。

function render(el) {
  el.shadowRoot.innerHTML = `<div>${el._test}</div>`;
}

class MyComponent extends HTMLElement {
  static get observedAttributes() {
    return ['test'];
  }

  constructor() {
    super();
    this.attachShadow({mode: 'open'});
  }

  attributeChangedCallback(attrName, oldVal, newVal) {
    if (oldVal !== newVal) {
      this[`_${attrName}`] = newVal;
      render(this);
    }
  }
}

window.customElements.define("my-component", MyComponent);
<my-component test="Does this work?"></my-component>
<my-component test="Yes it does"></my-component>

您用于observedAttributes指示要监视哪些属性的更改。attributeChangedCallback当其中之一发生变化时,您可以将其用作处理程序。

然后由您来获取属性值到 DOM 中。如果 DOM 很简单,你可以像我一样做,每次都重新生成它。

更复杂的事情需要更复杂的算法。

有些人会告诉你使用 LITHtml。我觉得这很烦人。我的大部分组件都非常小,不需要复杂性。

扩展

是的,您可以将回调函数作为字符串传递。换句话说,您将回调函数的名称作为字符串传递,然后在您的组件中调用eval. 我不会推荐它。这样做有很多限制,可以用于邪恶和邪恶的目的。:)

反而:

  • 在组件上提供一个可以设置为回调函数的属性。
  • 在组件上提供一个函数,您将使用回调函数调用该函数
  • 从组件调度事件并让addEventListener我们为您处理。你能提供更多关于你想用这个函数做什么的细节吗

这里有两个有用的问题/答案: *标签中的自定义 Web 组件事件回调函数*我可以将函数作为属性传递给 Web 组件吗?

更新

当设置了多个属性或属性时,有人问到如何避免比需要更频繁地渲染。这通常被称为“去抖动”。

这是一种选择:

let renderTimeout = null;
function render(el) {
  if (renderTimeout) {
    clearTimeout(renderTimeout);
  }

  renderTimeout = setTimeout(() => {
    el.shadowRoot.innerHTML = `<div>${el._test}</div>`;
  }, 0);
}

这将设置一个0时间超时,这意味着它会尽快发生,通常是在当前代码完成运行后。然后渲染操作将发生。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Ember自定义组件的id属性

将自定义属性传递到Aurelia组件

我可以将自定义视图组件注入Vue.js网格组件吗?

将自定义FXML属性设置为自定义javafx组件的参数

香草Web组件自定义事件属性和属性

如何监听自定义事件定义的Web组件

角度组件是否与自定义元素相同(来自Web组件技术)?

如何在vue.js中定位自定义元素(本机Web组件)?

如何创建从vue.js实例到自定义本机Web组件的双向绑定?

角度自定义组件属性设置

角材质组件自定义属性

如何使用Selenium WebDriver单击自定义Web组件

如何将自定义属性传递给功能组件中的样式组件?

使用Web组件而不注册为自定义元素?

Web组件:扩展本机元素

如何用玩笑来测试自定义Web组件?

vue将自定义组件作为属性传递给父组件

您可以定义多少个Web组件/自定义元素是否有限制?

用于自定义Web组件的Visual Studio Intellisense

如何使用Angular自定义Web组件设置顺风

如何在Web组件中捕获自定义事件?

覆盖自定义组件属性

单击标签未聚焦自定义元素(Web组件)

VueJS 通过属性值将自定义属性传递给子组件

使用 Web 组件创建自定义输入

为什么自定义事件比 web 组件中的属性回调更受欢迎?

将变量传递给自定义 Svelte Web 组件

在 connectedCallback 中自定义 Web 组件设置属性

将自定义参数添加到自定义组件“components”属性