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

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

网上找了个toast插件的代码,改了改,扩展加了个dialog,增加了注释

插件文件结构

在入口文件中注册:

  1. /* 自定义插件 */
  2. import {Message,vDialog} from './components/vtoast/index'
  3. Vue.use(Message).use(vDialog)

调用方式

  1. methods:{
  2. showtoast(){
  3. this.$vtoast({
  4. duration:1100,
  5. message:'哈哈哈'
  6. });
  7. },
  8. showdialog(){
  9. let that = this
  10. this.$vdialog.alert({
  11. isShow: true,
  12. //插件默认值title为空,如果这里不放title,则不会显示title的dom
  13. title:'你好',
  14. message:'哈哈哈',
  15. })
  16. .then(()=>{
  17. that.test = '修改了'
  18. })
  19. }
  20. },

toast.vue:

  1. <template>
  2. <transition name="fade">
  3. <div class="v-msg" v-show="isShow">
  4. <span>{{message}}</span>
  5. </div>
  6. </transition>
  7. </template>
  8.  
  9. <script>
  10. export default {
  11.  
  12. data(){
  13. return {
  14. message: '默认提示',
  15. isShow : false
  16. }
  17. },
  18. methods:{
  19. close(){
  20. this.isShow = false
  21. },
  22. show(){
  23. this.isShow = true
  24. }
  25. }
  26. }
  27. </script>
  28.  
  29. <style>
  30. .v-msg{
  31. color:#fff;display: inline-block;background-color:rgba(0,0,0,0.8);padding:10px;
  32. border-radius: 4px;
  33. position: fixed;left:50%;bottom:10px;transform: translateX(-50%)
  34. }
  35. .fade-enter-active, .fade-leave-active { transition: all .2s; }
  36. .fade-enter, .fade-leave-to { opacity: 0; }
  37. </style>

