vue2.x 插件的开发

2023-11-18

前言

第一次好好学习插件的开发,有什么不正确的地方麻烦指正。另外写这篇文章,纯粹是当作自己的学习笔记。

插件

  • 插件通常用来为 Vue 添加全局功能。插件的功能范围没有严格的限制——一般有下面几种:
  • 添加全局方法或者 property。如:vue-custom-element
  • 添加全局资源:指令/过滤器/过渡等。如 vue-touch
  • 通过全局混入来添加一些组件选项。如 vue-router
  • 添加 Vue 实例方法,通过把它们添加到 Vue.prototype 上实现。
  • 一个库,提供自己的 API,同时提供上面提到的一个或多个功能。如 vue-router

vue官方文档链接

推荐插件实例:element UI ,源码下载地址

开发插件

1、添加实例方法

目录结构
在这里插入图片描述
yc.js

export default class {
  /**
   * 获取文件名后缀
   */
  getFileExt(path) {
    let ext = path.substr(path.lastIndexOf(".") + 1);
    return ext.toLocaleLowerCase();
  }

  /**
   * 是否是图片
   */
  isImage(path) {
    let ext = this.getFileExt(path);
    return ["bmp", "jpg", "gif", "jpeg", "png", "tif"].includes(ext);
  }

  /**
   * 是否是word
   */
  isWord(path) {
    let ext = this.getFileExt(path);
    return ["doc", "docx"].includes(ext);
  }

  /**
   * 是否是execl
   */
  isExcel(path) {
    let ext = this.getFileExt(path);
    return ["xls", "xlsx"].includes(ext);
  }

  /**
   * 去除后面无用的逗号
   */
  removeLastComma(str) {
    let newStr = str.replaceAll(",", ",");
    let l = newStr.length - 1;
    if (newStr.charAt(l) == ",") {
      this.removeLastComma(newStr.substr(0, l));
    } else {
      return newStr;
    }
  }
}

index.js

import Tool from "./js/yc";

export default {
  tool: new Tool(),
};

main.js
vue3.0和2.0有些区别,vue2.0可以通过Vue.prototype.的方式挂载一些方法。3.0中需要使用app.config.globalProperties 来挂载方法。

//我的自定义工具方法
import MyTool from "../src/tool/index";

const app = createApp(App);
//先
app.config.globalProperties.$myTool = MyTool; 
//后
app
  .use(store)
  .use(router)
  .use(ElementPlus)
  .mount("#app");

注:要先挂载实例方法,之后在挂载app应用

2、组件

目录结构
在这里插入图片描述
参考的element里的目录结构和实现方式

text-color 下的main.vue

<template>
  <div>
    <el-button type="primary" @click="changeColor('red')">红色</el-button>
    <el-button type="primary" @click="changeColor('blue')">蓝色</el-button>
    <el-button type="primary" @click="changeColor('black')">重置</el-button>
    <div class="textarea" :style="{ color: textColor }">
      <slot name="default"></slot>
    </div>
  </div>
</template>

<script>
import { ref } from "vue";
export default {
  name: "text-color",
  setup() {
    //文字颜色
    let textColor = ref("black");
    //改变文字颜色
    let changeColor = (color) => {
      textColor.value = color;
    };
    return {
      textColor,
      changeColor,
    };
  },
};
</script>

<style scoped lang="scss">
.textarea {
  margin: 40px;
  width: 200px;
  height: 100px;
  padding: 10px;
  text-align: center;
  border: 1px solid #409eff;
  border-radius: 10px;
}
</style>

text-color 下的index.js

import TextColor from "./src/main.vue";

TextColor.install = function (Vue) {
  Vue.component(TextColor.name, TextColor);
};

export default TextColor;

components下的index.js

import TextColor from "./text-color";

const components = [TextColor];

const install = function (Vue, opts = {}) {
  components.forEach((component) => {
    Vue.component(component.name, component);
  });
};

export default {
  install,
};

项目的main.js

import { createApp } from "vue";
import App from "./App.vue";
import { router } from "./router";
import store from "./store";
import ElementPlus from "element-plus";
import "element-plus/lib/theme-chalk/index.css";

import MyApp from '../src/components/index'

createApp(App).use(store).use(router).use(ElementPlus).use(MyApp).mount("#app");

主要看MyApp这个就好

使用

