【问题标题】:Style web component within shadow dom, depending on its parentshadow dom 中的 web 组件样式,取决于其父级
【发布时间】:2023-03-28 02:40:01
【问题描述】:

我正在开发一个用于上传文件的组件。我制作了两个 Web 组件(wc):

  • wc-uploader 带有选择文件按钮的父级。
  • wc-upload 作为文件添加到wc-uploader 的子代被添加。

如果父级 (wc-uploader) 具有 readonlydisabled 属性,我希望以不同的方式设置 wc-upload 项目的样式。

我认为样式应该在与它相关的wc-upload 组件内。

这是我在wc-upload 模板中尝试过的选择器,但它不起作用。我猜它看不到它的影子根。

wc-uploader[readonly] :host #close {  /* here host = wc-uploader */
    opacity: 0.5;
}

如何根据其父元素设置此元素的样式。 例如。就像如果一个选择项被禁用,那么它的 option 孩子也被禁用。

【问题讨论】:

  • 你真的需要 shadowDOM(s) 吗?
  • @Danny'365CSI'Engelman 是的,因为我在同一个页面上有 3 个这样的上传者,而且要相互隔离的 Javascript 相当多
  • shadowRoots 是边界。然后主机必须做一些事情让孩子知道属性改变了......发出事件(孩子听)或在孩子身上设置属性

标签: css css-selectors web-component


【解决方案1】:

对于松散耦合,所以 何时何地 Web 组件附加并不重要:

让孩子们听:

  this.closest("wc-uploader").addEventListener("close",(evt)=>{
    let parent = evt.detail; //evt.target could do
    if parent.hasAttribute("close") ...
    else ...
  });

然后父级报告它的状态:

attributeChangedCallback(name,oldValue,newValue){
  if(name=="close" || name=="readonly" || name=="disabled"){
    this.dispatchEvent(new CustomEvent(name, {
      bubbles: false, // Event stays at wc-uploader
      detail: this // wc-uploader
    }));
  }
}

如果您的孩子在 shadowRoots 中比较深入,您需要:
Custom Element getRootNode.closest() function crossing multiple (parent) shadowDOM boundaries

或者使用document.作为你的“事件总线”,但是你必须小心你的事件名称。

注意addEventListenerWeb 组件范围之外 附加了一个监听器;所以当组件被移除时不会被垃圾回收;你的任务是在disconnectedCallback中删除它们

【讨论】:

  • 哇,感谢您的深入回答!你真的很了解 Web 组件。我仍然理解它,但它似乎是要走的路。
  • 我在学习 Web 组件方面走上了同样的道路;我从 5 年前开始...
  • 学习 Web 组件的最佳时间是 5 年前,其次是今天 =)
猜你喜欢
  • 2020-03-03
  • 1970-01-01
  • 2020-12-05
  • 1970-01-01
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多