vue里面_Vue中如何使用自定义插件(plugin)
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)相关推荐
- node怎么解析vue代码_vue中node_modules中第三方模块的修改使用详解
最近用vue在做一个项目,github用上找了一个日历插件,intall到了本项目中,配好以后发现插件的样式风格和项目总体风格相差较大,所以就像这个改一下插件风格, 第一种方法:我直接在父组件中将st ...
- idea中的maven的插件Plugin中红线波浪 报错
在建立模块时,我在一个模块下又新建了一个新的模块,但这并不是我的本意,所以我就先将其移出,再进行删除的操作,但是当我点开idea的右边的侧边栏是,发现那个被创建的新模块的模块的插件文件报错,其中少了4 ...
- Vue CLI3.0 中使用jQuery 和 Bootstrap
Vue 中使用 jQuery 和 Bootstrap 不是特别符合 Vue 原生的写法,但是有时候又要用,所以放上我的引入设置,供大家参考. 在 Vue CLI2.0 中引入 jQuery 和 Boo ...
- 自定义插件解决MyBatis-Plus like查询遇_ % \等字符需转译问题(含分页查询)
我们使用MyBatis-Plus执行LIKE模糊查询时,若预处理参数包含_ % \等字符(欢迎补充),会查询出所有结果,这不是我们需要的. 不论写法是自定义SQL xxx like concat('% ...
- vue自定义插件 封装一个类似 element 中 message 消息提示框的插件
vue自定义插件 封装一个类似 element 中 message 消息提示框的插件 一.资源文档 1.vue内置组件 transition 2.Vue.use() 3.Vue.extend() 4. ...
- vue中 点击事件的写法_vue中的事件:原生事件与自定义事件__Vue.js
模板编译 processAttrs 对于ast attributes处理(v-on/@) 利用onRE与dirRE来捕获事件 这里最重要的就是dynamic的判断,vue中可以用动态参数来命名事件名称 ...
- vue尚品汇商城项目-day07【vue插件-49.(了解)自定义插件】
文章目录 49.(了解)自定义插件 本人其他相关文章链接 49.(了解)自定义插件 自定义插件好处: 功能:用于增强Vue 本质:包含install方法的一个对象,install的第一个参数是Vue, ...
- vue中的 vxe-table表格插件 实现树形数据表
一个 PC 端表格组件,大数据表格 vue vxe-table表格 vue vxe-table表格 2022-01-20 11:51·前端开发 可以自定义选择引入的模块,减少项目的体积: 多主题,多图 ...
- Vue项目中如何引入Toast插件
Vue项目中如何引入Toast插件 安装vue2-toast: npm install vue2-toast -S 在main.js中全局导入vue2-toast import 'vue2-toast ...
最新文章
- OpenGL ES3 0实现简单粒子火焰效果
- 【Python3爬虫】最新的12306爬虫
- java线程四种状态
- 高级SQL优化(三) 常用优化工具 ——《12年资深DBA教你Oracle开发与优化——性能优化部分》...
- 推荐两个非常实用的,Python装饰器
- CACTI 0.87e 安装
- 设计灵感|延展画面的插画Banner设计!
- 动态代理(2)----动态代理和AOP
- MPQ4420HGJ DCDC电源设计
- 华为机密照片!(转载)
- chatgpt为什么在中国不能用
- java数组查找奇数_java – 在数组中对偶数和奇数进行排序
- JAVA常用工具类-【5】FFMPEG转换、分割、合并音频
- 一篇流水账,纪念金庸大侠
- 栈的压入、弹出序列(Java)
- python画中秋月饼,用turtle海龟库画中秋月饼
- 钟景华:相关规范或明年发布,大型和超大型数据中心PUE小于1.3/WUE小于1.6
- 【强化学习论文合集】二十六.2020国际人工智能联合会议论文(IJCAI2020)
- 20221230今天的世界发生了什么
- 产品经理 MRD PRD BRD