<template>
    <div>
      <text-color>
          哈哈哈
      </text-color>
    </div>
</template>

<script>


export default {
    setup(){}
};
</script>

<style scoped lang="scss">

</style>

效果

在这里插入图片描述

3、指令

关于指令的一些内容:vue自定义指令(2.0)

该实例是vue3.0语法,与2.0语法有不少区别

目录结构

在这里插入图片描述

add-sign下的 main.js

let value = (el, binding) => {
  if (binding.modifiers.before && binding.modifiers.after) {
    el.innerHTML = `<span style="color:red;">不允许同时使用两个修饰符</span>`;
    return false;
  }
  if (binding.modifiers.before) {
    el.innerHTML = `
     <span style="color:red;">${binding.value}</span> ${el.innerHTML}
    `;
  }
  if (binding.modifiers.after) {
    el.innerHTML = `
    ${el.innerHTML} <span style="color:red;">${binding.value}</span> 
    `;
  }
};
export default {
  name: "add-sign",
  mounted: value,
  updated: value,
};

add-sign下的index.js

import addSign from "./src/main";

addSign.install=function(Vue){
    Vue.directive(addSign.name,addSign)
}

export default addSign;

directives下的index.js

import addSign from "./add-sign/index";

const directives = [addSign];

const install = function (Vue, opts = {}) {
  directives.forEach((directive) => {
    Vue.directive(directive.name, directive);
  });
};

export default {
  install,
};

项目的main.js

//我的自定义指令
import MyDirective from '../src/directives/index';

createApp(App).use(store).use(router).use(ElementPlus).use(MyComponent).use(MyDirective).mount("#app");

使用

<template>
  <div v-add-sign.before="sign">姓名</div>
</template>

<script>
import { ref } from "vue";
export default {
  setup() {
    let sign = ref("*");
    return {
      sign,
    };
  },
};
</script>

<style scoped lang="scss">
</style>

效果
在这里插入图片描述

备注

