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

试着撸一个插件,有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:

<template>
<transition name="fade">
<div class="v-msg" v-show="isShow">
<span>{{message}}</span>
</div>
</transition>
</template> <script>
export default { data(){
return {
message: '默认提示',
isShow : false
}
},
methods:{
close(){
this.isShow = false
},
show(){
this.isShow = true
}
}
}
</script> <style>
.v-msg{
color:#fff;display: inline-block;background-color:rgba(0,0,0,0.8);padding:10px;
border-radius: 4px;
position: fixed;left:50%;bottom:10px;transform: translateX(-50%)
}
.fade-enter-active, .fade-leave-active { transition: all .2s; }
.fade-enter, .fade-leave-to { opacity: 0; }
</style>

dialog.vue:

<template>
<transition name="fade">
<div v-show="isShow">
<div class="dialog_mask" v-show="mask" @click="close"></div>
<div class="dialog">
<div class="title" v-show="title">{{title}}</div>
<div class="message">{{message}}</div>
<div class="btgroup">
<button class="button" @click="close" v-if="cancle">取消</button>
<button class="button sure" @click="cb();close()">确定</button>
</div>
</div>
</div>
</transition>
</template> <script>
export default {
props:{ },
data(){
return {
title:'',
message:'默认内容消息',
isShow : false,
mask:true,
cancle:false
}
},
methods:{
close(){
this.isShow = false;
}
}
}
</script> <style lang="less" scoped> .dialog_mask{
position: fixed;top:0;right:0;bottom: 0;left: 0;background-color:rgba(0,0,0,0.8);
z-index: 100000;
}
.dialog{
min-width:90vw;max-width:90vw;color:#333;display: inline-block;background-color: #fff;overflow: hidden;
position: fixed;left:50%;top:50%;transform: translate(-50%,-50%);z-index:100001;border-radius:5px;
.title{
font-size:16px;padding:20px 0px 0px;text-align: center;
}
.message{
color:#999;font-size:16px;padding:25px;
}
.btgroup{
display:flex;align-items: center;justify-content: space-between;border-top:1px solid #eee;
}
.button{
font-size:16px;flex:1;padding:14px 0px;border:none;background-color: #fff;
&.sure{color:#293}
&:active{background-color: #eee;}
&:nth-child(2){border-left:1px solid #eee;}
}
}
.fade-enter-active, .fade-leave-active { transition: all .2s; }
.fade-enter, .fade-leave-to { opacity: 0; } </style>

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,但本实践没有把回调方法也放进同一个参数中
    而是为了代码清晰,另起一个连续调用的方法来处理

vue插件开发实践与要点的更多相关文章

  1. Vue项目实践中的功能实现与要点

    本贴记录项目实践中,各种功能的实现与技术要点,均有待改进. 路由切换的时候,显示loading动画 目前方案是: 在每个页面都手动装载一个loading组件组件的显示依赖vuex里面的一个值 , 在r ...

  2. Vue插件开发入门

    相对组件来说,Vue 的插件开发受到的关注要少一点.但是插件的功能是十分强大的,能够完成许多 Vue 框架本身不具备的功能. 大家一般习惯直接调用现成的插件,比如官方推荐的 vue-router.vu ...

  3. 一个简单的 vue.js 实践教程

    https://segmentfault.com/a/1190000006776243?utm_source=tuicool&utm_medium=referral 感觉需要改善的地方有: ( ...

  4. 【转】vue项目重构技术要点和总结

    vue数据更新, 视图未更新 这个问题我们经常会遇到,一般是vue数据赋值的时候,vue数据变化了,但是视图没有更新.这个不算是项目重构的技术要点,也和大家分享一下vue2.0通常的解决方案吧! 解决 ...

  5. prerender-spa-plugin预处理vue项目实践

    由于公司想要把商城做由之前的php和前端混合开发改版为前后端分离,所以拿现在手上的vue项目来实践一下 https://github.com/chrisvfritz/prerender-spa-plu ...

  6. vue+webpack实践

    最近使用了vue来做SPA应用,记一波学习笔记. 使用vue+webpack实现前端模块化. vuejs——轻量.学习成本低.双向绑定.无dom的操作.组件的形式编写 推荐官方文档 vue.js官方文 ...

  7. webpack + vue最佳实践

    webpack + vue最佳实践 我的原文地址:http://www.xiaoniuzai.cn/2016/10/04/webpack%20+%20vue%E6%9C%80%E4%BD%B3%E5% ...

  8. vue初学实践之路——vue简单日历组件(1)

    ---恢复内容开始--- 最近做的项目有一个需求,需要有一个日历组件供预定功能使用,之前的代码过于繁琐复杂,所以我采用vue重写了这个组件. npm.vue等等安装. 只是一个简单的日历组件,所以并不 ...

  9. Vue keep-alive实践总结

    <keep-alive>是Vue的内置组件,能在组件切换过程中将状态保留在内存中,防止重复渲染DOM. <keep-alive> 包裹动态组件时,会缓存不活动的组件实例,而不是 ...

随机推荐

  1. FieldGroup绑定ItemDataSource

    FieldGroup可以直接绑定一个数据源DataSource.但如果想绑定某个值,并没有直接作为数据库中的一个字段存在.而是最后转为json串保存在数据库中.这样的话相当于key-value模式的D ...

  2. Centos7安装Zabbix4.0步骤

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 Centos7安装Zabbix4.0步骤 官方搭建zabbix4.0的环境要求: 1. 环境搭建L ...

  3. 沉迷Link-Cut tree无法自拔之:[BZOJ3514] Codechef MARCH14 GERALD07 加强版

    来自蒟蒻 \(Hero \_of \_Someone\) 的 \(LCT\) 学习笔记 $ $ 又是一道骚题...... 先讲一个结论: 假设我们用 \(LCT\) 来做这道题, 在插入边 \(i\) ...

  4. 【BZOJ2003】[HNOI2010]矩阵(搜索)

    [BZOJ2003][HNOI2010]矩阵(搜索) 题面 懒得粘了,不难找吧. 题解 看的学长写的题解,也懒得写了 大概是这样的. 不难发现只需要确定第一行和第一列就能确定答案,而确定第一行之后每确 ...

  5. 洛谷 P4137 Rmq Problem /mex 解题报告

    P4137 Rmq Problem /mex 题意 给一个长为\(n(\le 10^5)\)的数列\(\{a\}\),有\(m(\le 10^5)\)个询问,每次询问区间的\(mex\) 可以莫队然后 ...

  6. IPython Notebook 运行python Spark程序

    1.安装pip 因为centos7.0自带的python系统是2.7.5,并没有安装pip,需要先安装pip $ wget https://bootstrap.pypa.io/get-pip.py $ ...

  7. 收藏:FLASH中键检测与右键屏蔽

    原文:http://space.flash8.net/space/?591172/viewspace-708726.html <!DOCTYPE html PUBLIC "-//W3C ...

  8. 导入gradle项目

    1.1 代码下载 将代码下载到本机具体位置: 根据svn地址用外部svn工具导入项目到本地一个目录 比如 d:/a 1.2 导入工程 1.2.1 导入gradle工具 1.2.2 选择代码路径 1.2 ...

  9. 织梦DedeCMS信息发布员发布文章阅读权限不用审核自动开放亲测试通过!

    文章发布员在织梦dedecms后台添加文章时却要超级管理员审核,这无疑是增加了没必要的工作. 登录该账号发布文章你会发现该文章显示的是待审核稿件,且并没有生成静态文件,在前台是看不到这篇文章的,而多数 ...

  10. wagger的展示路径修改

    转:https://www.jianshu.com/p/ce7e247515f5?utm_source=oschina-app 注:本文是基于springboot配置实现,但在实际中使用springm ...