目录
Slots 的作用
Slots 的相关特性
Slots 的 name 属性有什么作用?
不给 Slots 传值会怎样?
正常 DOM 中可以使用 Slots 吗?
Slots 是不是必须用在 Templates 中?
一个自定义元素中可以使用多个同名 Slots 吗?
Slots 的传值元素必须是自定义元素的直接子元素吗?
首页 web前端 前端问答 一起聊聊Web Components之Slots(实例详解)

一起聊聊Web Components之Slots(实例详解)

Feb 18, 2022 pm 05:25 PM
web

本篇文章给大家带来了关于Slots的相关知识,Slots 的作用就是给模板元素传值,增强模板元素的灵活性和通用性,希望对大家有帮助。

一起聊聊Web Components之Slots(实例详解)

熟悉 Vue 的同学应该都知道”插槽(slot)“的概念,通过使用插槽可以让页面内容的组织更加灵活。

在 Web Components 体系中也有插槽的概念,今天我们就来具体了解一下 Slots,本文主要包括以下内容:

  • 为什么要用 Slots ?
  • Slots 的相关特性

Slots 的作用

我们首先来看一个模板元素:

<template>
    <p class = "header">MY CARD</p>
    <p class="details">
        My name is 编程三昧。    </p></template>
登录后复制

既然是模板,那就意味着在很多地方都会使用到它,但是,这里会存在一个问题:所有使用这个模板的地方都将显示模板中的内容,即并不是所有人的名字都叫 ”编程三昧“。

在这种情况下,叫其他名字的人是没法使用这个模板的,显然,这就和使用模板的初衷相违背了,这个模板的使用范围太过狭小,不存在通用性。

想要使得这个模板具有通用性,其关键点在于 .details 中显示的内容是否具有通用性。

开动脑筋想一想,我们是不是可以将其中的”编程三昧“设为动态内容,谁使用这个模板,谁就传入自己的名字。恰好, Slots(插槽)就可以实现这种效果,具体如下:

<!--在模板中使用 slot 进行占位--><template id="cardTmp">
    <p class="header">MY CARD</p>
    <p class="details">
        My name is <slot name="userName">编程三昧</slot>。    </p></template><!--在使用上面模板的自定义元素中给 slot 传值--><my-card>
    <span slot="userName">插槽传值</slot></my-card><my-card>
    <span slot="userName">web Components</slot></my-card>
登录后复制

其对应的 JS 代码如下:

class MyCard extends HTMLElement {
    constructor () {
        super();
        const template = document.getElementById('cardTmp');
        const templateContent = template.content;

        this.attachShadow({mode: 'open'}).appendChild(
            templateContent.cloneNode(true)
        );
    }}customElements.define('my-card', MyCard);
登录后复制

实现效果:

image-20220211221138468

通过上面的例子,我们可以用一句话总结 Slots 的作用:Slots 的作用就是给模板元素传值,增强模板元素的灵活性和通用性。

Slots 的相关特性

对于 Slots 的相关特性,我通过问答的形式逐一解释。

Slots 的 name 属性有什么作用?

带有指定 name 的 Slots 被称为 ”具名插槽“,name 是 slot 的唯一标识。

在引入插槽内容的元素上需要使用与 Slots.name 值相同的 slot 属性。看下面的代码:

<template id="cardTmp">
    <p class="header">MY CARD</p>
    <p class="details">
        My name is <slot name="userAge">19</slot>。    </p></template><my-card>
    <span slot="userName">编程三昧</slot></my-card><my-card>
    <span slot="userName">web Components</slot></my-card><script>
    class MyCard extends HTMLElement {
        constructor () {
            super();
            const template = document.getElementById('cardTmp');
            const templateContent = template.content;

            this.attachShadow({mode: 'open'}).appendChild(
                templateContent.cloneNode(true)
            );
        }
    }
    customElements.define('my-card', MyCard);</script>
登录后复制

运行效果:

image-20220211231116878

因为传入的 slot 属性值和 Slots 的 name 属性值对不上,所以 Slots 未被插入。

传值时的 slot 属性值必须和 Slots 的 name 属性值保持一致。

不给 Slots 传值会怎样?

将上面两个自定义元素 my-card 中的 span 元素去掉,不传任何值,即改成这样:

<my-card></my-card>
登录后复制

运行后的效果:

image-20220211222440918

可以看到,如果不给 Slots 传值,那么 Slots 会显示它自己预设的内容

