重生之我在学Vue--第16天 Vue 3 插件开发

news2025/3/17 22:39:11

重生之我在学Vue–第16天 Vue 3 插件开发

文章目录

  • 重生之我在学Vue--第16天 Vue 3 插件开发
    • 前言
    • 一、插件的作用与开发思路
      • 1.1 插件能做什么?
      • 1.2 插件开发四部曲
    • 二、开发全局通知插件
      • 2.1 插件基础结构
      • 2.2 完整插件代码(带注释解析)
      • 2.3 样式文件 notification.css
    • 三、插件的安装与使用
      • 3.1 在 main.js 中安装
      • 3.2 在组件中使用
    • 四、插件开发进阶技巧
      • 4.1 支持 TypeScript 类型
      • 4.2 响应式状态管理
    • 五、今日任务:开发并集成通知插件
      • 任务要求
      • 代码示例:动画实现
    • 结语

前言

在 Vue 的世界里,插件就像是一把万能钥匙,它能让我们将通用功能封装成可复用的模块,实现 全局能力扩展。今天我们将从零开发一个全局通知插件,让你的 Vue 应用拥有优雅的消息提示能力!

Vue3 官方中文文档传送点: 插件 | Vue.js

插件开发的核心是理解 install 方法全局资源注册 的机制

Vue前端成仙之路:Vue 前端成仙之路_野生的程序媛的博客-CSDN博客

GO后端成神之路:Go 后端成神之路_野生的程序媛的博客-CSDN博客

一、插件的作用与开发思路

1.1 插件能做什么?

场景实现方式典型案例
全局组件注册app.component()Element Plus 组件库
全局指令添加app.directive()v-loading 指令
全局混入逻辑app.mixin()权限校验逻辑
全局属性/方法注入app.config.globalProperties$axios 实例

1.2 插件开发四部曲

  1. 定义插件对象:包含 install 方法
  2. 注册全局资源:组件/指令/属性等
  3. 注入应用实例:通过 app.use() 安装
  4. 项目中调用:任意组件内使用

二、开发全局通知插件

2.1 插件基础结构

// plugins/notification.js
export default {
  install: (app, options) => {
    // 在这里注册全局资源
  }
}

2.2 完整插件代码(带注释解析)

import { h, render, ref } from 'vue'

// 1. 创建通知容器组件
const NotificationContainer = {
  setup() {
    const notifications = ref([])

    // 添加通知
    const add = (notification) => {
      notifications.value.push(notification)
      
      // 自动关闭
      if (notification.duration > 0) {
        setTimeout(() => {
          remove(notification.id)
        }, notification.duration)
      }
    }

    // 移除通知
    const remove = (id) => {
      notifications.value = notifications.value.filter(n => n.id !== id)
    }

    return { notifications, add, remove }
  },
  render() {
    return h('div', { class: 'notification-container' },
      this.notifications.map(notification => 
        h(NotificationItem, {
          key: notification.id,
          ...notification,
          onClose: () => this.remove(notification.id)
        })
      )
    )
  }
}

// 2. 单个通知项组件
const NotificationItem = {
  props: ['type', 'message', 'onClose'],
  render() {
    return h('div', { class: ['notification', this.type] }, [
      h('span', this.message),
      h('button', { onClick: this.onClose }, '×')
    ])
  }
}

// 3. 插件安装逻辑
export default {
  install(app) {
    // 创建挂载节点
    const mountNode = document.createElement('div')
    document.body.appendChild(mountNode)
    
    // 渲染通知容器
    render(h(NotificationContainer), mountNode)
    
    // 注入全局方法
    app.config.globalProperties.$notify = {
      show: (message, options = {}) => {
        const id = Date.now()
        const notification = {
          id,
          message,
          type: options.type || 'info',
          duration: options.duration || 3000
        }
        
        // 通过事件总线触发添加
        const event = new CustomEvent('add-notification', { detail: notification })
        document.dispatchEvent(event)
      }
    }
    
    // 监听添加事件
    document.addEventListener('add-notification', (e) => {
      const instance = mountNode._vnode.component.ctx
      instance.add(e.detail)
    })
  }
}

2.3 样式文件 notification.css

.notification-container {
  position: fixed;
  top: 20px;
  right: 20px;
  z-index: 9999;
}

.notification {
  padding: 12px 20px;
  margin-bottom: 10px;
  border-radius: 4px;
  background: #f4f4f5;
  color: #909399;
  min-width: 200px;
  display: flex;
  justify-content: space-between;
  align-items: center;
  box-shadow: 0 2px 12px rgba(0,0,0,.1);
}

.notification.success {
  background: #f0f9eb;
  color: #67c23a;
}

.notification.error {
  background: #fef0f0;
  color: #f56c6c;
}

三、插件的安装与使用

3.1 在 main.js 中安装

import { createApp } from 'vue'
import App from './App.vue'
import notification from './plugins/notification'
import './styles/notification.css'

const app = createApp(App)
app.use(notification)
app.mount('#app')