1、在components和directives目录下单独写一个index.js文件是作为所有组件(指令的入口文件),这样在项目的main.js里导入这个文件就好,这样不会显的特别乱

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue2.x 插件的开发 的相关文章

  • 使用 vscode 调试器调试 next.js

    我已经使用安装了一个项目创建下一个应用程序 https github com segmentio create next app 我需要使用我的编辑器 vscode 调试服务器端渲染 所以我访问过vscode recipes 如何调试 ne
  • 如何测试 javascript 闭包内的函数

    这似乎是不可能的 也可能是 但我正在尝试更多的 TDD 但我总是在闭包方面碰壁 假设我有以下内容 function createSomething init function privateMethod param return init
  • React js Stripe 结账不起作用

    我正在尝试在 React js 应用程序中呈现条带结账默认表单
  • 使用 useReducers 调度函数发送多个操作?

    使用时是否可以通过调度函数发送多个动作useReducer挂钩反应 我尝试向它传递一组操作 但这会引发未处理的运行时异常 明确地说 通常会有一个初始状态对象和一个减速器 如下所示 const initialState message1 nu
  • 我想检查 $('#td1').text() === "x" 是否?

    我想检查innerHtml是否有X或O 所以我不能再次添加任何其他东西 但它不起作用 添加检查代码后它就停止了 我在这里尝试做一个简单的XO游戏来更熟悉javascript和jquery 我也不确定是否可以用 jQuery 做到这一点
  • 使用 JavaScript 使链接保持活动状态并在单击时显示悬停效果

    I am struggling to make this work I d like to make it where if O F is clicked the hover state stays active if another li
  • 检查 JavaScript 字符串是否为 URL

    JavaScript 有没有办法检查字符串是否是 URL 正则表达式被排除在外 因为 URL 很可能是这样写的stackoverflow 也就是说它可能没有 com www or http 如果你想检查一个字符串是否是有效的 HTTP UR
  • 如何监听 jQuery AJAX 请求?

    以下两种实现 ajaxRequest 1 2 的方法应该是等效的 话说回来 为什么验证回调已执行的单元测试 3 在 1 中成功而在 2 中失败 我应该如何重写测试 3 来监视 2 中的成功回调 如果我尝试stub jQuery ajax使用
  • 从未用 @flow 标记的导入文件中获取类型定义

    TL DR我怎么告诉flow从未声明的导入模块导入类型定义 flow 加长版 流接缝能够从不使用流语法的文件中派生类型 请参阅示例 示例文件 flow js if Math random lt 0 5 var y hello else va
  • 在requestAnimationFrame中使用clearRect不显示动画

    我正在尝试在 HTML5 画布上做一个简单的 javascript 动画 现在我的画布是分层的 这样当我收到鼠标事件时 背景层不会改变 但带有头像的顶层会移动 如果我使用 requestAnimationFrame 并且不清除屏幕 我会看到
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • Meteor - 从客户端取消服务器方法

    我正在通过服务器方法执行数据库计数 用户可以选择他们希望如何执行计数 然后调用该方法 我的问题是 计数可能需要一些时间 并且用户可能会在方法运行时改变主意并请求不同的计数 有什么方法可以取消调用的方法并运行新的计数吗 我认为 this un
  • 如何在类似控制台的环境中运行 JavaScript?

    我正在尝试遵循这里的示例 http eloquentjavascript net chapter2 html http eloquentjavascript net chapter2 html and print blah 在浏览器中运行时
  • 有没有办法阻止 prettier / prettier-now 将函数参数分解为新行

    当使用 prettier prettier now 在保存时进行格式化时 当一个函数包装另一个函数时 它会中断到一个新行 我想知道是否有办法阻止这种行为 例如 期望的输出 app get campgrounds id catchAsync
  • 在 vue.js 中访问数组对象属性

    给定以下数组vue js packageMaps Object packageMap 0 Object Id 16 PackageType flag list ProductCode F BannerBase packageMap 1 Ob
  • 条件在反应本机生产中失败,但在开发中有效

    我创建了一个反应本机应用程序 我需要通过它进行比较 如果属实 就会执行死刑 问题是 该条件适用于 React Native 开发模式 而不适用于 React Native 生产版本 我使用 firebase 作为数据库 也使用 redux
  • Safari 支持 JavaScript window.onerror 吗?

    我有一个附加到 window onerror 的函数 window onerror function errorMsg url line window alert asdf 这在 firefox chrome 和 IE 中工作正常 但在 s
  • 如何仅在最后一个
  • 处给出透明六边形角度?
  • 我必须制作这样的菜单 替代文本 http shup com Shup 330421 1104422739 My Desktop png http shup com Shup 330421 1104422739 My Desktop png
  • 如何在 pg-promise 中设置模式

    我正在搜索的文档pg 承诺 https github com vitaly t pg promise特别是在创建客户端时 但我无法找到设置连接中使用的默认架构的选项 它始终使用public架构 我该如何设置 通常 为数据库或角色设置默认架构
  • fullCalendar 未显示正确的结束日期

    我正在看调试页面 http jsbin com wukofacaxu edit js outputFullCalendar 官方网站的 我想安排一个活动时间为 22 09 2015 至 30 09 2015 dd mm yyyy 但它只显示

