Vue项目优化-组件配置化、插件使用

news2025/4/26 7:03:19

        Vue中可以根据需要去加载插件,一些自己写的插件在多个项目中都是需要用到的,通过把它们插件化,可以实现在需要用到的项目中便捷地复用,实现热拔插。

 一、问题背景

        以弹窗表单组件为例,平常我们使用弹窗组件都是通过页面中引入dialog组件,然后用一个visible参数去控制显示隐藏,还要加入一些打开关闭的方法。因此,在每个需要弹窗的地方都需要这么操作:(引入组件并祖册、添加一个控制显隐的参数visible、添加一个open方法和一个close方法),虽然用着没什么毛病......

但是,这样子会存在一些问题:

①每当我们需要使用,都需要复制粘贴这么多东西, 

②在改变显隐逻辑的时候,还需要查找一下代码中所有出现visible的地方,梳理一下如何控制,

③每次搬走弹窗的时候,不仅仅要搬走组件,还要搬走参数、方法。

这个过程相当繁琐,也容易出错

二、怎么使用

1.首先,在写好了弹窗表单组件之后,在该文件夹下再新建一个dialog.js文件,写入以下内容:

import component from './index.vue'
function useDialogWrap(Vue) {
    Vue.prototype.$dialogwrap = (options => {
        // vue.extend(options):使用基础 Vue 构造器,通过原型继承,创建一个“子类”,参数是一个包含组件选项的对象。
        let Constructor = Vue.extend(component)//继承弹窗组件
        // 创建组件实例
        let instance = new Constructor()
        // 将插槽内容传递给组件
        if (options.slots) {
            instance.$slots = options.slots
        }
        // 挂载时,编译组件,挂载到一个元素上
        instance.$mount()
        // 将编译后的组件挂载到 body 下
        document.body.appendChild(instance.$el)
        // 指令式调用时,添加 isFunctional 为 true 标识
        Object.assign(instance, options, { isFunctional: true })
        // 立即展示弹窗
        return instance.show()
    })
}
// 暴露使用方法
export default useDialogWrap

// 创建弹窗组件实例
// 继承选项插槽内容
// 编译,挂载弹窗到 body
// 合并组件选项
// 显示弹窗

 ps:关于全局使用插件,为了不让main.js的代码过于臃肿,选择了在这里进行使用。

 2.接着,来到plugins下的modules文件夹下,新建一个components.js文件,写入以下内容:

// 导入刚刚暴露出来的方法
import useDialogWrap from "@/components/DialogWrap/index.js"
// Vue.js 的插件应该暴露一个 install 方法。
export default {
    install(Vue) {
        useDialogWrap(Vue)
    }
}

 3.之后,在plugins下新建一个index.js文件,写入以下内容(只需要写一次,它对modules里面已有的所有自定义的插件都已经做了遍历):

import Vue from 'vue'

//  require.context返回modules文件夹下所有的文件对象,参考https://webpack.js.org/guides/dependency-management/#requirecontext
const modulesFiles = require.context('./modules', true, /\.js$/)
/*
*通过直接获取modules文件夹下的所有文件添加进入modules对象
*回调函数参数:
*modules:文件对象
*modulePath:文件路径
*/
modulesFiles.keys().reduce((modules, modulePath) => {
  // 获取文件名称
  const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')

  // 获取路径保存在modulePath文件内容
  const value = modulesFiles(modulePath)

  // 修改modules对象
  modules[moduleName] = value.default
  // 过全局方法 Vue.use() 使用插件。Vue.use 会自动阻止多次注册相同插件,届时即使多次调用也只会注册一次该插件。
  Vue.use(value.default)//它需要在你调用 new Vue() 启动应用之前完成

  return modules
}, {})

5.来到main.js里面,把刚刚用来遍历并使用插件的index.js导进来

import '@/plugins/index.js'

6.在页面中进行使用

this.$dialogwrap({
    // 传入组件透传属性
    attrs: that.$attrs,
    // 弹窗事件
    on: {
        click: () => that.clickTest(),
    },
    //插槽内容
    slots: {
        content: ' content 插槽组件',
    }, 
	// 弹窗标题
    title: "测试弹窗",
    // 弹窗表单数据
    data: {
        test: "测试数据",
    },
    // 弹窗表单配置项
    items:[]
}).then((comfirm) => {
    console.log("===dialogwrap=comfirm=", comfirm);
}).catch((cancel) => {
    console.log("===dialogwrap=cancel=", cancel);
});