3.2 在组件中使用

<template>
  <button @click="showNotification">触发通知</button>
</template>

<script setup>
import { getCurrentInstance } from 'vue'

const { proxy } = getCurrentInstance()

const showNotification = () => {
  proxy.$notify.show('操作成功!', { 
    type: 'success',
    duration: 2000 
  })
}
</script>

四、插件开发进阶技巧

4.1 支持 TypeScript 类型

// types/notification.d.ts
import { ComponentPublicInstance } from 'vue'

declare module '@vue/runtime-core' {
  interface ComponentCustomProperties {
    $notify: {
      show: (message: string, options?: NotificationOptions) => void
    }
  }
}

interface NotificationOptions {
  type?: 'info' | 'success' | 'error'
  duration?: number
}

4.2 响应式状态管理

// 使用 Pinia 管理通知状态
import { defineStore } from 'pinia'

export const useNotificationStore = defineStore('notification', {
  state: () => ({
    list: []
  }),
  actions: {
    add(notification) {
      this.list.push(notification)
    },
    remove(id) {
      this.list = this.list.filter(n => n.id !== id)
    }
  }
})

五、今日任务:开发并集成通知插件

任务要求

  1. 按照示例代码实现通知插件
  2. 在任务管理系统中添加以下通知场景:
    • 任务创建成功
    • 任务删除确认提示
    • 网络请求失败的报错提示
  3. (扩展)实现通知的渐入渐出动画

代码示例:动画实现

<template>
  <TransitionGroup 
    name="notification"
    tag="div"
    class="notification-container"
  >
    <!-- 通知项 -->
  </TransitionGroup>
</template>

<style>
.notification-enter-active,
.notification-leave-active {
  transition: all 0.5s ease;
}

.notification-enter-from,
.notification-leave-to {
  opacity: 0;
  transform: translateX(100%);
}
</style>

结语

通过开发全局通知插件,我们掌握了 Vue 插件开发的 核心模式:利用 install 方法扩展全局能力。插件开发的关键点在于:

  1. 全局资源隔离:通过 DOM 操作创建独立挂载点
  2. 响应式状态管理:使用 ref/reactive 跟踪通知状态
  3. 架构可扩展性:支持类型扩展、样式定制等功能

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

交互式可视化进阶(Plotly Dash构建疫情仪表盘)

这里写目录标题 交互式可视化进阶(Plotly Dash构建疫情仪表盘)1. 引言2. 项目背景与意义3. 数据集生成与介绍4. GPU加速在数据处理中的应用5. 交互式仪表盘构建与Plotly Dash6. PyQt GUI集成与美化7. 工程整体架构8. 部分代码实现9. 代码自查与BUG排查10. 总结与展望交互式可…

如何选择适合您智能家居解决方案的通信协议?

如何选择适合您智能家居解决方案的通信协议&#xff1f; 在开发智能家居产品时&#xff0c;选择合适的通信协议对于设备的高效运行及其在智能家居系统中的互操作性至关重要。市面上协议众多&#xff0c;了解它们的特性并在做决定前考虑各种因素是非常必要的。以下是一些帮助您…

RabbitMQ可靠性进制

文章目录 1.生产者可靠性生产者重连生产者确认小结 2. MQ的可靠性数据持久化LazyQueue小结 3. 消费者的可靠性消费者确认机制消费者失败处理方案业务幂等性唯一消息ID业务判断 兜底方案业务判断 兜底方案 1.生产者可靠性 生产者重连 在某些场景下由于网络波动&#xff0c;可能…

版本控制器Git(5)

文章目录 前言一、理解标签二、创建标签三、操作标签四、多人协作场景一五、多人协作场景二总结 前言 本篇是最后一篇&#xff0c;主要介绍标签管理有关的内容 一、理解标签 标签定义&#xff1a;在Git中&#xff0c;标签&#xff08;tag&#xff09;是对某次提交&#xff08;c…

【数据分析】读取文件

3. 读取指定列 针对只需要读取数据中的某一列或多列的情况&#xff0c;pd.read_csv()函数提供了一个参数&#xff1a;usecols&#xff0c;将包含对应的columns的列表传入该参数即可。 上面&#xff0c;我们学习了读取 "payment" 和 "items_count" 这…

Dify使用部署与应用实践

最近在研究AI Agent&#xff0c;发现大家都在用Dify&#xff0c;但Dify部署起来总是面临各种问题&#xff0c;而且我在部署和应用测试过程中也都遇到了&#xff0c;因此记录如下&#xff0c;供大家参考。Dify总体来说比较灵活&#xff0c;扩展性比较强&#xff0c;适合基于它做…

Java 大视界 -- 基于 Java 的大数据机器学习模型的迁移学习应用与实践(129)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

1.Windows+vscode+cline+MCP配置

文章目录 1.简介与资源2.在windows中安装vscode及Cline插件1. 安装vscode2. 安装Cline插件3. 配置大语言模型3. 配置MCP步骤(windows) 1.简介与资源 MCP官方开源仓库 MCP合集网站 参考视频 2.在windows中安装vscode及Cline插件 1. 安装vscode 2. 安装Cline插件 Cline插件…