随机推荐

  • antdv表格的rowSelection设置单选禁用选中等

    这个问题在项目中已经遇到过两次了 一次为表格想实现单选 禁用等 另一次则是今天 遇上需求需要在初始化表格的时候默认选中项目 鉴于自己的记性太差 记录记录 万一哪天又遇到这个问题心血来潮来翻了一翻博客 那问题就解决了 犹记得实现表格项单选和禁
  • 决策树(信息熵、增益率、基尼指数)

    目录 前言 一 决策树是什么 二 实验过程 1 选择数据集中各个决策属性的优先级 1 1信息熵 1 2增益率 1 3基尼指数 2 决策树的构造 2 1创建决策树 2 2准备数据 2 3 读取和保存决策树 2 4绘制决策树 3运行结果 3 1
  • 升级Linux中的默认JDK的版本

    我用的Linux是 红帽企业级Linux AS版 TLF SOFT Redhat Enterprise Linux AS V4 0 UPDATE 7 DVD 因工作需要 将Linux中默认安装的Jdk 版本为1 4 进行升级 将升级的经验和
  • BigDecimal的常用方法

    一 BigDecimal概述 Java在java math包中提供的API类BigDecimal 用来对超过16位有效位的数进行精确的运算 双精度浮点型变量double可以处理16位有效数 但在实际应用中 可能需要对更大或者更小的数进行运算
  • Python学习笔记(基础篇)

    目录 一 Python编程基础 1 1print 1 2 input 1 3 ASC 码 1 4注释 二 数据类型与基本运算符 2 1变量 2 2数值类型 整数 浮点数 复数 2 3字符串 2 4布尔类型 2 5数据类型转换 2 6算数运算
  • 【mysql】mysql group by分组后取每组的最小值

    方法一 非严格模式下 group by后 会取分组后多个create time 的其中一个 由于我们的 create time 时间是有序的 会取第一条 如果是无序字段 很可能取的顺序会有问题 可以在create time 前面加上grou
  • 苹果系统 macOS Mojave 10.14.4上安装 Ubuntu 18.04 双系统

    macOS Mojave 10 14 4 安装Ubuntu 18 04 双系统 0 准备工作 系统情况 1 制作Ubuntu安装盘 U盘 2 硬盘分区 3 安装Ubuntu 4 正常使用GRUB 5 调整Ubuntu设置 2019 07 1
  • Tomcat开启远程调试端口

    部署环境 Linux 亲测成功 tomcat7 bin startup sh的文件开头位置添加 declare x CATALINA OPTS server Xdebug Xnoagent Djava compiler NONE Xrunj
  • JavaWeb JDBC

    1 实现第一个JDBC程序 在MySQL中创建一个名称为jdbc的数据库 然后在该数据库中创建一个users表 创建 数据库和表的SQL语句如下所示 CREATE DATABASE jdbc USE jdbc CREATE TABLE us
  • html前后端缓存,前后端分离系列-缓存篇

    1 我们需要在静态文件返回给浏览器的时候header中的缓存变长 这样就可以在本地秒加载 省去了带宽和加载时间 修改server js const path require path const Koa require koa const
  • 内存泄露原因和解决方案

    资料参考出自 http blog chinaunix net uid 26930580 id 3844811 html http www jianshu com p 90caf813682d 为什么会产生内存泄漏 当一个对象已经不需要再使用
  • 基于Matlab应用DBSCAN

    基于Matlab应用DBSCAN Density Based Spatial Clustering of Applications with Noise 具有噪声的基于密度的聚类方法 一 算法原理 Matlab中的统计与机器学习工具箱 Th
  • SuperSocket实战手把手教程:一个完整的SocketServer项目

    SuperSocket系列教程 1 SuperSocket基础 一 基本概念 2 SuperSocket实战手把手教程 一个完整的SocketServer项目 目录 一 项目场景 1 Visual Studio新建项目 2 自定义自己服务器
  • pre loader简单分析

    ZZ from http blog csdn net ly601579033 article details 48318239 大致的流程图如下 上电后RESET ARM核开始执行Boot ROM 具体操作有 代码固化在ROM中 1 初始化
  • 【软件硬件】相机标定(Camera calibration)原理、步骤

    转载来源 https blog csdn net lql0716 article details 71973318 locationNum 8 fps 1 在图像测量过程以及机器视觉应用中 为确定空间物体表面某点的三维几何位置与其在图像中对
  • 使用OpenGL实现的光线追踪器示例

    使用OpenGL实现的光线追踪器示例 光线追踪是一种计算机图形学中常用的方法 它可以模拟光线在三维空间中的传播和反射 在本文中 我们将介绍如何使用OpenGL实现一个简单的光线追踪器 在本例中 我们将创建一个场景 其中包含一个球体和一个平面
  • flutter a .dex file cannot exceed 64K

    第一步 添加multidex 第二部 添加multiDexEnabled 构建运行完事
  • 获取下拉菜单值

    function getSelectVal ele var selectedIndex ele selectedIndex var value ele options selectedIndex value return value
  • oracle生成编号(首字母+YYYY-DD-MM+4位序号)自动增长,4位序号达到9999,在从1001开始。

    今天写业务的时候遇见需要系统生成13位的编号 规则编号按一个大写字母 YYYY MM DD 4位序号组成 数据库用的oracle 所以就打算用序列实现 下面是实现方式 1 先创建序列 create sequence contact seq
  • vue2.x 插件的开发

    前言 第一次好好学习插件的开发 有什么不正确的地方麻烦指正 另外写这篇文章 纯粹是当作自己的学习笔记 插件 插件通常用来为 Vue 添加全局功能 插件的功能范围没有严格的限制 一般有下面几种 添加全局方法或者 property 如 vue