什么是 Web Components

Web Components 提供了基于原生支持的、对视图层的封装能力,可以让单个组件相关的 javaScript、css、html模板运行在以html标签为界限的局部环境中,不会影响到全局,组件间也不会相互影响  再简单来说:就是提供了我们自定义标签的能力,并且提供了标签内完整的生命周期 

Custom elements(自定义元素):JavaScript API,允许定义custom elements及其行为,然后可以在我们的用户界面中按照需要使用它们。

Shadow DOM(影子DOM):JavaScript API,用于将封装的“影子”DOM树附加到元素(与主文档DOM分开呈现)并控制其关联的功能。通过这种方式,开发者可以保持元素的功能私有,这样它们就可以被脚本化和样式化,而不用担心与文档的其他部分发生冲突。

HTML templates(HTML模板):和元素使开发者可以编写与HTML结构类似的组件和样式。然后它们可以作为自定义元素结构的基础被多次重用。

京东的跨端框架 Taro 的组件部分,就是用基于 Web Components 开发的

1.实战案例

class Btn extends HTMLElement {constructor () {//调用super 来建立正确的原型链继承关系super()const p = this.h('p')p.innerText = '小满'p.setAttribute('style','height:200px;width:200px;border:1px solid #ccc;background:yellow')//表示 shadow DOM 子树的根节点。const shaDow = this.attachShadow({mode:"open"})shaDow.appendChild(this.p)}h (el) {return  document.createElement(el)}/*** 生命周期*///当自定义元素第一次被连接到文档 DOM 时被调用。connectedCallback () {console.log('我已经插入了!!!嗷呜')}//当自定义元素与文档 DOM 断开连接时被调用。disconnectedCallback () {console.log('我已经断开了!!!嗷呜')}//当自定义元素被移动到新文档时被调用adoptedCallback () {console.log('我被移动了!!!嗷呜')}//当自定义元素的一个属性被增加、移除或更改时被调用attributeChangedCallback () {console.log('我被改变了!!!嗷呜')}}window.customElements.define('xiao-man',Btn)

2.template 模式

class Btn extends HTMLElement {constructor() {//调用super 来建立正确的原型链继承关系super()const template = this.h('template')template.innerHTML = `<div>小满</div><style>div{height:200px;width:200px;background:blue;}</style>`//表示 shadow DOM 子树的根节点。const shaDow = this.attachShadow({ mode: "open" })shaDow.appendChild(template.content.cloneNode(true))}h(el) {return document.createElement(el)}/*** 生命周期*///当自定义元素第一次被连接到文档 DOM 时被调用。connectedCallback() {console.log('我已经插入了!!!嗷呜')}//当自定义元素与文档 DOM 断开连接时被调用。disconnectedCallback() {console.log('我已经断开了!!!嗷呜')}//当自定义元素被移动到新文档时被调用adoptedCallback() {console.log('我被移动了!!!嗷呜')}//当自定义元素的一个属性被增加、移除或更改时被调用attributeChangedCallback() {console.log('我被改变了!!!嗷呜')}}window.customElements.define('xiao-man', Btn)

使用方式

<!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>web Component</title><script src="./btn.js"></script>
</head>
<body><xiao-man></xiao-man>
</body>
</html>

3.如何在Vue 使用

defineCustomElement

告知vue这是一个自定义Component 跳过组件检查

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

父组件

<template><div><xiaoman-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('xiaoman-btn', Btn)const name = ref({a:1})</script><style scoped lang='less'></style>

子组件

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

传递参数 如果是对象需要序列化 他是作用于 标签上的

小满Vue3第四十五章(Vue3 Web Components)相关推荐

  1. 【正点原子STM32连载】第四十五章 SD卡实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  2. 【正点原子Linux连载】第四十五章 pinctrl和gpio子系统实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  3. 第四十五章 SQL函数 DATEPART

    文章目录 第四十五章 SQL函数 DATEPART 大纲 参数 描述 Datepart 参数 日期输入格式 无效的参数错误代码 范围和值检查 示例 第四十五章 SQL函数 DATEPART 日期/时间 ...

