小满Vue3第四十五章(Vue3 Web Components)
什么是 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)相关推荐
- 【正点原子STM32连载】第四十五章 SD卡实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...
- 【正点原子Linux连载】第四十五章 pinctrl和gpio子系统实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
- 第四十五章 SQL函数 DATEPART
文章目录 第四十五章 SQL函数 DATEPART 大纲 参数 描述 Datepart 参数 日期输入格式 无效的参数错误代码 范围和值检查 示例 第四十五章 SQL函数 DATEPART 日期/时间 ...
- 第四十五章 外键关键字 - SqlName
文章目录 第四十五章 外键关键字 - SqlName 用法 详解 默认 第四十五章 外键关键字 - SqlName 为外键指定一个SQL别名. 用法 要覆盖此外键的默认SQL名称,请使用以下语法: F ...
- 【正点原子STM32连载】 第四十五章 FLASH模拟EEPROM实验 摘自【正点原子】STM32F103 战舰开发指南V1.2
第四十五章 FLASH模拟EEPROM实验 STM32本身没有自带EEPROM,但是STM32具有IAP(在应用编程)功能,所以我们可以把它的FLASH当成EEPROM来使用.本章,我们将利用STM3 ...
- 奋斗吧,程序员——第四十五章 柔情似水,佳期如梦
我换了张办公桌,之前那张办公桌因为靠墙角,屋顶上有个老鼠洞,有时候大白天的,"刺溜"一下一只老鼠窜了上去,很影响心情. 不知道是不是这样糟糕的风水,造成了黄浩这样的"鼠辈 ...
- 光盘显示0字节可用_正点原子【STM32-F407探索者】第四十五章 汉字显示实验
1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 汉字显示在很多单片机系统都需要用到,少则几个字,多则整个 ...
- 小满nestjs(第十五章 nestjs 和 RxJs)
为什么要介绍RxJs 应为 在 Nestjs 已经内置了 RxJs 无需安装 并且Nestjs 也会有一些基于Rxjs提供的API Rxjs 中文文档Observable | RxJS 中文文档 概念 ...
- 第四十五章 龙牙现身(老顽童们2 )
巴哥奔猛地一扬胳膊将对方甩入半空,抢在其再次扑杀过来前,双手疾速互搓,启动赤手模式. 没等她反应过来,那只娇小的龙牙虫噗呲一声钻入老土豆右眼窝,后者仰面栽倒,不再动弹. 那群小土豆们叽喳乱叫,颇感好奇 ...
最新文章
- Redis 难题突破,最经典 46 题含详细解析
- 快速深入一门语言的几个问题 - Shell909090 - 随笔杂记
- 百年难得一见!阿里园区惊现双月争辉奇观!
- linux脚本监控网卡流量,Shell脚本实现linux监控网卡实时流量[带宽]的方法
- react native ScrollView
- 敏感词过滤算法:前缀树算法
- canvas绘制图形的相关API
- 关于AD域和Exchange邮件服务器的学习总结
- HARK学习(三)--文件格式
- win7卸载Ubuntu重新安装ubuntu18.04
- cpu、socket、core、thread 等术语之间的关系
- 【Bison学习笔记】1:生成简易的语法分析程序,使Bsion和Flex协同工作
- 数据结构与算法笔记:计算思维之经典农夫过河问题C++实现
- spring mvc Discus
- w7家庭版计算机策略,gpedit.msc win7家庭版
- 4511或74LS48来实现BCD转7段数码管及逻辑状态输入演示
- 身为iOS开发,你是愿意在大公司做凤尾,还是在小公司做鸡头?
- LeetCode题解(0930):和相同的二元子数组(Python)
- 罗技无线手柄F710绑定映射为/dev/joystick
- oracle中的left函数,Oracle Left Join