简单理解slot算法和shadow DOM

简介: 简单理解slot算法和shadow DOM

阅读完这篇博客你会有以下收获:

  • slot算法是什么?
  • shadow DOM是什么?
  • vue slot机制与w3c web component 规范的 shadow DOM渲染结果有何异同?

image.png

slot算法


The slotting algorithm assigns nodes of a shadow tree host into slots of that tree.


Input

HOST -- a shadow tree host

Output

All child nodes of HOST are slotted


  1. Let TREE be HOST's shadow tree
  2. Let DEFAULT be an empty list of nodes
  3. For each child nodeNODEofHOST, in tree order:
  1. Let NAME be NODE's slot name
  2. If NAME is missing, add NODE to DEFAULT
  3. Let SLOT be the slot with slot nameNAME for TREE
  4. If SLOT does not exist, discard node
  5. Otherwise, assign NODE to SLOT
  1. Let DEFAULT-SLOT be the the default slot for TREE
  2. If DEFAULT-SLOT does not exist, stop
  3. Otherwise, assign all nodes in DEFAULT to DEFAULT-SLOT.


When each node is assigned to a slot, this slot is also added to the node's destination insertion points list.


这是w3c web components规范的一个提案,地址位于https://github.com/w3c/webcom...


在这个提案中,我们发现shadow DOM和shadow Tree这两个概念,关于它们的规范,在这里:http://w3c.github.io/webcompo...


mdn上关于shadow DOM的一篇特别好的文章:https://developer.mozilla.org...

Shadow DOM : attach a hidden separated DOM to an element.


几个shadow DOM的专业术语:

  • Shadow host: shadow DOM要连接的普通DOM节点。
  • Shadow tree: shadow DOM里的DOM树。
  • Shadow boundary: Shadow DOM结束的地方,也是普通DOM开始的地方。
  • Shadow root:shadow tree的根节点。


Shadow DOM知识点:

  • shadow DOM和普通DOM一样可以添加子节点设置属性,但是shadow DOM内部的代码不能影响到外部的任何东西。
  • shadow DOM其实一直都在用,例如<video>标签,封装了很多按钮,这就是shadow DOM。
  • 两种模式mode:open,closed。<video>属于包含了shadow DOM的内建标签,它的mode就是closed,外部不能通过shadowRoot获取到这个标签的shadow DOM。open模式更适用。


shadow DOM的作用是什么:增强组件内聚性

An important aspect of web components is encapsulation — being able to keep the markup structure, style, and behavior hidden and separate from other code on the page so that different parts do not clash, and the code can be kept nice and clean.


vue demo:

component.vue -> shadow host

<slot></slot>
<slot name="foo"></slot>
<slot name="bar"></slot>

page.vue -> shadow Tree

<span>+</span>
<span slot="foo">-</span>
<span slot="bar">2</span>
<span slot="bar">3</span>

渲染结果:

image.png

渲染结果与slot算法十分契合,但是较为奇怪的是,vue的slot机制,不会生成像w3c web component 的shadow DOM。


web component shadow DOM是下面这样:


image.png

相关文章
|
1月前
|
JavaScript 前端开发 算法
React技术栈-虚拟DOM和DOM diff算法
这篇文章介绍了React技术栈中的虚拟DOM和DOM diff算法,并通过一个实际案例展示了如何使用React组件和状态管理来实现动态更新UI。
35 2
|
2月前
|
JavaScript 前端开发 算法
react中虚拟dom和diff算法
在React中,虚拟DOM(Virtual DOM)和Diff算法是两个核心概念,它们共同工作以提高应用的性能和效率。
33 4
|
16天前
|
XML JavaScript 前端开发
学习react基础(1)_虚拟dom、diff算法、函数和class创建组件
本文介绍了React的核心概念,包括虚拟DOM、Diff算法以及如何通过函数和类创建React组件。
16 2
|
14天前
|
机器学习/深度学习 JavaScript 算法
面试中的网红虚拟DOM,你知多少呢?深入解读diff算法
该文章深入探讨了虚拟DOM的概念及其diff算法,解释了虚拟DOM如何最小化实际DOM的更新,以此提升web应用的性能,并详细分析了diff算法的实现机制。
|
3月前
|
JavaScript 前端开发
Web Components详解-Shadow DOM样式控制
Web Components详解-Shadow DOM样式控制
81 3
|
3月前
|
JavaScript API 开发者
Web Components详解-Shadow DOM插槽
Web Components详解-Shadow DOM插槽
29 1
|
3月前
|
JavaScript 前端开发 开发者
Web Components详解-Shadow DOM基础
Web Components详解-Shadow DOM基础
103 1
|
3月前
|
移动开发 JavaScript 前端开发
VUE实现一个列表清单【props 父子组件通信、slot插槽的使用、全局自定义指令的封装、$nextTick解决异步DOM更新、巧用v-model简化父子组件之间的通信、触发事件的事件源event】
VUE实现一个列表清单【props 父子组件通信、slot插槽的使用、全局自定义指令的封装、$nextTick解决异步DOM更新、巧用v-model简化父子组件之间的通信、触发事件的事件源event】
35 0
|
5月前
|
JavaScript 前端开发 架构师
Web Components:自定义元素与Shadow DOM的实践
Web Components是用于创建可重用自定义HTML元素的技术集合,包括Custom Elements、Shadow DOM、HTML Templates和Slots。通过Custom Elements定义新元素,利用Shadow DOM封装私有样式,&lt;slot&gt;元素允许插入内容。自定义元素支持事件处理和属性观察,可复用且样式隔离。它们遵循Web标准,兼容各前端框架,注重性能优化,如懒加载和Shadow DOM优化。
50 0
|
5月前
|
JavaScript 前端开发 算法
React中的DOM diff算法是如何工作的
React的DOM diff算法通过对比新旧虚拟DOM树找到最小更新策略,提高组件更新效率。它生成并比较虚拟DOM,按类型、属性和&quot;key&quot;逐节点检查。不同类型节点直接替换,属性不同则更新属性,相同则递归比较子节点。确定DOM操作后批量执行,减少对真实DOM的访问,优化性能。然而,在复杂场景下可能有性能问题,可借助shouldComponentUpdate、memo或PureComponent等进行优化。