vue 开发插件 一

vue 插件开发,官网简单说了一下,需要暴露一个install 方法,这个是固定,然后就是在调用的时候
通过全局方法 Vue.use() 使用插件。它需要在你调用 new Vue() ,这个大概就是vue官网提供的。
现在的目的是基于以上,我们开发一个vue的插件,
实现目标 (弹框提示)

  • 提示内容自定义html的标签插入
  • 提示内容纯文本
  • 点击按钮 关闭弹框
  • 点击按钮 支持回调方法
  • 支持内容 左、右、居中对齐
  • 添加class 样式名
  • 按钮名称自定义
  • 弹框提示名称自定义标题

分析一下,这个弹框插件,分为两大块
一个是结构、布局的html代码用vue的组建编写
一个对外提供install 插件是逻辑编写也就是交互吧

搭建框架跑流程

先把框架搭建起来,基于webpack基础打包开发的,如果没看的希望去看一下《webpack 之vue 初级打包
在src目录下新建component 存放弹框的内容组件
alert/index.vue

<template>
  <div>
      {{message}}
  </div>
</template>
<script>
export default {
  name:'Alert',
  props:{
    message:{
      type:String,
      default:'弹框内容测试!'
    }
  }
}
</script>

vue组件框架搭建好,用来展示弹框内容,后续完善
接着
在src录下建一个目录plugins 新建插件js dialog.js
写入基本代码,暴露一个install 方法 然后用官网提供的Vue.mixin({}) // 3. 注入组件选项 去实现
把组件放关系到插件里面

import Alert  from '../component/alert/index.vue'; // 引入组建
let $alert = null;
export default {
  install (Vue,props = { visible: false }){
    const AlertComponent = Vue.extend(Alert); //构造器创建子类
    $alert = new AlertComponent({
      el: document.createElement('div'),
      propsData: {
        ...props
      }
    });
    document.body.appendChild($alert.$el);
    Vue.mixin({
      created() {
      },
      methods: {
        $alert() {
            console.log('插件搭建');
        }
      },
    });
  }
}

编写 app.vue 调用插件页面

<template>
  <div class="single"  @click="tFn()">{{msg}}</div>
</template>
<script>
export default {
  name:'app',
  data() {
    return {
      msg:'木子聊前端'
    }
  },
  methods: {
    tFn (){
      // 插件可以直接this 调用
      this.$alert();
    }
  },
}
</script>
<style lang='less'>
  .single{
    color: red;
    font-size: 30px;
  }
</style>

期待到结果是,点击‘ 木子聊前端’ 在控制台输出 插件内容
编写 main.js, 目录结构和上一篇《webpack 之vue 初级打包》 保持一致

import Vue from 'vue';
import App from './App.vue';
import alert from './plugins/dialog.js';
Vue.use(alert);
new Vue({
  el: '#app',
  template: '<App/>',
  components: { App }
})

运行一下

npm run dev

打包成功
在浏览器打开index.html 检查一下组件到内容是否现实在页面上
如图表示框架搭建好了。插件也基本了解完了。
在这里插入图片描述
如果只想了解插件到组成和开发流程到这里就结束。接下来完善交互

完善弹框组件

弹框布局和样式

布局需求:1. 弹框标题,内容,按钮
2:背景,弹框上下左右居中
完善 alert/index.vue template 模版结构,定义好calss名称

<template>
  <div class="mask mask-dialog">
    <div class="dialog">
      <div class="dialog-title"></div>
      <div class="dialog-content">{{message}}</div>
      <div class="dialog-btn"><button class="primary">确定</button></div>
    </div>  
  </div>
</template>

在搭建框架到时候只是定义了message,其他地方按钮和标题也要定义,后面接着完善,这一步先把布局弄起来,
样式部分 继续
完善 alert/index.vue 在底部添加less css预处理样式

<style lang='less'>
.mask{
    position:fixed;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    z-index: 2000;
    background: rgba(0,0,0,.4);
}
.mask-dialog {
    z-index: 2100;
    display: flex;
    justify-content: center;
    align-items: center;
    overflow: hidden
}
.dialog {
    width: 320px;
    padding-top:20px;
    text-align: center;
    background: #fff;
    border-radius: 12px;
    .dialog-title {
        padding: 0 4px 18px;
        font-size: 24px;
        line-height: 33px;
    }
  .dialog-content {
    padding: 0 20px 20px;
  }
  .dialog-btn{
     display: flex;
     border-top: 1px solid rgba(0,0,0,.1);
    button {
        display: block;
        font-size: 24px;
        line-height: 64px;
        background: 0 0;
        border: none;
        flex: 1;
       &.primary{
         font-weight: 700;
         color: #cca663
      }
    }
  }
}  
</style>

由于没有热部署,现在需要 手动 npm run dev 看效果
在这里插入图片描述
看上去已经不错的布局和样式,上下左右都居中了,背景也已经出现。

完善组件的js和参数处理

vue中通过 Prop 向子组件传递数据,父级通过属性传递给子组件,子组件通过prop 接受属性并处理,这样就可以动态获取标题,内容,和按钮,从而实现自定义
期望点击‘确定’按钮,关闭弹框,从而实现关闭的时候回调其他方法。
vue 提供一个内建机制$emit 方法,传递给父级一个监听事件。即可实现关闭和回调的相关方法,剩下的就放到父级,交给插件处理
完善alert/index.vue js 部分,template 模版可以依据js 填充

<script>
export default {
  name:'Alert',
  props:{
    message:{
      type:String,
      default:''
    },
    title:{
      type:String,
      default:''
    },
    useHtml:{
      type:Boolean,
      default:false
    },
    button:{
      type:String,
      default:'确定'
    },
    visible:{
      type:Boolean,
      default:false
    },
    // 内容 对齐方式
    align: {
      type: String,
      default: 'center'
    },
    // 动态添加class
    cusClass:{
      type: String,
      default:''
    }
  },
  computed: {
    styleA(){
       return `text-align:${this.align}`;
    }
  },
  methods: {
    onButCk (e){
      this.$emit('but-click',e);
    }
  },
}
</script>

至此,弹框组件全部完成。
篇幅太长,下一篇继续完善插件编写,从而实现弹框交互的完整
vue 开发插件二

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值