• 小满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.实战案例

    1. class Btn extends HTMLElement {
    2. constructor () {
    3. //调用super 来建立正确的原型链继承关系
    4. super()
    5. const p = this.h('p')
    6. p.innerText = '小满'
    7. p.setAttribute('style','height:200px;width:200px;border:1px solid #ccc;background:yellow')
    8. //表示 shadow DOM 子树的根节点。
    9. const shaDow = this.attachShadow({mode:"open"})
    10. shaDow.appendChild(this.p)
    11. }
    12. h (el) {
    13. return document.createElement(el)
    14. }
    15. /**
    16. * 生命周期
    17. */
    18. //当自定义元素第一次被连接到文档 DOM 时被调用。
    19. connectedCallback () {
    20. console.log('我已经插入了!!!嗷呜')
    21. }
    22. //当自定义元素与文档 DOM 断开连接时被调用。
    23. disconnectedCallback () {
    24. console.log('我已经断开了!!!嗷呜')
    25. }
    26. //当自定义元素被移动到新文档时被调用
    27. adoptedCallback () {
    28. console.log('我被移动了!!!嗷呜')
    29. }
    30. //当自定义元素的一个属性被增加、移除或更改时被调用
    31. attributeChangedCallback () {
    32. console.log('我被改变了!!!嗷呜')
    33. }
    34. }
    35. window.customElements.define('xiao-man',Btn)

    2.template 模式

    1. class Btn extends HTMLElement {
    2. constructor() {
    3. //调用super 来建立正确的原型链继承关系
    4. super()
    5. const template = this.h('template')
    6. template.innerHTML = `
    7. 小满
    8. `
    9. //表示 shadow DOM 子树的根节点。
    10. const shaDow = this.attachShadow({ mode: "open" })
    11. shaDow.appendChild(template.content.cloneNode(true))
    12. }
    13. h(el) {
    14. return document.createElement(el)
    15. }
    16. /**
    17. * 生命周期
    18. */
    19. //当自定义元素第一次被连接到文档 DOM 时被调用。
    20. connectedCallback() {
    21. console.log('我已经插入了!!!嗷呜')
    22. }
    23. //当自定义元素与文档 DOM 断开连接时被调用。
    24. disconnectedCallback() {
    25. console.log('我已经断开了!!!嗷呜')
    26. }
    27. //当自定义元素被移动到新文档时被调用
    28. adoptedCallback() {
    29. console.log('我被移动了!!!嗷呜')
    30. }
    31. //当自定义元素的一个属性被增加、移除或更改时被调用
    32. attributeChangedCallback() {
    33. console.log('我被改变了!!!嗷呜')
    34. }
    35. }
    36. window.customElements.define('xiao-man', Btn)

    使用方式

    1. DOCTYPE html>
    2. web Component

    3.如何在Vue 使用

    defineCustomElement

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

    1. /*vite config ts 配置*/
    2. vue({
    3. template:{
    4. compilerOptions:{
    5. isCustomElement:(tag)=> tag.includes('xiaoman-')
    6. }
    7. }
    8. })

    父组件 

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

    子组件

    1. <script setup lang='ts'>
    2. import { ref, reactive } from 'vue'
    3. defineProps<{
    4. title:string
    5. }>()
    6. script>
    7. <style scoped lang='less'>
    8. style>

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

  • 相关阅读:
    2023年五一杯数学建模B题快递需求分析问题求解全过程论文及程序
    《canvas》之第7章 变形操作
    代码技巧——Apache集合类&字符串工具包中实用的API
    365天挑战LeetCode1000题——Day 035 每日一题 + 二分查找 13
    【PHP】如何优雅地在PHP里写注释 | PHP的注释、PHPDoc
    笙默考试管理系统-SMExamination.Model.Notice展示(2)
    1019 General Palindromic Number
    java-net-php-python-ssm高校心理测评系统计算机毕业设计程序
    并查集介绍和常用模板
    μC/OS-II---消息邮箱管理1(os_mbox.c)
  • 原文地址:https://blog.csdn.net/qq1195566313/article/details/127328300