  4. 第四十五章 外键关键字 - SqlName

    文章目录 第四十五章 外键关键字 - SqlName 用法 详解 默认 第四十五章 外键关键字 - SqlName 为外键指定一个SQL别名. 用法 要覆盖此外键的默认SQL名称,请使用以下语法: F ...

  5. 【正点原子STM32连载】 第四十五章 FLASH模拟EEPROM实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

    第四十五章 FLASH模拟EEPROM实验 STM32本身没有自带EEPROM,但是STM32具有IAP(在应用编程)功能,所以我们可以把它的FLASH当成EEPROM来使用.本章,我们将利用STM3 ...

  6. 奋斗吧,程序员——第四十五章 柔情似水,佳期如梦

    我换了张办公桌,之前那张办公桌因为靠墙角,屋顶上有个老鼠洞,有时候大白天的,"刺溜"一下一只老鼠窜了上去,很影响心情. 不知道是不是这样糟糕的风水,造成了黄浩这样的"鼠辈 ...

  7. 光盘显示0字节可用_正点原子【STM32-F407探索者】第四十五章 汉字显示实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 汉字显示在很多单片机系统都需要用到,少则几个字,多则整个 ...

  8. 小满nestjs(第十五章 nestjs 和 RxJs)

    为什么要介绍RxJs 应为 在 Nestjs 已经内置了 RxJs 无需安装 并且Nestjs 也会有一些基于Rxjs提供的API Rxjs 中文文档Observable | RxJS 中文文档 概念 ...

  9. 第四十五章 龙牙现身(老顽童们2 )

    巴哥奔猛地一扬胳膊将对方甩入半空,抢在其再次扑杀过来前,双手疾速互搓,启动赤手模式. 没等她反应过来,那只娇小的龙牙虫噗呲一声钻入老土豆右眼窝,后者仰面栽倒,不再动弹. 那群小土豆们叽喳乱叫,颇感好奇 ...

最新文章

  1. python list.pop 的方法的使用
  2. kibana操作elasticsearch:创建索引库
  3. 13寸笔记本电脑尺寸_2020笔记本电脑推荐(华为篇)
  4. 【vlfeat】O(n)排序算法——计数排序
  5. 开始的一些知识和概念
  6. java工程怎么构造成moven_将普通java工程结构改为由maven管理的工程结构域
  7. 菜鸟涂鸦作品展_No.24
  8. sstv解码_SSTV通联活动:ISS国际空间站2020年1月30日和1月31日
  9. 基本数据类型与引用数据类型
  10. 【Pix4d精品教程】安装Pix4Dmapper时提示“无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-l1-1-0.dll”完全解决办法
  11. 【领域建模】UML类图工具推荐
  12. 编译器优化级别O3引入的bug
  13. iOS使用CNContact对通讯录增删改查
  14. 一篇文章带你发中文核心期刊《计算机科学》
  15. Docker容器——重命名镜像的TAG
  16. 4gl调用WEB API,实现JSON传递(Demo)
  17. 记录一次ncl从前端到后端出图过程:调用linux-shell执行ncl命令从nc文件出图
  18. 自媒体各大平台收益对比_自媒体哪些平台收益比较高?
  19. 独此一次的跨界工作坊众筹:泛产品经理X苏杰X金沙浪
  20. nodejs的 面试大全 容易 难的都有

热门文章

  1. make与sudo make的区别
  2. 【UE4 C++】获取运行时间、设置时间流速、暂停游戏
  3. Springboot学习交流系统 毕业设计-附源码62600
  4. 金融危机 CIO增加预算力求IT安全
  5. 【Python】第二章(条件语句和循环语句)
  6. 计算机系统的存储器分为哪两类,存储器可分为哪两类
  7. postionfixed固定_关于position:fixed的注意点
  8. linux buff cache区别,buffer和cache的区别
  9. 【Vue】模板语法 —— 表达式、插值、指令
  10. 机器人搏击大赛冠军_中国智能机器人格斗大赛落幕 西安大学生包揽仿人体感格斗冠亚军...