vue3 中使用web components

会在dom中加入一个#shadow-root(open)进行css之间的隔离,里面的样式不会影响到外面,微前端样式隔离用到的就是这个

原声web componts 写法

  • index.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>Document</title>
    <script src="./btns.js"></script>
</head>
<body>
    <yx-btn></yx-btn>
</body>
</html>
  • 需要用到得btns.js 文件, 也是写隔离shadowDom得地方
class Btns extends HTMLElement {
    constructor(){
        super()
        // 创建一个 影子 节点
        const shadowDom = this.attachShadow({mode:'open'})

        this.p = this.h('p')

        this.p.innerText = 'yx'
        // 设置样式
        this.p.setAttribute('style','width:100px;height:100px;color:red;border:1px solid #CCC')

        shadowDom.appendChild(this.p)
    }

    h (el){
        return document.createElement(el)
    }

}
// 设置调用方式
window.customElements.define('yx-btn',Btns)
  • Btns.js中 写template 文本方式, template需要通过获取content方式渲染数据


class Btns extends HTMLElement {
    constructor(){
        super()
        // 创建一个 影子 节点
        const shadowDom = this.attachShadow({mode:'open'})

        this.template = this.h('template')

        this.template.innerHTML = `
            <style>
                div{
                    width:100px;
                    height:100px;
                    border:1px solid #CCC;
                }
            </style>
            <div>this is a test</div>
        `
        shadowDom.appendChild(this.template.content.cloneNode(true))
    }

    h (el){
        return document.createElement(el)
    }

}
// 设置调用方式
window.customElements.define('yx-btn',Btns)

结合vue 使用

  • 需在vite.config.ts 中进行配置
/* * */
plugins: [
    vue({
      template:{
        compilerOptions:{
        // 检测到包含yx-开头的组件,vue不进行校验,使用自身定义的web component
          isCustomElement: (tag:any)=> tag.includes('yx-')
        }
      }
    })
]
  • vue中web component 的文件命名需是****.ce.vue结尾。 此文件命名为custom-vue.ce.vue
<template>
  <div>web components</div>
</template>

<script setup lang='ts'>

const props = defineProps<{
    obj:any
}>()

// 传递的参数是object,因此需要转换
console.log(JSON.parse(props.obj))
</script>

  • App.vue 引用自定义的web component
<template>
  <yx-btn :obj="obj"></yx-btn>
</template>

<script setup lang="ts">

import { defineCustomElement } from 'vue'

import customVueCeVue from './custom-vue.ce.vue'

// 使用vue 提供的defineCustomElement, 将其变成web component
const Btn = defineCustomElement(customVueCeVue)

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

// 引用类型传参,需要使用JSON.stringify
const obj = JSON.stringify({name:12})

</script>

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值