简单编写一个 vue 插件, 当点击时触发 notify 插件, dom 中出现相应内容并且在相应时间之后清除, 我们可以在根组件中设定通知内容和延迟消失时间.
1. 基础知识
我们首先初始化一个 vue 项目, 删除不需要的组件和样式, 主要针对 src 下一些初始化资源, 有过 vue 项目基础的应该很容易理解, 如果没有 vue 基础建议先熟悉每个初始化文件的作用.
关于 vue 中如何开发插件可以直接看 vue 官方文档, 简单了解插件开发过程, vue 插件文档 https://cn.vuejs.org/v2/guide/plugins.html .
现在我们在 src 目录下新建一个 plugin 文件夹, 里面存放要开发的插件 notify.JS
- // notify.JS
- let notify = { // 需要在此对象拥有一个 install 方法
- };
- notify.install = function () {
- alert('tangj')
- }
- // 导出这个对象, 如果使用 Vue.use() 就会自动调用 install 方法
- export default notify;
然后在 main 函数导入这个模块并使用
- import notify from './plugin/notify.js'
- Vue.use(notify)
运行这个 vue 项目可以看到, 页面开始加载有一个弹出框, 说明我们创建的插件调用成功
2. notify.JS 主要功能
上面我们知道了, Vue.use() 会自动调用 install 方法, install 第一个参数为 Vue 构造函数, 第二个参数即为输入的内容, 默认 undefined, 所以我们在调用一开始的时候为 Vue 这个构造函数的原型上添加一个 $notify 方法, 此后, 每一个 Vue 的实例都能调用这个方法, 这样我们就可以通过给根组件绑定一个点击事件, 让 $notify 执行.
当然这样还是不够的, 回到开头说的, 根组件可以设定通知内容和通知延迟时间, 相当于给 this.$notify 传递两个参数, 第一个是通知内容, 第二个是延迟时间.
因此, 原型上的 notify 函数还得接受两个参数, 当有通知内容把通知内容替代, 有延迟时间把延迟时间替代, 为了插件的完整性, 记得要给参数设定默认值.
总结一下业务逻辑: 点击页面需要出现一个通知内容, 经过延迟时间后消失, 所以我们可以导入一个模块, 并把这个模块挂载到页面上, 经过相应的延迟时间后移除
- import modal from './notify.vue'
- let notify = { // 需要在此对象拥有一个 install 方法
- };
- notify.install = function (Vue,options={delay:3000}) {
- Vue.prototype.$notify = function (message,opt={}) {
- options = {...options,...opt}; // 用自己调用插件时传递过来的属性覆盖默认设置的值
- let v = Vue.extend(modal); // 返回的是一个构造函数的子类, 参数是包含组件选项的对象
- let vm = new v;
- let oDiv = document.createElement('div'); // 创建一个 div 将实例挂载到元素上
- vm.$mount(oDiv);
- vm.value = message;
- document.body.appendChild(vm.$el);
- setTimeout(()=>{ // 根据 delay 将 dom 元素移除
- document.body.removeChild(vm.$el);
- },options.delay)
- }
- }
- // 导出这个对象, 如果使用 Vue.use() 就会自动调用 install 方法
- export default notify;
3. 完善 notify.JS
现在还有一个问题, 我们不断点击的时候, 会通知很多个组件, 这显然不符合预期
解决的办法很简单, 我们只要在执行之前判断是否已经存在了这个实例, 如果存在直接返回不再继续, 如果不存在, 那么执行往后的逻辑
- notify.install = function (Vue,options={delay:3000}) {
- Vue.prototype.$notify = function (message,opt={}) {
- if(notify.el)return;// 判断 dom 上是否存在这个实例
- options = {...options,...opt};
- let v = Vue.extend(modal);
- let vm = new v;
- let oDiv = document.createElement('div');
- vm.$mount(oDiv);
- vm.value = message;
- document.body.appendChild(vm.$el);
- notify.el = vm.$el; // 把实例给 notify 对象
- setTimeout(()=>{
- document.body.removeChild(vm.$el);
- notify.el = null; // 清空这个对象
- },options.delay)
- }
- }
最后
这是很简单的一个 vue 插件写法, 我们可以用这种思维创造很多有用的插件, 比如 vue-router,vue-awesome-swiper 等等, 很大程度上提高了开发效率...
来源: https://www.cnblogs.com/youma/p/10617207.html