其实结合以上两点,还可以得出一个结论:如果有引用 Slots ,那只有对应 name 的 Slots 内容会被显示,其余的 Slots 皆不显示

正常 DOM 中可以使用 Slots 吗?

这里的”正常 DOM“ 是相对于 Shadow DOM 来说的,指的是页面所在的文档对象。

代码如下:

<slot name="userName">Slots 预设值</slot><p slot="userName">bcsm</p>
登录后复制

显示如下:

image-20220211223746968

总结:正常 DOM 中使用 Slots,它会直接渲染在页面上,切不具备插槽效果

Slots 是不是必须用在 Templates 中?

我们前面看到的例子中,Slots 是在 Templates 中,那是不是意味着 Slots 必须要用在 Templates 中才能生效呢?

因为已经验证过在正常 DOM 中的 Slots 是无效的,所以我们在 Shadow DOM 中做个测试,代码如下:

<body>
    <h1>不在 Templates 中使用 Slots</h1>
    <p id="templ">
        <slot name="userName">这是 Slots 预设值</slot>
    </p>
    <my-paragraph>
        <span slot="userName">编程三昧</span>
    </my-paragraph>
    <script>
        class MyParagraph extends HTMLElement {
            constructor () {
                super();
                const template = document.getElementById('templ');

                this.attachShadow({mode: 'open'}).appendChild(
                    template.cloneNode(true)
                );
            }
        }
        customElements.define('my-paragraph', MyParagraph);
    </script></body>
登录后复制

显示效果如下:

image-20220211225448919

从显示效果上可以看到,将包含 Slots 的正常 DOM 节点在追加到 Shadow DOM 后,Slots 显示传入的值,也就是说 Slots 是生效了的。

总结:Slots 在 Shadow DOM 中就可生效,并非一定要用在 Templates 中

一个自定义元素中可以使用多个同名 Slots 吗?

看代码:

<template id="cardTmp">
    <p class="header">MY CARD</p>
    <p class="details">
        My name is <slot name="userName">编程三昧</slot>。    </p></template><my-card>
    <span slot="userName">插槽传值1</span>
    <span slot="userName">插槽传值2</span></my-card><script>
    class MyCard extends HTMLElement {
        constructor () {
            super();
            const template = document.getElementById('cardTmp');
            const templateContent = template.content;

            this.attachShadow({mode: 'open'}).appendChild(
                templateContent.cloneNode(true)
            );
        }
    }
    customElements.define('my-card', MyCard);</script>
登录后复制

显示效果:

image-20220211232249789

结论:一个 Slots 可以接收多个传入值,且都会解析显示出来

Slots 的传值元素必须是自定义元素的直接子元素吗?

上面的例子中,所有给 Slots 传值的元素都是自定义元素的子元素,那是不是非直接子元素不行呢?

代码如下:

<template id="cardTmp">
    <p class="header">MY CARD</p>
    <p class="details">
        My name is <slot name="userName">编程三昧</slot>。    </p></template><my-card>
    <p>
        <span slot="userName">插槽传值1</span>
    </p></my-card><script>
    class MyCard extends HTMLElement {
        constructor () {
            super();
            const template = document.getElementById('cardTmp');
            const templateContent = template.content;

            this.attachShadow({mode: 'open'}).appendChild(
                templateContent.cloneNode(true)
            );
        }
    }
    customElements.define('my-card', MyCard);</script>
登录后复制

运行效果(传值失效):

image-20220211233044205

结论:给 Slots 传值的元素必须是自定义元素的直接子元素,否则传值失效

更多编程相关知识,请访问:编程视频!!

以上是一起聊聊Web Components之Slots(实例详解)的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何使用python Flask实现日志在web网页实时更新显示 如何使用python Flask实现日志在web网页实时更新显示 May 17, 2023 am 11:07 AM

