Vue中如何使用自定义插件(plugin)

1、在根目录src下创建一个libs文件夹,在libs文件夹下面创建一个myPlugins文件夹,用来存放我们的自定义插件,在myPlugins文件夹下面再创建一个index.js的文件。在index.js文件里面,我们创建一个myPlguin的对象,然后导出,最后在main.js中导入并且通过 use() 的方式使用即可,一个自定义插件便完成了,就是这么简单,好了,感谢大家的阅读。其余的事情就是在myPlugins/index.js文件里填充我们插件的功能代码了。

2、在libs/myPlugins/index.js文件里创建myPlguin对象并导出,给myPlguin对象添加一个install的方法,install方法的第一个参数是Vue实例,第二个是我们的配置项 options

const myPlguin = {};myPlguin.install = function (Vue, options) {}export default myPlguin;

3、接下来就是在main.js文件里引入,并使用 Vue.use()方法使用。

// 导入并使用我们的自定义插件import myPLugin from './libs/myPlugin';Vue.use(myPLugin);

接下来我们聊聊插件里可以做那些事情,这部分才是重点。

1、在自定义插件里面定义我们的全局方法

// 自定义组件里面定义的全局方法Vue.myGlobalMethod = function () {  console.log('自定义组件里面定义的全局方法');}

然后我们在main.js文件中使用一下这个全局方法

// 导入并使用我们的自定义插件import myPLugin from './libs/myPlugin';Vue.use(myPLugin);// 使用自定义插件里面的全局方法Vue.myGlobalMethod();

结果如下图所示:2、在自定义插件里面定义我们的全局自定义指令、过滤器以及全局组件

// 自定义组件里面定义的全局自定义指令Vue.directive('my-directive', {  bind() {    console.log('自定义组件里面的自定义指令绑定成功');  }});

在组件中使用自定义指令

"shopList"></digui>

结果如下图所示:3、在自定义插件件里面加入全局混入

