Vue3 封装命令式组件
414 字
2 分钟
Vue3 封装命令式组件
前言
命令式组件就是通过 $message()、ElMessage() 这种方式调用的组件,而不是在模板里写 <Message />。
创建命令式组件
<script setup> import { ref } from "vue";
const messageShow = ref(false);
function showMessage(text) { messageShow.value = true; }
function closeMessage() { messageShow.value = false; }
defineProps({ message: String, close: { type: Function, default: () => { messageShow.value = false; }, }, });
</script><template> <div v-if="messageShow">{{ message }}</div></template>创建调用函数
import MessageBox from "./MessageBox.vue";import { createApp } from "vue";
export default function(text, handler) { const app = createApp(MessageBox, { message: text, close: () => { handler?.(); app.unmount(); document.body.removeChild(div); }, }); const div = document.createElement("div"); app.mount(div); document.body.appendChild(div);
return { close() { app.unmount(); document.body.removeChild(div); }, };}使用
const msg = showMessage("你好");msg.close(); // 手动关闭缺陷
这种方式创建的组件无法接收组件内的状态更新,比如子组件要主动关闭时,close 函数无法被正确调用。需要借助 reactive 或其他方式传递上下文。
方式二:基于回调函数
<script setup> import { ref } from "vue";
const messageShow = ref(false); const messageText = ref("");
function showMessage(text, onClose) { messageText.value = text; messageShow.value = true; }
function closeMessage() { messageShow.value = false; onClose?.(); }
defineProps({ text: String, });
defineExpose({ showMessage, closeMessage });</script>
<template> <div v-if="messageShow">{{ text }}</div></template>使用
import Message from "./Message.vue";import { createApp } from "vue";
function showMessage(text, onClose) { const div = document.createElement("div"); const app = createApp(Message, { text, onClose, }); app.mount(div); document.body.appendChild(div);}缺陷
每次调用都会创建新的组件实例和 DOM 节点,且不支持多个消息同时存在。
总结
| 方式 | 优点 | 缺点 |
|---|---|---|
| 方式一 | 简单直观 | 无法接收子组件状态更新 |
| 方式二 | 支持回调 | 每次调用都创建新实例,无法同时显示多个 |
实际项目中,通常会结合发布订阅模式或单例模式来优化这些问题。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!
相关文章智能推荐
1
Vue3
学习笔记标题说的对
2
如何优化vue项目的白屏时间
技术分享希望可以帮到你
3
Nuxt4备忘录
学习笔记希望可以帮到你
4
如何阻止iframe自动聚焦导致页面滚动
技术分享希望可以帮到你
5
Python 笔记:给前端开发者的语法对照
学习笔记用 JavaScript 的思维快速理解 Python 中真正不同的语法。
随机文章随机推荐






























































































































