一、日志输出到文件使用模块:logging可以生成自定义等级日志,可以输出日志到指定路径日志等级:debug(调试日志)=5){clearTimeout(time)//如果连续10次获取的都是空日志清除定时任务}return}if(data.log_type==2){//如果获取到新日志for(i=0;i

Nginx的Web服务器caddy怎么使用 Nginx的Web服务器caddy怎么使用 May 30, 2023 pm 12:19 PM

Caddy简介Caddy是一款功能强大,扩展性高的Web服务器,目前在Github上已有38K Star。Caddy采用Go语言编写,可用于静态资源托管和反向代理。Caddy具有如下主要特性:对比Nginx复杂的配置,其独创的Caddyfile配置非常简单;可以通过其提供的AdminAPI实现动态修改配置;默认支持自动化HTTPS配置,能自动申请HTTPS证书并进行配置;能够扩展到数以万计的站点;可以在任意地方执行,没有额外的依赖;采用Go语言编写,内存安全更有保证。安装首先我们直接在CentO

如何使用Golang实现Web应用程序的表单验证 如何使用Golang实现Web应用程序的表单验证 Jun 24, 2023 am 09:08 AM

表单验证是Web应用程序开发中非常重要的一个环节,它能够在提交表单数据之前对数据进行有效性检查,避免应用程序出现安全漏洞和数据错误。使用Golang可以轻松地实现Web应用程序的表单验证,本文将介绍如何使用Golang来实现Web应用程序的表单验证。一、表单验证的基本要素在介绍如何实现表单验证之前,我们需要知道表单验证的基本要素是什么。表单元素:表单元素是指

Java API 开发中使用 Jetty7 进行 Web 服务器处理 Java API 开发中使用 Jetty7 进行 Web 服务器处理 Jun 18, 2023 am 10:42 AM

JavaAPI开发中使用Jetty7进行Web服务器处理随着互联网的发展,Web服务器已经成为了应用程序开发的核心部分,同时也是许多企业所关注的焦点。为了满足日益增长的业务需求,许多开发人员选择使用Jetty进行Web服务器开发,其灵活性和可扩展性受到了广泛的认可。本文将介绍如何在JavaAPI开发中使用Jetty7进行We

Web 端实时防挡脸弹幕(基于机器学习) Web 端实时防挡脸弹幕(基于机器学习) Jun 10, 2023 pm 01:03 PM

防挡脸弹幕,即大量弹幕飘过,但不会遮挡视频画面中的人物,看起来像是从人物背后飘过去的。机器学习已经火了好几年了,但很多人都不知道浏览器中也能运行这些能力;本文介绍在视频弹幕方面的实践优化过程,文末列举了一些本方案可适用的场景,期望能开启一些脑洞。mediapipeDemo(https://google.github.io/mediapipe/)展示主流防挡脸弹幕实现原理点播up上传视频服务器后台计算提取视频画面中的人像区域,转换成svg存储客户端播放视频的同时,从服务器下载svg与弹幕合成,人像

怎么配置nginx保证frps服务器与web共用80端口 怎么配置nginx保证frps服务器与web共用80端口 Jun 03, 2023 am 08:19 AM

首先你会有个疑惑,frp是什么呢?简单的说frp就是内网穿透工具,配置好客户端以后,可以通过服务器来访问内网。现在我的服务器,已经用nginx做站了,80端口只有一个,那如果frp的服务端也想使用80端口,那应该怎么办呢?经过查询,这个是可以实现的,就是利用nginx的反向代理来实现。补充一下:frps就是服务器端(server),frpc就是客户端(client)。第一步:修改服务器中nginx.conf配置文件在nginx.conf中http{}里添加以下参数,server{listen80

web标准是什么东西 web标准是什么东西 Oct 18, 2023 pm 05:24 PM

Web标准是一组由W3C和其他相关组织制定的规范和指南,它包括HTML、CSS、JavaScript、DOM、Web可访问性和性能优化等方面的标准化,通过遵循这些标准,可以提高页面的兼容性、可访问性、可维护性和性能。Web标准的目标是使Web内容能够在不同的平台、浏览器和设备上一致地展示和交互,提供更好的用户体验和开发效率。

如何从驾驶舱Web用户界面启用管理访问 如何从驾驶舱Web用户界面启用管理访问 Mar 20, 2024 pm 06:56 PM

Cockpit是一个面向Linux服务器的基于Web的图形界面。它主要是为了使新用户/专家用户更容易管理Linux服务器。在本文中,我们将讨论Cockpit访问模式以及如何从CockpitWebUI切换Cockpit的管理访问。内容主题:驾驶舱进入模式查找当前驾驶舱访问模式从CockpitWebUI启用Cockpit的管理访问从CockpitWebUI禁用Cockpit的管理访问结论驾驶舱进入模式驾驶舱有两种访问模式:受限访问:这是驾驶舱的默认访问模式。在这种访问模式下,您不能从驾驶舱Web用户

See all articles