原生标签WebComponent

news2024/11/13 14:49:54

文章目录

  • 介绍
  • 一、web Component
  • 二、怎么使用
  • 三、在Vue中使用
  • 使用场景


前端必备工具推荐网站(免费图床、API和ChatAI等实用工具):
http://luckycola.com.cn/


介绍

`
平常浏览各个网站过程中,经常遇到的一种现象:页面广告。
这种广告按照来源可分为两种:

  • 1、站点自己的广告
  • 2、第三方投放的广告

第二种需要在对代理流量的目标站点里,插入开发者想要的元素,并且与此同时要保证插入的代码与原站点之间的影响降至最低。
因此,需要一种有效的**“隔离”**手段。

主流的方案有两种:

  1. iframe方案: frame需要一个明确的src资源链接,而有时候我们似乎没必要再单独为其去发布一个资源;iframe并未实现完全的“隔离”,原有站点还是能拿到iframe节点,并可对其进行DOM操作;
  2. web component方案:Web Components 提供了基于原生支持的、对视图层的封装能力,可以让单个组件相关的 javaScript、css、html模板运行在以html标签为界限的局部环境中,不会影响到全局,组件间也不会相互影响 。 再简单来说:就是提供了我们自定义标签的能力,并且提供了标签内完整的生命周期

一、web Component

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

  • Shadow host:一个常规 DOM 节点,Shadow DOM 会被附加到这个节点上。
  • Shadow tree:Shadow DOM 内部的 DOM 树。
  • Shadow boundary:Shadow DOM 结束的地方,也是常规 DOM 开始的地方。
  • Shadow root: Shadow tree 的根节点。

在这里插入图片描述

二、怎么使用

1、代码如下(示例):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Web Components</title>
</head>
<body>
    <custom-btn></custom-btn>
    <script>
        class MyBtn extends HTMLElement {
            constructor() {
                // 继承父
                super();
                // 标签模式
                let p = this.h('p');
                p.innerHTML = '我只自定义p内容啊';
                p.setAttribute('style', 'height:200px;width:200px;border:1px solid #ccc;background:yellow');
                // template模式
                const template = this.h('template')
                template.innerHTML = `
                    <div>测试</div>
                    <style>
                        div{
                            height:200px;
                            width:200px;
                            background:blue;
                        }
                    </style>`
                // 创建shadowDom
                // mode 属性,值可以是 open 或者 closed,
                // open 表示可以通过页面内的 JavaScript 方法来获取 Shadow DOM,例如使用 Element.shadowRoot 属性:
                // 如果你将一个 Shadow root 附加到一个 Custom element 上,并且将 mode 设置为 closed,那么就不可以从外部获取 Shadow DOM 了——myCustomElem.shadowRoot 将会返回 null。浏览器中的某些内置元素就是如此,例如<video>,包含了不可访问的 Shadow DOM。
                let showDow = this.attachShadow({
                    mode: 'open'
                });
                console.log('showDow:', showDow);
                // 插入标签
                showDow.appendChild(p);
                // 插入模版
                showDow.appendChild(template.content.cloneNode(true));
            };
            h(tag) {
                return document.createElement(tag);
            }
             /**
             * 生命周期
             */
            //当自定义元素第一次被连接到文档 DOM 时被调用。
            connectedCallback () {
                console.log('我已经插入了!!!')
            }
        
            //当自定义元素与文档 DOM 断开连接时被调用。
            disconnectedCallback () {
                console.log('我已经断开了!!!')
            }
        
            //当自定义元素被移动到新文档时被调用
            adoptedCallback () {
                console.log('我被移动了!!!')
            }
            //当自定义元素的一个属性被增加、移除或更改时被调用
            attributeChangedCallback () {
                console.log('我被改变了!!!')
            }
    }
    window.customElements.define('custom-btn', MyBtn)
    
    </script>
</body>
</html>

2、效果展示:
在这里插入图片描述

三、在Vue中使用

1、第一步:defineCustomElement

代码如下(示例):

/*vite config ts 配置*/
vue({
   template:{
     compilerOptions:{
         isCustomElement:(tag)=> tag.includes('xiaoman-')
      }
    }

2、第二步:父组件 中使用

<template>
    <div>
        <custom-btn :title=" JSON.stringify(name) "></xiaoman-btn>
    </div>
</template>
 
<script setup lang='ts'>
import { ref, reactive, defineCustomElement } from 'vue'
//自定义元素模式  要开启这个模式,只需要将你的组件文件以 .ce.vue 结尾即可
import customVueVue from './components/custom-vue.ce.vue'
const Btn = defineCustomElement(customVueVue)
customElements.define('custom-btn', Btn)
 
const name = ref({a:1})
 
</script>
 
<style scoped lang='less'>
 
</style>

3、第二步:子组件 中使用

<template>
    <div>
 
        test123213 {{title}}
    </div>
</template>
 
<script setup lang='ts'>
 
import { ref, reactive } from 'vue'
 
defineProps<{
    title:string
}>()
 
</script>
 
<style scoped lang='less'>
 
</style>

使用场景

插入广告场景、微前端之无界等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1696808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python TinyDB库:轻量级NoSQL数据库的终极指南

更多Python学习内容&#xff1a;ipengtao.com TinyDB是一个轻量级的NoSQL数据库&#xff0c;适用于需要嵌入式数据库的小型项目。它使用JSON文件存储数据&#xff0c;并提供了简单易用的API&#xff0c;支持多种查询和索引操作。TinyDB非常适合那些不需要复杂数据库功能的小型应…

C++Qt操作Lotus Domino数据库 Lotus Domino C++连接Lotus Domino C++快速开发Lotus Domino

java连接domino C#连接domino python连接domino go连接domino,delphi连接domino Excel连接domino Flutter、微信小程序连接domino C 操作 Lotus Domino 数据库&#xff1a;自动化与效率的结合 引言 在企业级应用中&#xff0c;Lotus Domino 提供了一个强大的协作平台&#xff0…

【吊打面试官系列】Java高并发篇 - ThreadLocal 是什么?有什么用?

大家好&#xff0c;我是锋哥。今天分享关于 【ThreadLocal 是什么&#xff1f;有什么用&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; ThreadLocal 是什么&#xff1f;有什么用&#xff1f; ThreadLocal 是一个本地线程副本变量工具类。主要用于将私有线程和该…

2022年CSP-J入门级第一轮初赛真题

一、单项选择题&#xff08;共15题&#xff0c;每题2分&#xff0c;共计30分&#xff1b;每题有且仅有一个正确选项&#xff09; 第 1 题 在内存储器中每个存储单元都被赋予一个唯一的序号&#xff0c;称为&#xff08;&#xff09;。 A. 地址B. 序号C. 下标D. 编号 第 2 题 编…

电脑怎么录屏?电脑录屏的7个方法,仅3%的人知道!

你知道电脑怎么录屏吗&#xff1f;在电脑上录屏是向朋友展示炫酷游戏技巧、制作软件教程视频和展示数字艺术技巧的好方法。遗憾的是&#xff0c;屏幕录制并不像截屏那么简单。然而&#xff0c;无论你是在寻找在电脑上录制屏幕&#xff0c;亦或是录制音频的方法&#xff0c;还是…

C/C++|malloc分配内存详解

看本节前&#xff0c;希望读者有linux内存分布的基本概念&#xff0c;可以阅读这篇文章&#xff1a; 进程虚拟地址空间和函数调用栈 在本节中希望读者可以一口气阅读完所有内容。 本博客内容全部来自小林coding&#xff1a;malloc 是如何分配内存的&#xff1f; 这里仅为笔记记…

基于docxtpl的模板生成Word

docxtpl是一个用于生成Microsoft Word文档的模板引擎库。它结合了docx模块和Jinja2模板引擎&#xff0c;使用户能够使用Microsoft Word模板文件并在其中填充动态数据。这个库提供了一种方便的方式来生成个性化的Word文档&#xff0c;并支持条件语句、循环语句和变量等控制结构&…

Mycat+Mysql搭建数据集群实现数据分片存储

前言 MyCAT介绍 * 一个彻底开源的,面向企业应用开发的“大数据库集群”; * 支持事务、ACID、可以替代MySQL的加强版数据库; * 一个可以视为“MySQL”集群的企业级数据库,用来替代昂贵的Oracle集群; * 一个融合内存缓存技术、Nosql技术、HDFS大数据的新型SQL; * 一个新颖…

天诚公租房/人才公寓WiFi人脸识别物联网智能门锁解决方案

人才是引领城市高质量发展的重要因素&#xff0c;城市要想吸纳人才的保障便是人才公寓。近年来&#xff0c;全国各地一二三线城市都在大力建设人才公寓&#xff0c;集聚菁英人才&#xff0c;倾力打造人才高地。 一、人才公寓如火如荼建设 2023年底&#xff0c;山东德州提出三年…

安装termux遇到的问题-逍遥模拟器

问题一 做一次更新即可解决问题&#xff0c;pkg update 问题二 sshd&#xff1a;no hostkeys available -- exiting. 尝试了网上提供的方法 ssh-keygen -t rsa -f /data/data/com.termux/files/usr/etc/ssh/ssh_host_rsa_key ssh-keygen -t dsa -f /data/data/com.termux/…

iOS swift5 提示信息显示,提示弹框,第三方框架XHToastSwift

文章目录 1.github地址(亲测好用)2.源代码 1.github地址(亲测好用) XHToastSwift - github 2.源代码 XHToast.swift // // XHToast.swift // XHToastSwiftExample // // Created by xiaohui on 16/8/12. // Copyright © 2016年 CoderZhuXH. All rights reserved. …

坦克飞机大战游戏开发:深入解析角色与功能类创建

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、角色创建概览 角色属性与方法的实现 二、公用类与功能性类的封装 公用类的特点与应用…

建设现代智能工业-智能化、数字化、自动化节能减排

建设现代智能工业-智能化节能减排 遵循“一体化”能源管理(Integrated Energy Management)的设计宗旨&#xff0c;集成城市各领域(如工业.交通、建筑等&#xff09;的能源生产和消费信息&#xff0c;面向城市政府、企业、公众三类实体&#xff0c;提供“一体化”的综合能源管理…

河道流量监测解决方案

河道流量监测解决方案 河道流量的远程监测是现代水资源管理与防洪减灾体系中的关键技术环节&#xff0c;它依赖于物联网&#xff08;Internet of Things, IoT&#xff09;技术的深度整合与应用&#xff0c;旨在实现对河流水文动态的实时、准确、高效监测。该解决方案不仅提升了…

嵌入式实时操作系统笔记2:UCOS基础知识_UC/OS-III移植(STM32F4)_编写简单的UC/OS-III任务例程(失败.....)

今日学习嵌入式实时操作系统RTOS&#xff1a;UC/OS-III实时操作系统 本文只是个人学习笔记备忘用&#xff0c;附图、描述等 部分都是对网上资料的整合...... 文章主要研究如何将UC/OS-III 移植到 STM32 F407VET6上&#xff0c;提供测试工程下载 &#xff08;2024.5.21 文章未…

上门服务系统开发|东邻到家系统|上门服务系统开发流程

上门服务小程序的开发流程是一个复杂且精细的过程&#xff0c;涉及到需求分析、设计规划、开发实施、测试验收以及上线运营等多个环节。下面将详细介绍上门服务小程序的开发流程&#xff0c;帮助读者全面了解并掌握其中的关键步骤。 一、需求分析 在开发上门服务小程序之前&am…

北核论文完美复现:自适应t分布与动态边界策略改进的算术优化算法

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 原始算术优化算法 改进点1&#xff1a;引入…

Java进阶学习笔记22——泛型方法、通配符和上下限

泛型方法&#xff1a; package cn.ensource.d11_generics_method;public class Test {public static void main(String[] args) {// 泛型方法String res test("Java");System.out.println(res);Dog dog1 test(new Dog());System.out.println(dog1);}// 泛型方法pub…

python考试成绩管理与分析:从列表到方差

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、考试成绩的输入与列表管理 二、成绩的总分与平均成绩计算 三、成绩方差的计算 四、成…