Web Components与Vue3

什么是webComponents

Web Components 是一种使用原生的js、html、css创建自定义组件的技术。相比于其他组件化框架,比如 Vue、React等,它具有体积小、不用加载其他外部模块的优势。

如何使用webComponents

  1. 自定义组件都是由类声明的,我们需要先定义一个类:
class Btn extends HTMLElement {
    constructor () {
        super()
    }
}
  1. 使用 shandow DOM 将组件与外部隔离,防止组件内部样式影响到组件外元素的样式,然后使用原生 js 语法添加元素及样式:
class Btn extends HTMLElement {
    constructor () {
        super()
        // 使用 shadow Dom 将组件隔离,防止样式穿透
        const shadowDom = this.attachShadow({ mode: "open" })
        this.p = this.h('button')
        this.p.innerText = '自定义按钮'
        this.p.setAttribute('style', 'border: none; background-color: pink; height:30px;')
        shadowDom.appendChild(this.p)
    }
    h(el) {
        return document.createElement(el)
    }
}
  1. 使用 window.customElements.define() 注册自定义组件,根据规范,自定义组件的名称必须包含连词线,用与区别原生的 HTML 元素。
window.customElements.define('my-btn', Btn)
  1. 直接在html中使用:
<!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>webComponents</title>
    <script src="./btn.js"></script>
</head>
<body>
    <my-btn></my-btn>
</body>
</html>

在这里插入图片描述

使用template 风格声明自定义组件

如果觉得上面的写法比较麻烦,我们可以使用template来声明自定义组件:
class templateBtn extends HTMLElement {
    constructor () {
        super()
        const shadowDom = this.attachShadow({ mode: "open" })

        this.template = this.h('template')
        this.template.innerHTML = `
            <button>自定义template风格按钮</button>
            <style>
                button{
                    border: none;
                    background-color: khaki;
                    height: 30px;
                    margin: 5px;
                    border-radius: 6px;
                }
            </style>
        `

        shadowDom.appendChild(this.template.content.cloneNode(true))
    }
    h(el) {
        return document.createElement(el)
    }
}

window.customElements.define('temp-btn', templateBtn)

Web Components 生命周期

web components 定义的组件有以下几个生命周期钩子:

// webComponents 生命周期
    // 挂载后
    connectedCallback () {
        console.log('挂载了');
    }
    // 断开后
    disconnectedCallback () {
        console.log('断开了');
    }
    // 被移动到新文档时
    adoptedCallback () {
        console.log('被移动了');
    }
    // 自定义元素的属性被增加、修改、删除时
    attributeChangedCallback () {
        console.log('属性改变了');
    }

自定义组件传递DOM属性

自定义组件可以像原生html元素那样使用 DOM attribute,由于 DOM attribute 只能为字符串类型的值,所以设置复杂类型的值时,需要使用 JSON.stringify() 将引用类型的值转为字符串,使用的时候再 JSON.parse() 转为引用类型。

<body>
    <my-btn></my-btn>
    <br>
    <temp-btn a="123"></temp-btn>
    <br>
    <button>原生btn</button>

    <script>
        const tempBtn = document.getElementsByTagName('temp-btn')[0]
        const a = {abc: 1}
        tempBtn.setAttribute('obj', JSON.stringify(a))
        const obj = tempBtn.getAttribute('obj')
        console.log(JSON.parse(obj).abc); // 1
    </script>
</body>

在这里插入图片描述

在Vue3中使用 Web Components

  1. 在 vite.config.ts 中进行配置:
import vue from '@vitejs/plugin-vue'
export default defineConfig({
  plugins: [
    vue({
      template: {
        compilerOptions: {
          isCustomElement: (tag:any) => tag.includes('my-')
        }
      }
    })
  ]
})
  1. 新建一个自定义组件,必须要以 .ce.vue 为后缀:
<template>
    <button>
        自定义按钮
    </button>
</template>

<script setup lang='ts'>
const props = defineProps<{
    obj: any
}>()
console.log(props.obj);
</script>

<style scoped>
button{
    height: 30px;
    background-color: skyblue;
    border: 1px solid #ccc;
    border-radius: 10px;
}
</style>
  1. 在父组件中引入,并使用vue 提供的 defineCustomElement 方法来创建自定义组件
<template>
  <div>
    <my-btn :obj="obj"></my-btn>
  </div>
</template>

<script setup lang="ts">
import { ref, reactive, defineCustomElement} from 'vue'
import customVueCeVue from './components/custom-vue.ce.vue'

const Btn = defineCustomElement(customVueCeVue)

window.customElements.define('my-btn', Btn)

const obj = {name: '张三'}

</script>

在这里插入图片描述
更多详细用法请查看 Vue 官网: Vue 与 Web Components

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我理解了你的问题。首先,Web Components是一种用于构建可重用组件的技术,它允许您将组件封装在自定义元素中,然后在应用程序中使用它们。Vue3是一个流行的JavaScript框架,它提供了一些方便的功能来构建Web应用程序,其中包括路由和视图的管理。Element是一个流行的UI框架,它提供了许多常用的UI组件,例如数据表格。 在Vue3中,您可以使用Vue Router来管理您的应用程序的路由。您可以使用路由来导航到不同的视图,并且这些视图可以包含Element数据表格。 首先,您需要安装Vue Router和Element框架。您可以使用以下命令来安装它们: ``` npm install vue-router npm install element-plus ``` 然后,您需要定义您的路由和视图。您可以使用以下代码作为参考: ```javascript import { createRouter, createWebHistory } from 'vue-router' import DataTable from 'element-plus/lib/el-table' const routes = [ { path: '/', name: 'Home', component: DataTable } ] const router = createRouter({ history: createWebHistory(), routes }) export default router ``` 在这个例子中,我们定义了一个路由和一个视图。路由的路径是'/',它导航到一个名为'Home'的视图。这个视图使用了Element数据表格。 最后,您需要在您的应用程序中使用这个路由。您可以使用以下代码: ```javascript import { createApp } from 'vue' import App from './App.vue' import router from './router' createApp(App).use(router).mount('#app') ``` 在这个例子中,我们将路由添加到我们的应用程序中,并将它们与我们的应用程序实例一起挂载。 希望这可以帮助您回答您的问题。如果您有任何其他问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值