Web Components详解-Shadow DOM插槽

这篇具有很好参考价值的文章主要介绍了Web Components详解-Shadow DOM插槽。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

插槽实际上也属于组件通信的一种方式,但是由于其强大的api和实用性,我将其单独拆开来介绍。

定义

Slot(插槽)是Web Components中一个重要的特性,它允许在组件内部定义占位符,以便父组件可以向其中插入内容。换句话说就是将子组件或者标签传入父组件中,最终达到在父组件外部实现子组件的效果

基本用法

slot属于Shadow DOM的一部分,在原生html中并不支持插槽的写法,所以我们必须将标签放在Shadow DOM中。

插槽标签的写法

<slot name="标签slot属性值"></slot>

需要传入的标签必须在对应的自定义标签中定义

<my-custom-element>
    <div slot="标签slot属性值">标签</div>
</my-custom-element>

完整示例参考下面的代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ShadowDOM</title>
</head>

<body>
    <my-custom-element>
        <header slot="header">header</header>
        <main slot="content">
            <span>content</span>
        </main>
        <footer slot="footer">footer</footer>
    </my-custom-element>
    <div id="slots">
        <slot name="header"></slot>
        <slot name="content"></slot>
        <slot name="footer"></slot>
    </div>

    <script>
        const elemName = "my-custom-element"
        const ele = document.querySelector(elemName)
        const slots = document.querySelector("#slots")
        class MyCustomElement extends HTMLElement {
            constructor() {
                super()
                this.attachShadow({ mode: 'open' });
                this.shadowRoot.appendChild(slots)// 插槽必须在shadowDOM中
            }
        }
        customElements.define(elemName, MyCustomElement)
    </script>
</body>

</html>

具名插槽

具名插槽实际上就是上面的用法,在自定义标签中使用<div slot="标签slot属性值">标签</div>以及在影子DOM中使用<slot name="标签slot属性值"></slot>的形式达到效果

DOM的结构如下

Web Components详解-Shadow DOM插槽,Web Components,JavaScript,面试文档,前端,javascript,html,面试,原力计划

匿名插槽

匿名插槽又叫默认插槽,当有slot标签不设置name属性,并且在自定义标签中存在未设置slot属性的其他标签,即具名插槽的name属性以及slot属性均未设置,此时第一个slot标签就会承载自定义标签中的全部匿名标签,参考下面的代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ShadowDOM</title>
</head>

<body>
    <my-custom-element>
        <header>header</header>
        <main>
            <span>content</span>
        </main>
        <footer>footer</footer>
    </my-custom-element>
    <div id="slots">
        <!-- my-custom-element中的匿名标签都会放在第一个slot标签中 -->
        <slot></slot>
        <slot></slot>
        <slot></slot>
    </div>

    <script>
        const elemName = "my-custom-element"
        const ele = document.querySelector(elemName)
        const slots = document.querySelector("#slots")
        class MyCustomElement extends HTMLElement {
            constructor() {
                super()
                this.attachShadow({ mode: 'open' });
                this.shadowRoot.appendChild(slots)
            }
        }
        customElements.define(elemName, MyCustomElement)
    </script>
</body>

</html>

在页面中的DOM结构如下,三个标签都被放在了第一个slot

Web Components详解-Shadow DOM插槽,Web Components,JavaScript,面试文档,前端,javascript,html,面试,原力计划

后备插槽

当我们使用图片标签图片却加载失败时往往会给图片增加一个alt文字提醒,或使用默认图片。类似的插槽也有这种效果。当我们使用具名插槽并且找不到对应的标签时,可以在slot标签中增加标签以便默认状态展示,比如

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ShadowDOM</title>
</head>

<body>
    <button>显示后备插槽</button>
    <my-custom-element>
        <div id="content" slot="content">具名插槽</div>
    </my-custom-element>
    <div id="slots">
        <slot name="content">
            <div style="color: lightcoral;">后备插槽</div>
        </slot>
    </div>

    <script src="./main.js"></script>
    <script>
        const content = document.querySelector("#content")
        document.querySelector("button").addEventListener("click", () => {
            content.remove()// 当自定义标签my-custom-element中没有标签时,则显示后备插槽标签
        })
    </script>
