搜 索

vue3中实现全局自定义组件

  • 1.3k阅读
  • 2023年12月29日
  • 14评论
首页 / 前端技术 / 正文

element-plus中的message弹窗提示消息很好用,挂载在全局上,不需要引入组件,只需$message即可调用使用,但是因为样式固定,故需要一种可以全局使用的自定义组件的调用方式,同样实现只需要一行代码即可调用组件,无需引入。

首先,先写一个需要全局调用的组件,当然要接收一些参数,需要使用到vue3提供的defineProps方法,例如:

<script setup>
import { ElDialog } from "element-plus"
import { ref } from "vue"

const showCustomMessage = ref(true)

const props = defineProps({
    type: {
        type: String,
        default: "success"
    },
    content: {
        type: String,
        default: "提示内容"
    },
    duration: {
        type: Number,
        default: 2000
    }
})

setTimeout(() => {
    showCustomMessage.value = false
}, props.duration)

</script>

<template>
    <div>
        <el-dialog
            v-model="showCustomMessage"
            :show-close="false"
            align-center
            destroy-on-close
            center
        >
            <div>
                {{ props.content }}
            </div>
        </el-dialog>
    </div>
</template>

<style scoped lang="less">
:deep(.el-dialog) {
    width: auto;
    height: auto;
    
    .el-dialog__header {
        padding: 0;
        margin-right: 0;
    }
    
    .el-dialog__body {
        padding: 0.8rem 1.4rem;
        display: flex;
        align-items: center;
        justify-content: center;
        
        > div {
            color: #000;
            font-size: 0.24rem;
            font-weight: 500;
        }
    }
}
</style>

以上则是使用了element-plus的el-dialog当然也可以不用,该组件接收参数:type,content,duration

之后再创建一个js文件,用于将组件调用并开放方法,其中index.vue就是上述创建的组件文件,例如:

// 实现使用函数调用组件的逻辑
//   引入 创建虚拟节点 和渲染方法
import { createVNode, render } from "vue"
// 引入信息提示组件
import customMessage from "./index.vue"

// 准备dom容器
const div = document.createElement("div")
// 添加到body上
document.body.appendChild(div)

export default ({ type, content, duration = 2000 }) => {
    // 实现:根据MessageMain.vue渲染消息提示
    // 1. 导入组件
    // 2. 根据组件创建虚拟节点   第一个参数为要创建的虚拟节点  第二个参数为props的参数
    const vnode = createVNode(customMessage, { type, content, duration })
    // 3. 准备一个DOM容器
    // 4. 把虚拟节点渲染DOM容器中
    render(vnode, div)

    // 5. 等待duration时间后,删除DOM容器中的内容
    setTimeout(() => {
        render(null, div)
    }, duration + 500)
}

以上在export default开放的方法中接收type, content, duration,且在创建虚拟节点时传入,也就是createVNode(customMessage, { type, content, duration }),这样type,content,duration就可以传给组件

之后在main.js文件中,import进来,并使用app.provide挂载在全局出去:

import customMessage from "@/components/customMessage/index.js"; // 公共消息弹窗组件,自定义
app.provide("$customMessage", customMessage)

之后想要调用的话即可在需要的vue中,使用

import { inject } from "vue"
const customMessage = inject("$customMessage")
customMessage({
            type: "error",
            content: "失败",
            duration: 4000
})

至此可实现跟element-plus中$message一样的功能

vue
评论区

《华纳圣淘沙公司开户流程全解析》→ 官方顾问一对一指导??? 安全联系:183第三段8890第四段9465
《华纳圣淘沙开户步骤详解》→ 」专属通道快速办理??? 安全联系:183第三段8890第四段9465
《华纳圣淘沙账户注册指南》→ 扫码获取完整资料清单?「微?? 安全联系:183第三段8890第四段9465
《新手开通华纳圣淘沙公司账户指南》→ 限时免费咨询开放??? 安全联系:183第三段8890第四段9465
《华纳圣淘沙企业开户标准流程》→ 资深顾问实时解答疑问??? 安全联系:183第三段8890第四段9465
《华纳圣淘沙开户步骤全景图》→ 点击获取极速开户方案??? 安全联系:183第三段8890第四段9465
《华纳圣淘沙账户创建全流程手册》→ 预约顾问免排队服务?9?? 安全联系:183第三段8890第四段9465 《从零开通华纳圣淘沙公司账户》→ 添加客服领取开户工具包?? 安全联系:183第三段8890第四段9465
《官方授权:华纳圣淘沙开户流程》→ 认证顾问全程代办?」?? 安全联系:183第三段8890第四段9465
《华纳圣淘沙开户说明书》→立即联系获取电子版文件??? 安全联系:183第三段8890第四段9465

