Vue如何使用混合Mixins和插件开发详解


Posted in Javascript onFebruary 05, 2020
官网:混合 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式。混合对象可以包含任意组件选项。以组件使用混合对象时,所有混合对象的选项将被混入该组件本身的选项。
个人:混入就是用来对vue组件中的公共部分,包括数据对象、钩子函数、方法等所有选项,进行提取封装,以达到代码的复用,混合用处挺大的,然我们来看看实际用法。

基础用法

// 这是在main.js根文件中使用,在组中使用也是一样
import Vue from 'vue';
var mixin = {
  data() {
    return {
      name: 'www.vipbic.com',
      author: '羊先生'
    }
  },
  created: function() {
    console.log('Website:' + this.name)
  },
  methods: {
    foo: function() {
      console.log('作者:' + this.author)
    },
    conflicting: function() {
      console.log('from mixin')
    }
  }
}

new Vue({
  mixins: [mixin],
  render: h => h(App),
  created() {
    let option = this.$options.doNotInit
    console.log('option:', );
    this.foo()
  }
}).$mount('#app')

// 在组建中使用
<template><div></div></template>
<script>
var mixin = {
  data() {
    return {
      name: 'www.vipbic.com',
      author: '羊先生'
    }
  },
  created: function() {
    console.log('Website:' + this.name)
  },
  methods: {
    foo: function() {
      console.log('作者:' + this.author)
    }
  }
}
export default {
  mixins: [mixin],
  created(){
    this.foo()
  }
}
</script>

效果如下,都一样,可以看出混合mixins中的created高于组件created执行优先级

Vue如何使用混合Mixins和插件开发详解

全局注册

main.js中直接注册

import Vue from 'vue';
var mixin = {
  data() {
    return {
      name: 'www.vipbic.com',
      author: '羊先生'
    }
  },
  created: function() {
    console.log('Website:' + this.name)
  },
  methods: {
    foo: function() {
      console.log('作者:' + this.author)
    }
  }
}

Vue.mixin(mixin)
new Vue({
  render: h => h(App)
}).$mount('#app')

效果如下,我们先不调用,看看控制台是否有打印结果,可以发现我们并未调用,就打印了两次,按照大家常规考虑可能会想到执行一次,是正常的,即初始化一次,但却执行了两次

Vue如何使用混合Mixins和插件开发详解

如何解决执行两次

我在网上看到都是这么做的,都说是从官网上看到的,但是我在官网上并没有看到,不过的确能解决问题

var mixin = {
  data() {
    return {
      name: 'www.vipbic.com',
      author: '羊先生'
    }
  },
  created: function() {
    let option = this.$options.doNotInit;
    console.log(option) // 第一次执行 true 第二次为 undefined
    if (!option) {
    // 可以放置一些你的逻辑,比如一开始就要调用的方法
      console.log('Website:' + this.name)
    }
  },
  methods: {
    foo: function() {
      console.log('作者:' + this.author)
    },
  }
}

Vue.mixin(mixin);
new Vue({
  doNotInit: true, // 添加一个状态
  render: h => h(App),
}).$mount('#app')

效果如下

Vue如何使用混合Mixins和插件开发详解

如何调用

刚上面解释了如何解决调用两次的问题

// main.js
import Vue from 'vue';
var mixin = {
  data() {
    return {
      name: 'www.vipbic.com',
      author: '羊先生'
    }
  },
  created: function() {
    let option = this.$options.doNotInit;
    if (!option) {
      console.log('Website:' + this.name)
    }
  },
  methods: {
    foo: function() {
      console.log('作者:' + this.author)
    },
  }
}

Vue.mixin(mixin);
new Vue({
  doNotInit: true,
  render: h => h(App),
}).$mount('#app')

// 在组件中调用
<script>
export default {
  created(){
    this.foo()
  },
}
</script>

Vue如何使用混合Mixins和插件开发详解

模块化注册

新建单独的mixin.js文件

import Vue from 'vue';
var mixin = {
  data() {
    return {
      name: 'www.vipbic.com',
      author: '羊先生'
    }
  },
  created: function() {
    let option = this.$options.doNotInit;
    if (!option) {
      console.log('Website:' + this.name)
    }
  },
  methods: {
    foo: function() {
      console.log('作者:' + this.author)
    },
    conflicting: function() {
      console.log('from mixin')
    }
  }
}
export default {
  install(Vue) {
    Vue.mixin(mixin)
  }
}
// 在main.js通过use注册
Vue.use(myMixin);
new Vue({
  doNotInit: true,
  render: h => h(App),
}).$mount('#app')
// 在组件中调用
<script>
export default {
  created(){
    this.foo()
  },
}
</script>

效果与main.js注册方式一样

Vue如何使用混合Mixins和插件开发详解

开发插件

