博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
vue插件开发实践与要点
阅读量:6313 次
发布时间:2019-06-22

本文共 3306 字,大约阅读时间需要 11 分钟。

其实就跟组件差不多意思,组件也可以实现相关的效果,但要在用到的地方都引用

插件就可以全局注册,不需引用

试着撸一个插件,有2个功能,提示和对话框

网上找了个toast插件的代码,改了改,扩展加了个dialog模态对话框,写了行内注释

插件文件结构

在入口文件中注册:

/* 自定义插件 */import {Message,vDialog} from './components/vtoast/index'Vue.use(Message).use(vDialog)复制代码

调用方式

methods:{        showtoast(){            this.$vtoast({                duration:1100,                message:'哈哈哈'            });        },        showdialog(){            let that  = this            this.$vdialog.alert({                isShow: true,                //插件默认值title为空,如果这里不放title,则不会显示title的dom                title:'你好',                message:'哈哈哈',            })            .then(()=>{                that.test = '修改了'            })        }    },复制代码

toast.vue:

复制代码

dialog.vue:

复制代码

index.js

//插件的install会放入vue.use方法中运行,本文件中不用import vue// TOAST插件import mytoast from './toast.vue'const Message = {}Message.install = function (Vue, options) {    //返回一个vue实例构造器    const VUECONSTRUCTOR = Vue.extend(mytoast)    let _VUEINSTANCE     const initInstance = () => {        //实例化vue示例 下面可以直接调用methods里面的方法        _VUEINSTANCE = new VUECONSTRUCTOR()        // 取得经过vue里面折腾之后生成的html        let El = _VUEINSTANCE.$mount().$el            //挂载到body中        document.body.appendChild(El)     }    Vue.prototype.$vtoast = (options)=>{            //单例模式,防止重复挂载html            if (!_VUEINSTANCE) {                initInstance()//创建实例            }            //将调用的参数对象传给_VUEINSTANCE对象,覆盖组件内的初始配置            // 官方:https://cn.vuejs.org/v2/guide/list.html#对象更改检测注意事项            Object.assign(_VUEINSTANCE, options)             //调用插件里的显示方式            _VUEINSTANCE.show()            // 注意,如果是自动消失的toast 每闪调用(显示),都要再次聊友            // 不要使用实例里面的方法,因为插件只挂载一次,dom便存于html中            // 所以,这里的vue插件实例生命周期只生效一次(created,mounted)            setTimeout(() => {                _VUEINSTANCE.close()            }, options.duration)    }}// DIALOG插件import myDialog from './dialog.vue'const vDialog = {}vDialog.install = function (Vue, options) {    const VUECONSTRUCTOR = Vue.extend(myDialog)    let _VUEINSTANCE     const initInstance = () => {        _VUEINSTANCE = new VUECONSTRUCTOR()        let El = _VUEINSTANCE.$mount().$el        document.body.appendChild(El)    }    //这里最好用对象封装方法的模式,调用时代码好阅读一些    Vue.prototype.$vdialog = {        alert(options) {            if (!_VUEINSTANCE) {                initInstance()            }            //默认显示显示确定按钮,所以回调给一个默认空函数            Object.assign(_VUEINSTANCE, options,{
cb:()=>{}}) //以便连续调用 return this }, then(options){ //如果不调用then只显示确定按钮 //这里的回调函数名cb,必需和插件里面所调用的一样 Object.assign(_VUEINSTANCE, {
cancle:true,cb:options}) } }}export {Message,vDialog}复制代码

总结相关要点:

  • 绑定多个事件使用 @click="cb();close()"
  • Object.assign(_VUEINSTANCE, options) ,把调用时的参数(包括值,方法)合并进基于vue构造器创建的插件实例中
    vue会自动把参数放到对应的地方,数据放data,方法放methods,但本实践没有把回调方法也放进同一个参数中
    而是为了代码清晰,另起一个连续调用的方法来处理

转载地址:http://nbexa.baihongyu.com/

你可能感兴趣的文章
华为畅玩5 (CUN-AL00) 刷入第三方twrp Recovery 及 root
查看>>
LeetCode----67. Add Binary(java)
查看>>
母版页 MasterPage
查看>>
[转] ReactNative Animated动画详解
查看>>
DNS原理及其解析过程
查看>>
记录自写AFNetWorking封装类
查看>>
没想到cnblog也有月经贴,其实C#值不值钱不重要。
查看>>
【转】LUA内存分析
查看>>
springboot使用schedule定时任务
查看>>
[转] Entity Framework Query Samples for PostgreSQL
查看>>
XDUOJ 1115
查看>>
PHP学习(四)---PHP与数据库MySql
查看>>
模版方法模式--实现的capp流程创建与管理
查看>>
软件需求分析的重要性
查看>>
eclipse的scala环境搭建
查看>>
UVA465:Overflow
查看>>
HTML5-placeholder属性
查看>>
Android选择本地图片过大程序停止的经历
查看>>
poj 2187:Beauty Contest(旋转卡壳)
查看>>
《Flask Web开发》里的坑
查看>>