</body>

</html>

Web Components详解-Shadow DOM插槽,Web Components,JavaScript,面试文档,前端,javascript,html,面试,原力计划 

当我们将自定义标签中对应的插槽删掉时,插槽元素就会显示后备插槽标签

插槽更新

当我们插入,修改,移除插槽时会触发slotchange事件钩子,类似于用于监听DOM更新的MutationObserver,来看看下面的代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ShadowDOM</title>
</head>

<body>
    <my-custom-element-change>
        <div id="content" slot="content">插槽</div>
        <div id="content2" slot="content2">插槽2</div>
    </my-custom-element-change>
    <div id="slots">
        <slot name="content"></slot>
    </div>
    <script src="./main.js"></script>
    <script>
        const slot_box = `<div id="box1">slot</div>`
        const slot_content = slots?.querySelector('[name="content"]')
        slot_content.addEventListener("slotchange", console.log);
        customElements.define('my-custom-element-change', class extends MyCustomElement { });// 初始化触发slotchange
        setTimeout(() => slot_content.name = "content2", 1000)// 替换slot绑定的元素,触发slotchange
        setTimeout(() => slot_content.remove(), 2000)// 删除插槽触发slotchange
    </script>
</body>

</html>

上面的代码主要是一个简单的slotchange回调演示,创建自定义元素后,slot会初始化触发slotchange,1秒后修改slot内容触发slotchange,最后2秒后删除slot再次触发回调

插槽api

  • assignedSlot:它是标签的一个属性,通常在slot的目标标签使用,用于获取目标标签绑定的slot标签
  • assignedNodes:assignedNodes是slot上的函数,使用该方法可以返回所有分配的节点,包括文本节点和元素节点
  • assignedElements:assignedElements是slot上的函数,它会返回分配的元素节点
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ShadowDOM</title>
</head>

<body>
    <my-custom-element>
        text1
        <header slot="header">header</header>
        text2
        <main slot="content">
            content
            <span>content1</span>
            <span>content2</span>
            <span>
                <div>
                    <span>content3</span>
                </div>
            </span>
        </main>
        <footer slot="footer">footer</footer>
    </my-custom-element>
    <div id="slots">
        <slot name="header">header</slot>
        <slot name="content">content</slot>
        <slot name="footer">footer</slot>
    </div>

    <script src="./main.js"></script>
    <script>
        const elems = document.querySelectorAll('[slot]')
        const slotElems = slots.querySelectorAll('[name]')
        elems.forEach(it => console.log(it.assignedSlot))
        slotElems.forEach(slot => {
            const nodes = slot.assignedNodes();
            const elements = slot.assignedElements();
            nodes.forEach(console.log);
            elements.forEach(console.log);
        })
    </script>
</body>

</html>

总结

插槽是Web Components中的一个重要特性,用于在自定义组件内部定义占位符,使得父组件可以向其中插入内容,从而实现了组件之间的高度灵活的通信和组合。通过合理使用具名插槽、匿名插槽以及后备插槽,开发者可以实现高度定制化的组件组合。同时,插槽的事件和 API 提供了对插槽内容的监测和操作,为构建更加动态的用户界面增添了便利性。

以上就是文章全部内容了,如果觉得文章不错的话,还望三连支持一下,感谢!

相关代码

myCode: 基于js的一些小案例或者项目 - Gitee.com

参考文章

Shadow DOM 插槽,组成文章来源地址https://www.toymoban.com/news/detail-727873.html