Vue.mixin({    // 注入到每个组件的 created 生命周期中  created() {    console.log("created in plugin")  },})

结果如图所示:4、在自定义插件件里面定义一些实例方法

Vue.prototype.$myMethod = function(){  console.log("自定义组件里面定义的实例方法");}

这样我们便可在项目中通过this的形式直接调用实例方法。我们在about页面的created生命周期中调用一下这个实例方法

created() {  this.$myMethod();},

结果如下图所示:

libs/myPlugin/index.js完整代码:

const myPlguin = {};

myPlguin.install = function (Vue, options) {  // 自定义组件里面定义的全局方法  Vue.myGlobalMethod = function () {    console.log('自定义组件里面定义的全局方法');  }  // 自定义组件里面定义的全局自定义指令  Vue.directive('my-directive', {    bind() {      console.log('自定义组件里面的自定义指令绑定成功');    }  });  // 也可以加入全局的过滤器、全局组件

  // 加入全局混入  Vue.mixin({    // 注入到每个组件的 created 生命周期中    created() {      console.log("created in plugin")    },  })

  // // 定义一些实例方法  Vue.prototype.$myMethod = function(){    console.log("自定义组件里面定义的实例方法");  }}

export default myPlguin;

那么我们在Vue项目中使用第三方插件时,就通过Vue.use()来挂载,如ElementUI,但是axios就不需要,这是为什么呢?因为axios没有install方法。

// 引入ElementUIimport ElementUI from 'element-ui';import 'element-ui/lib/theme-chalk/index.css';Vue.use(ElementUI);

看看源码

toArray 源码
export function toArray (list: any, start?: number): Array<any> {  start = start || 0  let i = list.length - start  const ret: Array = new Array(i)while (i--) {    ret[i] = list[i + start]  }return ret}
import { toArray } from '../util/index'

export function initUse (Vue: GlobalAPI) {  Vue.use = function (plugin: Function | Object) {    const installedPlugins = (this._installedPlugins || (this._installedPlugins = []))    if (installedPlugins.indexOf(plugin) > -1) {      return this    }

    // additional parameters    const args = toArray(arguments, 1)    args.unshift(this)    if (typeof plugin.install === 'function') {      plugin.install.apply(plugin, args)    } else if (typeof plugin === 'function') {      plugin.apply(null, args)    }    installedPlugins.push(plugin)    return this  }}

从源码中我们可以发现 vue 首先判断这个插件是否被注册过,不允许重复注册,并且接收的 plugin 参数的限制是 Function | Object 两种类型。对于这两种类型有不同的处理。首先将我们传入的参数整理成数组:const args = toArray(arguments, 1);再将 Vue 对象添加到这个数组的起始位置 args.unshift(this) ,这里的 this 指向 Vue 对象;如果我们传入的 plugin(Vue.use的第一个参数) 的 install 是一个方法。也就是说如果我们传入一个对象,对象中包含 install 方法,那么我们就调用这个 plugin 的 install 方法并将整理好的数组当成参数传入 install 方法中, plugin.install.apply(plugin, args);如果我们传入的 plugin 就是一个函数,那么我们就直接调用这个函数并将整理好的数组当成参数传入, plugin.apply(null, args);之后给这个插件添加至已经添加过的插件数组中,标示已经注册过installedPlugins.push(plugin);最后返回 Vue 对象。

通过以上分析我们可以知道,在我们以后编写插件的时候可以有两种方式。一种是将这个插件的逻辑封装成一个对象,最后将在 install 编写业务代码暴露给 Vue 对象。这样做的好处是可以添加任意参数在这个对象上方便将 install 函数封装得更加精简,可拓展性也比较高。还有一种则是将所有逻辑都编写成一个函数暴露给 Vue。其实两种方法原理都一样,无非第二种就是将这个插件直接当成 install 函数来处理。个人觉得第一种方式比较合理。

export const Plugin = {    install(Vue) {        Vue.component...        Vue.mixins...        Vue...        // 我们也可以在install里面执行其他函数,Vue会将this指向我们的插件        console.log(this)  // {install: ...,utils: ...}        this.utils(Vue)    // 执行utils函数        console.log(this.COUNT) // 0    },    utils(Vue) {        Vue...        console.log(Vue)  // Vue    },    COUNT: 0    }// 我们可以在这个对象上添加参数,最终Vue只会执行install方法,而其他方法可以作为封装install方法的辅助函数

const test = 'test'export function Plugin2(Vue) {    Vue...    console.log(test)  // 'test'    // 注意如果插件编写成函数形式,那么Vue只会把this指向null,并不会指向这个函数    console.log(this)  // null}// 这种方式我们只能在一个函数中编写插件逻辑,可封装性就不是那么强了

vue里面_Vue中如何使用自定义插件(plugin)相关推荐

  1. node怎么解析vue代码_vue中node_modules中第三方模块的修改使用详解

    最近用vue在做一个项目,github用上找了一个日历插件,intall到了本项目中,配好以后发现插件的样式风格和项目总体风格相差较大,所以就像这个改一下插件风格, 第一种方法:我直接在父组件中将st ...

  2. idea中的maven的插件Plugin中红线波浪 报错

    在建立模块时,我在一个模块下又新建了一个新的模块,但这并不是我的本意,所以我就先将其移出,再进行删除的操作,但是当我点开idea的右边的侧边栏是,发现那个被创建的新模块的模块的插件文件报错,其中少了4 ...

  3. Vue CLI3.0 中使用jQuery 和 Bootstrap

    Vue 中使用 jQuery 和 Bootstrap 不是特别符合 Vue 原生的写法,但是有时候又要用,所以放上我的引入设置,供大家参考. 在 Vue CLI2.0 中引入 jQuery 和 Boo ...

  4. 自定义插件解决MyBatis-Plus like查询遇_ % \等字符需转译问题(含分页查询)

    我们使用MyBatis-Plus执行LIKE模糊查询时,若预处理参数包含_ % \等字符(欢迎补充),会查询出所有结果,这不是我们需要的. 不论写法是自定义SQL xxx like concat('% ...

  5. vue自定义插件 封装一个类似 element 中 message 消息提示框的插件

    vue自定义插件 封装一个类似 element 中 message 消息提示框的插件 一.资源文档 1.vue内置组件 transition 2.Vue.use() 3.Vue.extend() 4. ...

  6. vue中 点击事件的写法_vue中的事件:原生事件与自定义事件__Vue.js

    模板编译 processAttrs 对于ast attributes处理(v-on/@) 利用onRE与dirRE来捕获事件 这里最重要的就是dynamic的判断,vue中可以用动态参数来命名事件名称 ...

  7. vue尚品汇商城项目-day07【vue插件-49.(了解)自定义插件】

    文章目录 49.(了解)自定义插件 本人其他相关文章链接 49.(了解)自定义插件 自定义插件好处: 功能:用于增强Vue 本质:包含install方法的一个对象,install的第一个参数是Vue, ...

  8. vue中的 vxe-table表格插件 实现树形数据表

    一个 PC 端表格组件,大数据表格 vue vxe-table表格 vue vxe-table表格 2022-01-20 11:51·前端开发 可以自定义选择引入的模块,减少项目的体积: 多主题,多图 ...

  9. Vue项目中如何引入Toast插件

    Vue项目中如何引入Toast插件 安装vue2-toast: npm install vue2-toast -S 在main.js中全局导入vue2-toast import 'vue2-toast ...

最新文章

  1. OpenGL ES3 0实现简单粒子火焰效果
  2. 【Python3爬虫】最新的12306爬虫
  3. java线程四种状态
  4. 高级SQL优化(三) 常用优化工具 ——《12年资深DBA教你Oracle开发与优化——性能优化部分》...
  5. 推荐两个非常实用的,Python装饰器
  6. CACTI 0.87e 安装
  7. 设计灵感|延展画面的插画Banner设计!
  8. 动态代理(2)----动态代理和AOP
  9. MPQ4420HGJ DCDC电源设计
  10. 华为机密照片!(转载)
  11. chatgpt为什么在中国不能用
  12. java数组查找奇数_java – 在数组中对偶数和奇数进行排序
  13. JAVA常用工具类-【5】FFMPEG转换、分割、合并音频
  14. 一篇流水账,纪念金庸大侠
  15. 栈的压入、弹出序列(Java)
  16. python画中秋月饼,用turtle海龟库画中秋月饼
  17. 钟景华:相关规范或明年发布,大型和超大型数据中心PUE小于1.3/WUE小于1.6
  18. 【强化学习论文合集】二十六.2020国际人工智能联合会议论文(IJCAI2020)
  19. 20221230今天的世界发生了什么
  20. 产品经理 MRD PRD BRD

热门文章

  1. Dorado用法与示例
  2. CVD和ALD薄膜沉积技术应用领域
  3. TensorFlow分布式(多GPU和多服务器)详解
  4. 深度树匹配模型(TDM)
  5. 双精度张量内核加快了高性能计算
  6. Fragment有直接关系的关键性类FragmentManager,FragmentTransaction,FragmentActivity
  7. CF803C Maximal GCD
  8. BZOJ4401 块的计数
  9. redis缓存和cookie实现Session共享
  10. 机器学习中的标量、向量、矩阵、和张量的概念