上面提到use,也讲解一下use相关的知识,而且在开发中也常常看到如Vue.use(VueRouter),Vue.js 在插件开发过程中需要注意是有一个公开方法 install 。这个方法的第一个参数是 Vue 构造器 , 第二个参数是一个可选的选项对象,
插件通常会为Vue添加全局功能。插件的范围没有限制——一般有下面几种:

1、添加全局方法或者属性,如: vue-element]
2、添加全局资源:指令/过滤器/过渡等,如 vue-touch
3、通过全局 mixin方法添加一些组件选项,如: vuex
4、添加 Vue 实例方法,通过把它们添加到 Vue.prototype 上实现。
5、一个库,提供自己的 API,同时提供上面提到的一个或多个功能,如 vue-router

let MyPlugin = {}
MyPlugin.install = function (Vue, options) {
 // 1. 添加全局方法或属性
  Vue.prototype.$myMethod = function (options) {
  // 逻辑...
 }

 // 2. 添加全局资源指令
 Vue.directive('my-directive', {
  bind (el, binding, vnode, oldVnode) {
   // 逻辑...
  }
 })

 // 3. 注入组件,也就上面提到的混入,vue非常灵活就看你如何去挖掘它
 Vue.mixin({
  created: function () {
   // 逻辑...
  }
 })
}

添加全局方法或属性

import Vue from 'vue';
//根据install函数规定,第一个传入Vue的实例,第二个参数是一个可选的选项对象,也就是可以传递参数
MyPlugin.install = function(Vue, options) {
  console.log(options) // 打印参数
  Vue.prototype.myName = options.name
  Vue.prototype.myAuthor = function() {
    return options.author
  }
}
Vue.use(MyPlugin, {
  name: 'www.vipbic.com' // 传递参数
  author: '羊先生'
});

new Vue({
  render: h => h(App),
}).$mount('#app')

在组件中调用

<script>
export default {
  created(){
    console.log(this.myName)
    console.log(this.myAuthor())
  },
}
</script>

效果如下

Vue如何使用混合Mixins和插件开发详解

添加全局资源

// 通过vue指令的方式添加 指令可以全局添加还可以在组件中添加
import Vue from 'vue';
let MyPlugin = {}
MyPlugin.install = function(Vue, options) {
  Vue.directive("hello", {
    bind: function(el, bingind, vnode) {
      console.log(options)
      el.style["color"] = bingind.value;
      console.log("1-bind");
    },
    inserted: function() {
      console.log("2-insert");
    },
    update: function() {
      console.log("3-update");
    },
    componentUpdated: function() {
      console.log('4 - componentUpdated');
    },
    unbind: function() {
      console.log('5 - unbind');
    }
  })
}
// 传递参数
Vue.use(MyPlugin, {
  name: 'www.vipbic.com',
  author: '羊先生'
});
new Vue({
  render: h => h(App),
}).$mount('#app')

在组中使用

<template>
  <div>
  <span v-hello="color3">{{message}}</span>
    <button @click="add"> 点击开始加1</button>
    <button @click="jiebang">解绑</button>
  </div>
</template>
<script>
export default {
  data(){
    return {
      message:10,
      color3:"red"
    }
  },
  methods:{
    add(){
      this.message++;
    },
    jiebang(){
      this.$destroy(); // 解绑 
    }
  },
}
</script>
<style lang="less" scoped>

</style>

页面效果

Vue如何使用混合Mixins和插件开发详解

分析结果,在分析结果前,我们先来看一下Vue.directive的api,来自官网的解释

el:指令所绑定的元素,可以用来直接操作DOM
binding:一个对象,包含以下属性

  • name:指令名,不包含v-前缀
  • value:指令的绑定值,例如:上面例子中的值就是 red
  • oldValue:指令绑定的前一个值,仅在 update 和componentUpdated 钩子中可用。无论值是否改变都可用
  • expression:字符串形式的指令表达式

arg:传给指令的参数,可选。
modifiers:一个包含修饰符的对象

自定义指令有5个生命周期(也叫作钩子函数)分别是:

bind, inserted, update, componentUpdate, unbind

// 也就是在对应上面的例子中的
bind 只调用一次,指令第一次绑定到元素时候调用,用这个钩子可以定义一个绑定时执行一次的初始化动作。

inserted:被绑定的元素插入父节点的时候调用(父节点存在即可调用,不必存在document中)

update: 被绑定与元素所在模板更新时调用,而且无论绑定值是否有变化,通过比较更新前后的绑定值,忽略不必要的模板更新

componentUpdate :被绑定的元素所在模板完成一次更新更新周期的时候调用

unbind: 只调用一次,指令月元素解绑的时候调用图片黄色框的地方,是在组件使用了v-hello指令后所初始化的数据,并且也打印了接受参数,在点击解绑后,在点击开始加1则无效

注入组件

