【vue3】命令式组件封装,message封装示例;(函数式组件?)

本文主要是介绍【vue3】命令式组件封装,message封装示例;(函数式组件?),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

仅做代码示例;当然改进的地方还是不少的,仅作为该类组件封装方式的初步启发;
理想大成肯定是想要像 `饿了么` 这些组件库一样。

有的人叫这函数式组件,有的人叫这命令式组件,我个人还是偏向于命令式组件的称呼。因为以vue官方文档里对函数式组件的描述,该组件不符合相关类型描述。
而且这种主要以`关注实现过程为主`的封装风格,感觉叫 命令式组件 贴切点,欢迎大家提出自身观点!


1、封装 message.vue 消息提示组件;

<template><div :ref="(el) => setRef(el, index)" v-for="(item, index) in showList" :key="item.message + index" class="message":class="[item.type]"><span class="messageIcon">∮</span><span>{{ item.message }}</span><span class="closeIcon" @click="closeTarget(index)">×</span></div>
</template><script setup lang="ts">
import { onMounted, onUnmounted, ref } from "vue";
const props = defineProps({closeAll: Function
})const emit = defineEmits(['close'])
let lastRef = null
function setRef(el, index) {console.log(el,index);if (el) {index ? (lastRef = el) : (lastRef = null) const height = lastRef?.clientHeight || 0el.style.top = (20 * (1 + index)) + height + 'px'}}
const showList = ref([])
function createMessage(options) {console.log(options, showList);showList.value.push({...options,timeout: setTimeout(() => {showList.value.shift()options.onClose()if (!showList.value.length) {props.closeAll()}}, 5000)})
}
function closeTarget(i) {const target = showList.value.splice(i, 1)[0]target.onClose()clearTimeout(target.timeout)if (!showList.value.length) {props.closeAll()}
}
defineExpose({createMessage
})
onMounted(() => {console.log(props, 'props内容');console.log('命令式组件加载');
})
onUnmounted(() => {console.log('命令式组件卸载');
})
</script><style scoped lang="less">
.message {display: flex;align-items: center;position: fixed;top: 20px;left: 50%;transform: translate(-50%, 0px);border-radius: 5px;padding: 15px 20px;font-size: 14px;background-color: #f4f4f5;border: 1px solid #e9e9eb;color: #909399;z-index: 3000;&.success {background-color: #f0f9eb;border: 1px solid #e1f3d8;color: #67c23a;}.messageIcon {width: 16px;height: 16px;line-height: 16px;margin-right: 5px;}.closeIcon {width: 16px;height: 16px;line-height: 16px;margin-left: 10px;font-size: 18px;cursor: pointer;}
}
</style>

2、封装Message函数,在该函数内创建message组件实例、渲染提示信息;

import { createApp } from "vue";
import message from "./message.vue";let newInstance = null;
export default function Message(options) {function onClose() {options.onClose && options.onClose();}if (!newInstance) {const el = document.createElement("div");const app = createApp(message,{closeAll});const vm = app.mount(el);document.body.appendChild(el);newInstance = vm;newInstance.createMessage({...options,onClose,});function closeAll(){app.unmount();el.remove();newInstance = null;}} else {newInstance.createMessage({...options,onClose,});}
}

 3、正常开发内使用:

import { onMounted, onUnmounted, ref } from "vue";
import messageApi from "@/components/newApi/message";onMounted(() => {setTimeout(() => {messageApi({type:'success',message:'消息内容测试,demo.',onClose(){console.log('年的槽');}})setTimeout(() => {messageApi({type:'success',message:'消息内容测试,demo222.',onClose(){console.log('年的槽*2');}})}, 1000);}, 1000*3);
})

这篇关于【vue3】命令式组件封装,message封装示例;(函数式组件?)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/762201

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

【 html+css 绚丽Loading 】000046 三才归元阵

前言:哈喽,大家好,今天给大家分享html+css 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 📚一、效果📚二、信息💡1.简介:💡2.外观描述:💡3.使用方式:💡4.战斗方式:💡5.提升:💡6.传说: 📚三、源代码,上代码,可以直接复制使用🎥效果🗂️目录✍️

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数