在使用<template>
和<slot>
标记定义的自定义组件中,子元素可以获取自定义组件的父元素,然后使用此元素引用访问类定义的变量和函数。
- 但是,子元素如何知道哪个元素是自定义组件?*
模板本身包含在一个影子DOM中。当在页面上呈现一个自定义组件时,这个影子DOM会被克隆并附加到自定义组件中作为其宿主。
然而,插入到自定义组件中的元素似乎无法告诉它所连接的节点树来自克隆的影子DOM节点,并且无法告诉当前DOM树中的哪个元素是顶级自定义组件,除非它迭代每个parentNode
以检查它们是否有shadowRoot
。
让自定义组件内部的子元素访问自定义组件的类变量和函数的方法是什么?
customElements.define("my-comp", class extends HTMLElement {
creationTimestamp;
constructor() {
super();
let template = document.getElementById('my-template');
let templateContent = template.content;
const shadowRoot = this.attachShadow({
mode: 'open'
});
shadowRoot.appendChild(templateContent.cloneNode(true));
this.creationTimestamp = Date.now();
}
})
个字符
2条答案
按热度按时间bz4sfanl1#
有几个非常简单的规则来解耦Web组件:
child.func()
执行操作。这个模式也被标准的web组件使用(
input
,textbox
等)。它也允许简单的测试,因为你不必模仿父组件。这是Polymer library所推荐的模式,它是WebComponents的 Package 器。不幸的是,我找不到描述这种模式的具体文章。
x1c 0d1x的数据
在下面的例子中,父进程监听来自子进程的事件,并调用自身的函数来影响它的状态,或者调用子进程的函数来让它们做一些事情。
的
这是一个干净的方式来确保有明确的,Separation of Concerns。孩子做自己的事情;父母可以指示它做什么,甚至对它的行为做出React。相反,孩子 * 从不 * 指示父母,甚至不知道它。
fcwjkofz2#
我明白了。你想阻止:
第一个月
有多个StackOverflow解决这个问题的答案:
1.让孩子找到父母
控制中:子项
模仿标准的JS
.closest(selector)
,它不会刺穿shadowRoots!使用自定义
closestElement(selector)
函数:自定义元素getRootNode.closest()函数跨越多个(父)shadowDOM边界
1.让父母告诉孩子一些事情
控制中:父级
通过 * 递归潜入 * shadowRoots:
如何获取包含shadowRoot元素的文档或节点中的所有HTML
1.让家长回应孩子的来电
控制中:两者都有子节点发送事件,父节点需要监听
通过自定义事件进行通信的Web组件无法发送数据