let MyPlugin = {}
MyPlugin.install = function(Vue, options) {
  Vue.mixin({
    data() {
      return {
        name: options.name
      }
    },
    methods: {
      getUser() {
        return options.author
      }
    }
  })
}
Vue.use(MyPlugin, {
  name: 'www.vipbic.com',
  author: '羊先生'
})
new Vue({
  render: h => h(App),
}).$mount('#app')

在组件中使用

export default {
  data(){
    return {
       
    }
  },
  created(){
   //这里name和getUser来自全局注入的
    console.log(this.name)
    console.log(this.getUser())
  }
}

效果

Vue如何使用混合Mixins和插件开发详解

Vue.use 会自动阻止注册相同插件多次,届时只会注册一次该插件

参考文章

web前端开发-混合
Vue.directive指令

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript eval函数深入认识
Feb 21 Javascript
jsp+javascript打造级连菜单的实例代码
Jun 14 Javascript
jQuery搜索同辈元素方法
Feb 10 Javascript
jQuery简单实现隐藏以及显示特效
Feb 26 Javascript
jQuery动画效果相关方法实例分析
Dec 31 Javascript
Node.js与MySQL交互操作及其注意事项
Oct 05 Javascript
深入理解JavaScript 参数按值传递
May 24 Javascript
基于iScroll实现下拉刷新和上滑加载效果
Jul 18 Javascript
JS实现非首屏图片延迟加载的示例
Jan 06 Javascript
Vue Element 分组+多选+可搜索Select选择器实现示例
Jul 23 Javascript
浅谈Vue.js路由管理器 Vue Router
Aug 16 Javascript
关于微信小程序map组件z-index的层级问题分析
Jul 09 Javascript
JS原型和原型链原理与用法实例详解
Feb 05 #Javascript
js实现视图和数据双向绑定的方法分析
Feb 05 #Javascript
小程序如何写动态标签的实现方法
Feb 05 #Javascript
vue如何实现动态加载脚本
Feb 05 #Javascript
vue实现图片懒加载的方法分析
Feb 05 #Javascript
Vue组件基础用法详解
Feb 05 #Javascript
vue组件传值的实现方式小结【三种方式】
Feb 05 #Javascript
You might like
论建造顺序的重要性
2020/03/04 星际争霸
PHP 实现多服务器共享 SESSION 数据
2009/08/15 PHP
php 无法加载mysql的module的时候的配置的解决方案引发的思考
2012/01/27 PHP
PHP之生成GIF动画的实现方法
2013/06/07 PHP
淘宝ip地址查询类分享(利用淘宝ip库)
2014/01/07 PHP
php生成静态html页面的方法(2种方法)
2015/09/14 PHP
微信公众平台开发-微信服务器IP接口实例(含源码)
2017/03/05 PHP
JavaScript学习笔记(十)
2010/01/17 Javascript
基于jquery的一个拖拽到指定区域内的效果
2011/09/21 Javascript
js取float型小数点后两位数的方法
2014/01/18 Javascript
学习JavaScript设计模式(接口)
2015/11/26 Javascript
JS比较两个数值的大小实例
2016/11/25 Javascript
基于jquery二维码生成插件qrcode
2017/01/07 Javascript
vue2.x+webpack快速搭建前端项目框架详解
2017/11/30 Javascript
vue动态绑定class的几种常用方式小结
2019/05/21 Javascript
解析JS在获取当前月的最后一天遇到的坑
2019/08/30 Javascript
基于jquery ajax的多文件上传进度条过程解析
2019/09/11 jQuery
JS+CSS实现3D切割轮播图
2020/03/21 Javascript
[58:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第一场 1月31日
2021/03/11 DOTA
介绍Python中的文档测试模块
2015/04/28 Python
Django中数据库的数据关系:一对一,一对多,多对多
2018/10/21 Python
Python XlsxWriter模块Chart类用法实例分析
2019/03/11 Python
python实现高斯投影正反算方式
2020/01/17 Python
Python爬虫之Selenium警告框(弹窗)处理
2020/12/04 Python
CSS3动画之利用requestAnimationFrame触发重新播放功能
2019/09/11 HTML / CSS
Mixbook加拿大:照片书,照片卡,剪贴簿,年历和日历
2017/02/21 全球购物
美国在线家居装饰店:Belle&June
2018/10/24 全球购物
新闻专业学生的自我评价
2014/02/13 职场文书
《狮子和兔子》教学反思
2014/03/02 职场文书
互联网创业计划书写作技巧攻略
2014/03/23 职场文书
处级领导干部四风问题自我剖析材料
2014/09/29 职场文书
2015年女职工工作总结
2015/05/15 职场文书
2016国培研修心得体会
2016/01/08 职场文书
中小学教师继续教育心得体会
2016/01/19 职场文书
提升Nginx性能的一些建议
2021/03/31 Servers
前端实现滑动按钮AJAX与后端交互的示例代码
2022/02/24 Javascript