至此,我们就已经完成了把组件变成插件化使用的所有操作步骤。 

三、使用这种方法的好处

1.减少代码量,提高可读性。

        将组件进行配置化,可以让代码量大大减少,也更容易定位各项内容。

2.提高可复用性和可维护性

        由于这样操作之后,代码块更加集中了,耦合度也降低了,更容易迁移,在需求发生变动的时候也更加方便在对应位置进行更改。

3.使用方便

        我们只需要对弹窗组件进行一些配置,不再需要牵一发而动全身,使用起来更加方便。

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

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

相关文章

C单片机数据类型与格式化

C语言数据类型 关键字位数表示范围stdint关键字ST关键字举例unsigned char80 ~ 255uint8_tu8u8 data 128char8-128 ~ 127int8_ts8s8 temperature 25unsigned short160 ~ 65535uint16_tu16u16 counter 5000short16-32768 ~ 32767int16_ts16s16 position 32767unsigned int3…

[Angular] 笔记 21:@ViewChild

chatgpt: 在 Angular 中,ViewChild 是一个装饰器,用于在组件类中获取对模板中子元素、指令或组件的引用。它允许你在组件类中访问模板中的特定元素,以便可以直接操作或与其交互。 例如,如果你在模板中有一个子组件或一个具有本地…

Autosar MCAL-RH850P1HC Dio配置

文章目录 DioDioGeneralDioCriticalSectionProtectionDioDevErrorDetectDioDeviceNameDioFlipChannelApiDioMaskedWritePortApiDioUseWriteVerifyErrorInterfaceDioVersionCheckExternalModulesDioVersionInfoApiDioWriteVerifyDioWriteVerifyErrorInterface DioPortP0-P9DioPo…

关于mysql8.0相关的升级

不知不觉,MySQL8.0已经有好多个GA小版本了。目前互联网上也有很多关于MySQL8.0的内容了,MySQL8.0版本基本已到稳定期,相信很多小伙伴已经在接触8.0了。本篇文章主要介绍从5.7升级到8.0版本的过程及注意事项,有想做版本升级的小伙伴…

技术探秘:在RISC Zero中验证FHE——RISC Zero应用的DevOps(2)

1. 引言 前序博客: 技术探秘:在RISC Zero中验证FHE——由隐藏到证明:FHE验证的ZK路径(1) 技术探秘:在RISC Zero中验证FHE——由隐藏到证明:FHE验证的ZK路径(1) 中&…

DDOS攻击原理,如何解读?

互联网安全现状 随着网络世界的高速发展,各行业数字化转型也在如火如荼的进行。但由于TCP/IP网络底层的安全性缺陷,钓鱼网站、木马程序、DDoS攻击等层出不穷的恶意攻击和高危漏洞正随时入侵企业的网络,如何保障网络安全成为网络建设中的刚性…

【JavaEE】多线程(7) -- 线程池的概念和简单实现

目录 1.线程池是什么 2.标准库中的线程池 2.1ThreadPoolExecutor 2.2构造方法参数介绍 2.3拒绝策略(面试易考) 2.4Executor的使用 3.实现线程池 1.线程池是什么 线程池是一种用来管理线程的机制,它可以有效地控制线程的创建、复用和销毁,从而提高程…

使用flutter开发windows桌面软件读取ACR22U设备的nfc卡片id,5分钟搞定demo

最近有个需求,要使用acr122u读卡器插入电脑usb口,然后读取nfc卡片的id,并和用户账号绑定,调研了很多方式,之前使用rust实现过一次,还有go实现过一次,然后使用electron的时候遇到安装pcsc-lite失…

2024年【危险化学品经营单位安全管理人员】复审考试及危险化学品经营单位安全管理人员模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员复审考试是安全生产模拟考试一点通总题库中生成的一套危险化学品经营单位安全管理人员模拟考试,安全生产模拟考试一点通上危险化学品经营单位安全管理人员作业手机同步练习…

c++ 简单实用万能异常捕获