华纳圣淘沙开户步骤详解(183-8890-9465—?薇-STS5099【6011643】

华纳圣淘沙公司开户流程全解析(183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙公司账户注册指南(183-8890-9465—?薇-STS5099【6011643】
新手如何开通华纳圣淘沙公司账户(183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙企业开户标准流程(183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙公司开户:从零到一(183-8890-9465—?薇-STS5099【6011643】
官方指南:华纳圣淘沙公司开户流程(183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙公司开户流程说明书(183-8890-9465—?薇-STS5099【6011643】

华纳圣淘沙开户步骤详解(183-8890-9465—?薇-STS5099【6011643】

华纳圣淘沙公司开户流程全解析(183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙公司账户注册指南(183-8890-9465—?薇-STS5099【6011643】
新手如何开通华纳圣淘沙公司账户(183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙企业开户标准流程(183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙公司开户:从零到一(183-8890-9465—?薇-STS5099【6011643】
官方指南:华纳圣淘沙公司开户流程(183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙公司开户流程说明书(183-8890-9465—?薇-STS5099【6011643】

东方明珠客服开户联系方式【182-8836-2750—】?μ- cxs20250806
东方明珠客服电话联系方式【182-8836-2750—】?- cxs20250806】
东方明珠开户流程【182-8836-2750—】?薇- cxs20250806】
东方明珠客服怎么联系【182-8836-2750—】?薇- cxs20250806】

新盛客服电话是多少?(?183-8890-9465—《?薇-STS5099】【
新盛开户专线联系方式?(?183-8890--9465—《?薇-STS5099】【?扣6011643??】
新盛客服开户电话全攻略,让娱乐更顺畅!(?183-8890--9465—《?薇-STS5099】客服开户流程,华纳新盛客服开户流程图(?183-8890--9465—《?薇-STS5099】

新盛客服电话是多少?(?183-8890-9465—《?薇-STS5099】【
新盛开户专线联系方式?(?183-8890--9465—《?薇-STS5099】【?扣6011643??】
新盛客服开户电话全攻略,让娱乐更顺畅!(?183-8890--9465—《?薇-STS5099】客服开户流程,华纳新盛客服开户流程图(?183-8890--9465—《?薇-STS5099】

华纳东方明珠客服电话是多少?(▲18288362750?《?微信STS5099? 】
如何联系华纳东方明珠客服?(▲18288362750?《?微信STS5099? 】
华纳东方明珠官方客服联系方式?(▲18288362750?《?微信STS5099?
华纳东方明珠客服热线?(▲18288362750?《?微信STS5099?
华纳东方明珠24小时客服电话?(▲18288362750?《?微信STS5099? 】
华纳东方明珠官方客服在线咨询?(▲18288362750?《?微信STS5099?

华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099

znjojuymyp 2025年10月7日 11:35
回复 取消

2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
新车首发,新的一年,只带想赚米的人coinsrore.com
新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
新车上路,只带前10个人coinsrore.com
新盘首开 新盘首开 征召客户!!!coinsrore.com
新项目准备上线,寻找志同道合的合作伙伴coinsrore.com
新车即将上线 真正的项目,期待你的参与coinsrore.com
新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com

wfpnbzbbwi 2025年10月5日 08:37
回复 取消

新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com

ianlpqmavp 2025年10月5日 07:34
回复 取消

新车上路,只带前10个人

ijokiyninr 2025年3月4日 20:05
回复 取消

文章的叙述风格独特,用词精准,让人回味无穷。

uvlzmniybc 2025年3月3日 06:27
回复 取消

瑕不掩瑜,稍加打磨必成佳作。

dryxlkhjqo 2025年3月2日 21:50
回复 取消

这篇文章如同一首动人的乐章,触动了读者内心深处的柔软。

avatar