到了这里,关于Web Components详解-Shadow DOM插槽的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Web Components详解-Custom Elements

    Web Components详解-Custom Elements

    目录 引言 演变过程 概述 使用方式 创建标签 定义标签 使用标签 获取标签 异步定义标签 升级标签 完整案例 结语 相关代码 参考文章 随着项目体量的增大,组件化和模块化的优势也愈发明显了,构建可重复使用、独立、可互操作的组件变得尤为重要,在JS中我们可以通过c

    2024年02月10日
    浏览(9)
  • 一文读懂JavaScript DOM节点操作(JavaScript DOM节点操作详解)

    一文读懂JavaScript DOM节点操作(JavaScript DOM节点操作详解)

    一、什么是节点 DOM模型是树状结构模型,二组成这棵树的就是一个个点,在网络术语中称之为节点。 节点是一个模型中最基本的组成单位。DOM模型是由一个个节点组成的,DOM节点也有其不同的类型。 二、节点类型 DOM节点分为5种类型: 文档节点(就是整个HTML文档,也就是

    2024年01月22日
    浏览(19)
  • js操作shadow-root内的DOM元素

    js操作shadow-root内的DOM元素

    一、背景 项目中在DOM结构里遇到了shadow-root(open),用JS方法无法直接获取其内的DOM元素 二、shadow DOM Web components 的一个重要属性是封装——可以将标记结构、样式和行为隐藏起来,并与页面上的其他代码相隔离,保证不同的部分不会混在一起,可使代码更加干净、整洁。其中

    2024年02月15日
    浏览(10)
  • angular:HtmlElement的子节点有Shadow dom时奇怪的现象

    描述:         这样写时,会自动跳过shadow dom节点的遍历            或者使用cloneElement.childNodes.forEach遍历,也不会遍历到shadow dom节点         如果这样写:                 会在appendChild shadow dom节点报错,提示不是一个HtmlElement,无法append

    2024年02月07日
    浏览(12)
  • JavaScript从入门到精通系列第三十八篇:详解JavaScript中DOM的查询

    JavaScript从入门到精通系列第三十八篇:详解JavaScript中DOM的查询

    😉😉 学习交流群: ✅✅1:这是 孙哥suns 给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群: 583783824   📚📚  工作微信: BigTreeJava 拉你进微信群,免费领取! 🍎🍎4:本文章内容出自上述:Spring应用课程!💞💞

    2024年02月05日
    浏览(14)
  • 前端面试:【浏览器与渲染引擎】Web APIs - DOM、XHR、Fetch、Canvas

    嗨,亲爱的读者!当我们在浏览器中浏览网页时,我们常常会与各种Web API打交道。这些API允许我们与网页内容、服务器资源和图形进行交互。本文将深入探讨一些常见的Web API,包括DOM、XHR、Fetch和Canvas,以帮助你了解它们的用途和如何使用它们。 1. DOM(文档对象模型): 用

    2024年02月11日
    浏览(13)
  • vue3的setup 语法糖中获取slot 插槽的dom对象

    最近使用vue3开发项目,需要封装一个无限滚动的组件,使用scroll组件内置插槽接受模板的方式,所以需要在scroll组件内获取到模板渲染后dom元素的宽高。 但是setup语法糖是组件生命周期的beforeCreate和created中,而且经过测试,在mounted函数中的el属性也是null,所以得出结论模板

    2024年02月15日
    浏览(17)
  • web前端Javascript—7道关于前端的面试题

    本文主要是web前端Javascript—的面试题,附上相关问题以及解决答案,希望对大家web前端Javascript闭包的学习有所帮助。 每个JavaScript 程序员都必须知道闭包是什么。在 JavaScript 面试中,你很可能会被问到的问题 以下是 7 个有关 JavaScript的面试题,比较有挑战性。不要查看答案

    2024年02月03日
    浏览(49)
  • 【面试题】详解JavaScript中的Map()

     前端面试题库 ( 面试必备)              推荐:★★★★★ 地址:前端面试题库 JavaScript是一种动态、解释性的编程语言,用于开发web上的动态页面和交互式应用程序。与其他编程语言相比,JavaScript拥有更加灵活的内置数据类型,并且拥有更高级别的调试和错误处理工

    2024年02月11日
    浏览(15)
  • (前端)你了解shadow吗?—css属性:box-shadow、text-shadow详解

    (前端)你了解shadow吗?—css属性:box-shadow、text-shadow详解

    前言: css中用于设置阴影的属性有三个,分别是:box-shadow(盒子阴影)、text-shadow(文本阴影) 以及filter:drop-shadow,本篇文章着重介绍盒子阴影与文本阴影。 一、box-shadow(盒子阴影) 1、使用方式 参数介绍: h-shadow:水平阴影位移,大于0时阴影右移,小于0时阴影左移; v-shadow:

    2024年01月16日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包