【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 || 0
    el.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);
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/422867.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

备战蓝桥杯————差分数组2

目录 引言 一、拼车 题目描述 解题思路及代码 结果展示 二、航班预定统计 题目描述 解题思路及代码 结果展示 总结 引言 在现代交通管理中&#xff0c;拼车服务和航班预订系统是提高资源利用效率、优化用户体验的关键技术。随着城市交通压力的增大和航空业的快速发…

深度学习 精选笔记(4)线性神经网络-交叉熵回归与Softmax 回归

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…

为什么网站页面没有被百度搜索收录?是网站被攻击了?

例如&#xff0c;为什么网站页面没有被百度搜索收录&#xff1f; 网站是否受到攻击&#xff1f; 网站索引量和网站流量之间有关系吗&#xff1f; 您在运行网站或小程序时是否有过这样的疑问&#xff1f; 下面我将为大家详细解答这些问题。 1.PC/H5站点相关 1、为什么新网站页面…

蓝桥杯Learning

Part 1 递归和递推 1. 简单斐波那契数列 n int(input())st [0]*(47) # 注意这个地方&#xff0c;需要将数组空间设置的大一些&#xff0c;否则会数组越界 st[1] 0 st[2] 1 # 这个方法相当于是递推&#xff0c;即先求解一个大问题的若干个小问题 def dfs(u):if u 1:print(…

Linux如何查看端口是否占用

在Linux中&#xff0c;有多种方法可以用来检查端口是否被占用。以下是一些常用的命令&#xff1a; netstat&#xff1a;这是一个非常通用的命令&#xff0c;可以用来查看所有端口的使用情况。如果你想查找特定的端口是否被占用&#xff0c;可以使用netstat命令配合grep。例如&…

pytest教程-13-conftest.py文件

上一小节我们学习了fixture的作用域&#xff0c;本小节我们学习一下pytest conftest.py文件的使用方法。 conftest.py文件的作用 conftest.py文件是pytest框架中的一个特殊文件&#xff0c;用于定义共享的设置、夹具(fixture)和钩子函数&#xff08;hook&#xff09;。 在py…

Java学习-简单算法与正则表达式

1.排序算法 a.冒泡排序&#xff1a; 每轮找出当前最大值&#xff0c;冒到前面&#xff0c;循环长度减一次&#xff0c;每轮从1个比较到长度减i个 b.选择排序&#xff1a; 每一轮选择每一个位置的数组元素和后面的元素比较&#xff0c;从第i1个比较到最后一个 选择排序的优化&am…

Netty的InboundHandler 和OutboundHandler

一、InboundHandler 和OutboundHandler的区别 在Netty中&#xff0c;"inbound"表示来自外部来源&#xff08;如网络连接&#xff09;的数据&#xff0c;而"outbound"则表示从应用程序发送到外部目标&#xff08;如网络连接或其他服务&#xff09;的数据。…

2、事件机制、DOM操作、jquery对尺寸操作、jquery添加和删除

一、事件机制 1、事件源.事件类型(事件处理程序) $(this)中的this不能加引号 $(#box).click(function () {$(this).css(background-color,blue)//点击颜色变为蓝色 })2、事件源.on/bind(事件类型&#xff0c;事件处理程序) $("#box").on(dbclick,function () {$(…

MySQL:错误ERROR 1045 (28000)详解

1.问题说明 有时候我们登录Mysql输入密码的时候&#xff0c;会出现这种情况&#xff1a; mysql -u root -p Enter Password > ‘密码’ 错误&#xff1a;ERROR 1045 (28000): Access denied for user ‘root’‘localhost’ (using password: YES) 或者&#xff1a;错误…

CTFHUB--文件包含漏洞--RCE

文件包含漏洞 文件包含漏洞也是一种注入型漏洞&#xff0c;其本质就是输入一段用户能够控制的脚本或者代码&#xff0c;并让服务端执行。有时候由于网站功能需求&#xff0c;会让前端用户选择要包含的文件&#xff0c;而开发人员又没有对要包含的文件进行安全考虑&#xff0c;…

修改centos7的dns解决docker拉取镜像超时问题

近期在一台centos7的服务器上部署系统&#xff0c;拉取docker镜像时总是超时&#xff0c;如图所示。网上有教程说&#xff0c;可以修改操纵系统的dns地址&#xff0c;试了一下&#xff0c;果然搞定。 打开dns配置文件 sudo vi /etc/resolv.conf发觉里面的地址设为114.114.114…

Unity铰链四杆机构设计和运动仿真

一、效果图 设定好各边长度和转速后&#xff0c;点击【设置并启动】&#xff0c;自动生成一个机构模型&#xff0c;并按照原理进行运转 二、铰链四杆机构介绍 机架&#xff1a;A和D是固定位置&#xff0c;叫做机架。 曲柄&#xff1a;B点绕A点旋转&#xff0c;构成曲柄。 连…

什么是VR数字文化遗产保护|元宇宙文旅

VR数字文化遗产保护是指利用虚拟现实&#xff08;VR&#xff09;技术来保护和传承文化遗产。在数字化时代&#xff0c;许多珍贵的文化遗产面临着自然衰退、人为破坏或其他因素造成的威胁。通过应用VR技术&#xff0c;可以以全新的方式记录、保存和展示文化遗产&#xff0c;从而…

sqlserver 改变decimal 精度

遇到需要修改精度的业务场景: 可能是数据库存的精度和小数位太多,需要减少: 比较全能的CAST转换: CAST(你的字段 AS DECIMAL(38,10)) ↓ CAST(你的字段 AS DECIMAL(38,2)) 在 SQL Server 中&#xff0c;decimal 数据类型通常使用两个参数来定义其精度和小数位数。这两个…

MySQL进阶:视图存储过程存储函数触发器

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;MySQL进阶&#xff1a;大厂高频面试——各类SQL语句性能调优经验 &#x1f4da;订阅专栏&#xff1a;MySQL进阶 希望文章对你们有…

leetcode 3.1

leetcode hot 100 双指针1.三数之和2.接雨水 多维动态规划1.最长公共子序列 双指针 1.三数之和 三数之和 排序 双指针的方法&#xff0c;固定一个数nums[i], 用两数和找target - nums[i] 的数需要注意两点: 1.需要去掉重复数字 while (l < r && nums[l] nums[…

【Numpy】成功解决AttributeError: ‘Tuple‘ object has no attribute ‘shape‘

【Numpy】成功解决AttributeError: ‘Tuple’ object has no attribute ‘shape’ &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&…

Java+SpringBoot+Vue:招生宣传的全栈解决方案

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

linux系统Jenkins工具配置webhook自动部署

Jenkins工具webhook自动部署 webhook自动部署webhook的意义操作流程jenkins页面操作gitlab页面操作 webhook自动部署 webhook的意义 自动化部署&#xff1a;Webhook 可以在代码提交、合并请求或其他特定事件发生时自动触发 Jenkins 构建和部署任务&#xff0c;从而实现自动化…