dialog.vue:

  1. <template>
  2. <transition name="fade">
  3. <div v-show="isShow">
  4. <div class="dialog_mask" v-show="mask" @click="close"></div>
  5. <div class="dialog">
  6. <div class="title" v-show="title">{{title}}</div>
  7. <div class="message">{{message}}</div>
  8. <div class="btgroup">
  9. <button class="button" @click="close" v-if="cancle">取消</button>
  10. <button class="button sure" @click="cb();close()">确定</button>
  11. </div>
  12. </div>
  13. </div>
  14. </transition>
  15. </template>
  16.  
  17. <script>
  18. export default {
  19. props:{
  20.  
  21. },
  22. data(){
  23. return {
  24. title:'',
  25. message:'默认内容消息',
  26. isShow : false,
  27. mask:true,
  28. cancle:false
  29. }
  30. },
  31. methods:{
  32. close(){
  33. this.isShow = false;
  34. }
  35. }
  36. }
  37. </script>
  38.  
  39. <style lang="less" scoped>
  40.  
  41. .dialog_mask{
  42. position: fixed;top:0;right:0;bottom: 0;left: 0;background-color:rgba(0,0,0,0.8);
  43. z-index: 100000;
  44. }
  45. .dialog{
  46. min-width:90vw;max-width:90vw;color:#333;display: inline-block;background-color: #fff;overflow: hidden;
  47. position: fixed;left:50%;top:50%;transform: translate(-50%,-50%);z-index:100001;border-radius:5px;
  48. .title{
  49. font-size:16px;padding:20px 0px 0px;text-align: center;
  50. }
  51. .message{
  52. color:#999;font-size:16px;padding:25px;
  53. }
  54. .btgroup{
  55. display:flex;align-items: center;justify-content: space-between;border-top:1px solid #eee;
  56. }
  57. .button{
  58. font-size:16px;flex:1;padding:14px 0px;border:none;background-color: #fff;
  59. &.sure{color:#293}
  60. &:active{background-color: #eee;}
  61. &:nth-child(2){border-left:1px solid #eee;}
  62. }
  63. }
  64. .fade-enter-active, .fade-leave-active { transition: all .2s; }
  65. .fade-enter, .fade-leave-to { opacity: 0; }
  66.  
  67. </style>

index.js

  1. //插件的install会放入vue.use方法中运行,本文件中不用import vue
  2.  
  3. // TOAST插件
  4. import mytoast from './toast.vue'
  5. const Message = {}
  6. Message.install = function (Vue, options) {
  7. //返回一个vue实例构造器
  8. const VUECONSTRUCTOR = Vue.extend(mytoast)
  9. let _VUEINSTANCE
  10. const initInstance = () => {
  11. //实例化vue示例 下面可以直接调用methods里面的方法
  12. _VUEINSTANCE = new VUECONSTRUCTOR()
  13. // 取得经过vue里面折腾之后生成的html
  14. let El = _VUEINSTANCE.$mount().$el
  15. //挂载到body中
  16. document.body.appendChild(El)
  17. }
  18. Vue.prototype.$vtoast = (options)=>{
  19. //单例模式,防止重复挂载html
  20. if (!_VUEINSTANCE) {
  21. initInstance()//创建实例
  22. }
  23. //将调用的参数对象传给_VUEINSTANCE对象,覆盖组件内的初始配置
  24. // 官方:https://cn.vuejs.org/v2/guide/list.html#对象更改检测注意事项
  25. Object.assign(_VUEINSTANCE, options)
  26.  
  27. //调用插件里的显示方式
  28. _VUEINSTANCE.show()
  29. // 注意,如果是自动消失的toast 每闪调用(显示),都要再次聊友
  30. // 不要使用实例里面的方法,因为插件只挂载一次,dom便存于html中
  31. // 所以,这里的vue插件实例生命周期只生效一次(created,mounted)
  32. setTimeout(() => {
  33. _VUEINSTANCE.close()
  34. }, options.duration)
  35. }
  36. }
  37.  
  38. // DIALOG插件
  39. import myDialog from './dialog.vue'
  40. const vDialog = {}
  41. vDialog.install = function (Vue, options) {
  42. const VUECONSTRUCTOR = Vue.extend(myDialog)
  43. let _VUEINSTANCE
  44. const initInstance = () => {
  45. _VUEINSTANCE = new VUECONSTRUCTOR()
  46. let El = _VUEINSTANCE.$mount().$el
  47. document.body.appendChild(El)
  48. }
  49. //这里最好用对象封装方法的模式,调用时代码好阅读一些
  50. Vue.prototype.$vdialog = {
  51. alert(options) {
  52. if (!_VUEINSTANCE) {
  53. initInstance()
  54. }
  55. //默认显示显示确定按钮,所以回调给一个默认空函数
  56. Object.assign(_VUEINSTANCE, options,{cb:()=>{}})
  57. //以便连续调用
  58. return this
  59. },
  60. then(options){
  61. //如果不调用then只显示确定按钮
  62. //这里的回调函数名cb,必需和插件里面所调用的一样
  63. Object.assign(_VUEINSTANCE, {cancle:true,cb:options})
  64. }
  65. }
  66. }
  67.  
  68. 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. Python的数据类型和运算

    一.Python数据类型 变量所指向的值是有自己独特的数据类型的,这些数据类型可能代表不同的数据,在Python中,主要有以下几种数据类型: 整形(int) 在计算机中,整数的位数其实是有范围的,并没 ...

  2. asp.net 连接SQL Server 数据库并进行相关操作

    asp.net 连接数据库,操作数据库主要需要两个类,一个是SqlConnection,一个是SqlCommand SqlConnection用于连接数据库,打开数据库,关闭数据库. 连接数据库需要特 ...

  3. BZOJ4569 SCOI2016萌萌哒(倍增+并查集)

    一个显然的暴力是用并查集记录哪些位之间是相等的.但是这样需要连nm条边,而实际上至多只有n条边是有用的,冗余过多. 于是考虑优化.使用类似st表的东西,f[i][j]表示i~i+2^j-1与f[i][ ...

  4. python构建bp神经网络_曲线拟合(一个隐藏层)__1.可视化数据

    1.将数据写入csv文件,应该可以python代码直接实现数据集的写入,但我对文件读取这块不太熟练,等我成功了再加上,这里我直接手写将数据集写入Excel 2.然后把后缀改成.csv就可以了,利用pa ...

  5. 自学Zabbix3.12-动作Action

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix3.12-动作Action介绍 1. 动作action 在配置好监控项和触发器之后 ...

  6. 【Luogu4723】线性递推(常系数齐次线性递推)

    [Luogu4723]线性递推(常系数齐次线性递推) 题面 洛谷 题解 板子题QwQ,注意多项式除法那里每个多项式的系数,调了一天. #include<iostream> #include ...

  7. [luogu5002]专心OI - 找祖先

    [传送门] 我们还是先将一下算法的步骤,待会再解释起来方便一点. 算法步骤 首先我们算出每个子树的\(size\). 我们就设当前访问的节点 然后我们就得到了当前这个节点的答案是这个树整个的\(siz ...

  8. 一种使用emwin库函数导致hardfault的情况

    @2018-08-27 使用函数 WM_SendMessageNoPara(hWin_MainTask, WM_INIT_DIALOG),调试至此处进入hardfault,经查是由于hWin_Main ...

  9. Java NIO -- 直接缓冲区与非直接缓冲区

    直接缓冲区与非直接缓冲区: 非直接缓冲区:通过 allocate() 方法分配缓冲区,将缓冲区建立在 JVM 的内存中直接缓冲区:通过 allocateDirect() 方法分配直接缓冲区,将缓冲区建 ...

  10. P1382 楼房 set用法小结

    这个sb题目,剧毒... STL大法好 首先,我准备用经典的线段树优化扫描线来做.之前的矩形周长把我困了数天导致我胸有成竹. 然后,敲代码半小时,调试半个月......这个,sb,怎么改都是0分+2个 ...