C#的字符串之String类与StringBuilder类区别于适用场景

一、分清楚值类型与引用类型 正确理解值类型与引用类型&#xff0c;可以更好的帮助软件开发人员写出性能更好且正确稳定运行的程序&#xff1a; C#值类型与引用类型区别 区别值类型引用类型定义所有继承自【System.ValueType】类型的都是值类型&#xff08;valueType继承自Sys…

关于WPS的Excel点击单元格打开别的文档的两种方法的探究【为单元格添加超链接】

问题需求 目录和文件结构如下&#xff1a; E:\Dir_Level1 │ Level1.txt │ └─Dir_Level2│ Level2.txt│ master.xlsx│└─Dir_Level3Level3.txt现在要在master.xlsx点击单元格进而访问Level1.txt、Level2.txt、Level3.txt这些文件。 方法一&#xff1a;“单元格右键…

conda的基本使用及pycharm里设置conda环境

创建conda环境 conda create --name your_env_name python3.8 把your_env_name换成实际的conda环境名称&#xff0c;python后边的根据自己的需要&#xff0c;选择python的版本。 激活conda环境 conda activate your_env_name 安装相关的包、库 conda install package_name …

计算机网络-网络规划与设计

基本流程 需求分析—》通信规范分析—》逻辑网络设计—》物理网络设计—》实施阶段 需求分析&#xff1a; 确定需求&#xff0c;包括&#xff1a;业务需求、用户需求、应用需求、计算机平台需求、网络通信需求等。 产物&#xff1a;需求规范 通信规范分析&#xff1a; 现有…

六种最新优化算法(TOC、MSO、AE、DOA、GOA、OX)求解多个无人机协同路径规划(可以自定义无人机数量及起始点),MATLAB代码

一、算法简介 &#xff08;一&#xff09;阿尔法进化&#xff08;Alpha Evolution&#xff0c;AE&#xff09;算法 阿尔法进化&#xff08;Alpha Evolution&#xff0c;AE&#xff09;算法是2024年提出的一种新型进化算法&#xff0c;其核心在于通过自适应基向量和随机步长的…

练习-依依的询问最小值(前缀和差分)

问题描述 依依有个长度为 n 的序列 a&#xff0c;下标从 1 开始。 她有 m 次查询操作&#xff0c;每次她会查询下标区间在[li​,ri​] 的 a 中元素和。她想知道你可以重新排序序列 a&#xff0c;使得这 m 次查询的总和最小。 求你求出 m 次查询总和的最小值。 输入格式 第…

ctfshow web刷题记录

RCE 第一题 eval代码执行 &#xff1a; 1、使用system 加通配符过滤 ?csystem("tac%20fl*") ; 2、反字节执行 xxx %20 echo 反字节 3、变量转移 重新定义一个变量 让他代替我们执行 4、伪协议玩法 ?cinclude$_GET[1]?>&1php://filter/readc…

MySQL单表查询大全【SELECT】

山再高&#xff0c;往上攀&#xff0c;总能登顶&#xff1b;路再长&#xff0c;走下去&#xff0c;定能到达。 Mysql中Select 的用法 ------前言------【SELECT】0.【准备工作】0.1 创建一个库0.2 库中创建表0.3 表中加入一些数据 1.【查询全部】2.【查询指定列】2.1查询指定列…

考研系列-408真题计算机网络篇(18-23)

写在前面 此文章是本人在备考过程中408真题计算机网络部分&#xff08;2018年-2023年&#xff09;的易错题及相应的知识点整理&#xff0c;后期复习也常常用到&#xff0c;对于知识提炼归纳理解起到了很大的作用&#xff0c;分享出来希望帮助到大家~ # 2018 1.停止-等待协议的…

卷积神经网络(CNN)之 EfficientNet

在深度学习领域&#xff0c;模型的计算效率与性能之间的平衡一直是一个核心挑战。随着卷积神经网络&#xff08;CNN&#xff09;在图像分类、目标检测等任务中取得显著成果&#xff0c;模型的复杂度和计算需求也急剧增加。2019年&#xff0c;Google Research 提出的 EfficientN…

【eNSP实战】将路由器配置为DHCP服务器

拓图 要求&#xff1a; 为 office100 和 office200 分别配置地址池 AR1接口配置 interface GigabitEthernet0/0/0ip address 192.168.100.1 255.255.255.0 # interface GigabitEthernet0/0/1ip address 192.168.200.1 255.255.255.0 AR1路由器上创建office100地址池 [AR1…

Postman下载安装及简单入门

一&#xff0e;Postman简介 Postman是一款API测试工具&#xff0c;可以帮助开发、测试人员发送HTTP请求&#xff0c;与各种API进行交互&#xff0c;并分析响应 二&#xff0e;下载与安装 访问Postman官网&#xff08;https://www.postman.com/&#xff09;&#xff0c;下载适…