当前位置: 首页 > 科技观察

Vue.js插件开发详解

时间:2023-03-13 18:39:51 科技观察

随着Vue.js越来越流行,Vue.js的相关插件也在源源不断的贡献着,不计其数。比如官方推荐的vue-router、vuex等,都是非常优秀的插件。但是我们更多的人还停留在使用的阶段,自己开发的更少。那么接下来,我们就通过一个简单的vue-toast插件来了解和掌握插件的开发和使用。认识插件如果你想开发一个插件,你首先要知道一个插件是什么样子的。Vue.js的插件应该有一个公共方法install。该方法的第一个参数是Vue构造函数,第二个参数是一个可选的选项对象:MyPlugin.install=function(Vue,options){Vue.myGlobalMethod=function(){//1。添加全局方法或属性,如:vue-custom-element//logic...}Vue.directive('my-directive',{//2.添加全局资源:directive/filter/transition等,如asvue-touchbind(el,binding,vnode,oldVnode){//logic...}...})Vue.mixin({created:function(){//3.通过全局mixin方法添加一些组件选项,比如:vuex//逻辑...}...})Vue.prototype.$myMethod=function(options){//4.添加实例方法,通过在Vue.prototype中添加来实现//logic...}}Next要说的vue-toast插件是通过添加实例方法来实现的。我们先来看一个小例子。先新建一个js文件写插件:toast.js//toast.jsvarToast={};Toast.install=function(Vue,options){Vue.prototype.$msg='HelloWorld';}module.exports=吐司;在main.js中需要导入toast.js,通过全局方法Vue.use()使用插件://main.jsimportVuefrom'vue';importToastfrom'./toast.js';Vue.use(Toast);然后,我们在组件中获取插件定义的$msg属性。//App.vueexportdefault{mounted(){console.log(this.$msg);//HelloWorld}}可以看到控制台成功打印出了HelloWorld。现在可以获取$msg了,我们可以实现我们的vue-toast插件了。开发vue-toast需求:在组件中调用this.$toast('Networkrequestfailed')弹出提示,默认显示在底部。通过调用this.$toast.top()或this.$toast.center()等方法可以在不同的位置显示。整理一下思路,在弹出提示的时候,我可以在body中添加一个div来显示提示信息。我可以通过添加不同的类名来定位到不同的位置,然后就可以开始写了。//toast.jsvarToast={};Toast.install=function(Vue,options){Vue.prototype.$toast=(tips)=>{lettoastTpl=Vue.extend({//1.创建构造函数并定义它提示信息模板模板:''+tips+'

'});lettpl=newtoastTpl().$mount().$el;//2.创建一个实例并挂起上传到文件document.body.appendChild(tpl)之后的地方;//3,将创建的实例添加到bodysetTimeout(function(){//4,延迟2.5后去除提示秒document.body.removeChild(tpl);},2500)}}module.exports=Toast;看起来很简单,我们实现this.$toast(),然后显示不同的位置。//toast.js['bottom','center','top'].forEach(type=>{Vue.prototype.$toast[type]=(tips)=>{returnVue.prototype.$toast(tips,type)}})在这里,将类型传递给$toast,以在该方法中处理不同的位置。上面说了可以通过添加不同的类名(toast-bottom、toast-top、toast-center)来实现,那么$toast方法需要稍作修改。vue.prototype.$toast=(tips,type)=>{//添加类型参数lettoastTpl=Vue.extend({//template添加位置类template:''+tips+'
'});...}似乎快到了。但是如果我想默认显示在顶部,我必须每次都调用this.$toast.top()。似乎有点多余。我可以直接把this.$toast()放在我想要的地方吗?我也不希望它在2.5秒后消失?这时候注意到了Toast.install(Vue,options)中的options参数,我们可以通过Vue.use()中的options传入我们想要的参数。***修改插件如下:varToast={};Toast.install=function(Vue,options){letopt={defaultType:'bottom',//默认显示位置duration:'2500'//duration}for(letpropertyinoptions){opt[property]=options[property];//使用选项配置}Vue.prototype.$toast=(tips,type)=>{if(type){opt.defaultType=type;//如果有apass类型,position设置为该类型}if(document.getElementsByClassName('vue-toast').length){//如果toast还在,不再执行return;}lettoastTpl=Vue.extend({template:''+tips+'
'});lettpl=newtoastTpl().$mount().$el;document.body.appendChild(tpl);setTimeout(function(){document.body.removeChild(tpl);},opt.duration)}['bottom','center','top'].forEach(type=>{Vue.prototype.$toast[type]=(tips)=>{returnVue.prototype.$toast(tips,type)}})}module.exports=Toast;这样就实现了一个简单的vue插件,可以通过npm打包发布,下次可以使用npminstall安装。源码地址:vue-toast【本文为专栏作者“林欣”原创稿件,转载请微信联系作者♂获得授权】点此查看作者更多好文