多层捕获异常&#xff0c;逐渐严格。并打印出错信息和位置&#xff1a;哪个文件&#xff0c;哪个函数&#xff0c;具体哪一行代码。 #include <stdexcept> // 包含标准异常类的头文件try {int a 2 / 0; }catch (const std::runtime_error& e) {// 捕获 std::runt…

【Pytorch】学习记录分享10——PyTorchTextCNN用于文本分类处理

【Pytorch】学习记录分享10——PyTorchTextCNN用于文本分类处理 1. TextCNN用于文本分类2. 代码实现 1. TextCNN用于文本分类 具体流程&#xff1a; 2. 代码实现 # coding: UTF-8 import torch import torch.nn as nn import torch.nn.functional as F import numpy as np…

Spring高手之路-Spring AOP

目录 什么是AOP Spring AOP有如下概念 补充&#xff1a; AOP是如何实现的 Spring AOP 是通过代理模式实现的。 Spring AOP默认使用标准的JDK动态代理进行AOP代理。 什么是AOP AOP(Aspect-Oriented Programming)&#xff0c;即面向切面编程&#xff0c;用人话说就是把公共的…

php 8.4 xdebug扩展编译安装方法

最新版php8.4 xdebug扩展只能通过编译方式安装, pecl是安装不了的, 编译方法如下 下载最新版xdebug git clone https://github.com/xdebug/xdebug.git 却换入xdebug目录执行编译安装xdebug cd xdebug phpize./configure --enable-xdebugmakemake install3. 配置启用xdebug 这…

大语言模型(LLM)训练平台与工具

LLM 是利用深度学习和大数据训练的人工智能系统&#xff0c;专门 设计来理解、生成和回应自然语言。 大模型训练平台和工具提供了强大且灵活的基础设施&#xff0c;使得开发和训练复杂的语言模型变得可行且高效。 平台和工具提供了先进的算法、预训练模型和优化技术&#xff0c…

AI大模型:无需训练让LLM支持超长输入

显式搜索: 知识库外挂 paper: Unleashing Infinite-Length Input Capacity for Large-scale Language Models with Self-Controlled Memory System 看到最无敌的应用&#xff0c;文本和表格解析超厉害https://chatdoc.com/?viaurlainavpro.com ChatGPT代码实现: GitHub - ar…

攻防技术1-网络攻击(HCIP)

目录 一、网络攻击方式分类 1、被动攻击&#xff1a; 2、主动攻击&#xff1a; 3、中间人攻击&#xff1a; 二、网络攻击报文类型分类&#xff1a; 1、流量型攻击 2、单包攻击 三、流量型攻击防范技术 1、DNS Request Flood攻击 攻击原理 DNS交互过程 2、TCP类报文…

ros_ign_bridge:ros2与gazebo fortress的桥梁

如果你启动的gazebo是这样的图标&#xff1a; 那么你实际使用的是fortress版本&#xff0c;我一开始就安装了harmonic版本&#xff0c;但是实际启动的确是这个图标&#xff0c;所以实际使用的是fortress版本&#xff0c;这是因为ros2默认带这个fortress版本。这个时候你使用ros…

HarmonyOS4.0系统性深入开发09卡片使用动效能力

卡片使用动效能力 ArkTS卡片开放了使用动画效果的能力&#xff0c;支持显式动画、属性动画、组件内转场能力。需要注意的是&#xff0c;ArkTS卡片使用动画效果时具有以下限制&#xff1a; 名称参数说明限制描述duration动画播放时长限制最长的动效播放时长为1秒&#xff0c;当…

[Angular] 笔记 23:Renderer2 - ElementRef 的生产版本

chatgpt: Renderer2 简介 在 Angular 中&#xff0c;Renderer2 是一个服务&#xff0c;用于处理 DOM 操作的抽象层。它提供了一种安全的方式来操作 DOM&#xff0c;同时与平台无关&#xff0c;有助于维护应用程序的跨浏览器兼容性和安全性。 Renderer2 的作用是在 Angular 组…

智慧园区物联综合管理平台感知对象管理能力简述

物联感知对象管理, 不局限于物理传感设备, 还包括物联业务对象, 平台提供标准的设备建模能力以及标准的物联设备、 第三方物联系统SDK接入方案等; 实现对感知对象运行、 报警、 故障状态的反馈以及物联感知对象全生命周期信息管理。 基础定义配置 平台提供物联网目感知对…