"vue-unicom"的做者:szpoppy,若是以为对你有用,请必定点个star
这个项目虽然是szpoppy的我的项目,可是在szpoppy公司内是在大面积使用的,一直由szpoppy维护;我我的和szpoppy在一块儿工做接近一年,常常看他的源代码,从他身上学到很是多。javascript
本文结构:html
npm install vue-unicom
import VueUnicom from 'vue-unicom' // 非 cli 也必须 install一下 Vue.use(VueUnicom, { // 制定名称, 默认为 unicom unicom: 'unicom', // 定制分组使用名称 默认为 unicom + 'Name' unicomName: 'unicomName', // 定制id使用名称 默认为 unicom + 'Id' unicomId: 'unicomId' })
// 1. 下载 git clone https://github.com/szpoppy/vue-unicom.git // 2. cd vue-unicom //3.运行demo,能够直接打开src目录下的index.html(推荐这种更方便的方法)也能够用gulp运行 // 4.‘vue-unicom’源代码在‘/src/lib/unicom.js’
组件编写示例以下,下面进一步详细介绍java
Vue.component('ca', { template: '<div><p class="title">text:{{text}}#{{unicomId}}</p><p>msg: {{msg}}</p></div>', unicomName: 'a', unicom: { message: function(sender, text){ this.msg = text } }, data: function(){ return { text: 'component - ca', msg: 'a' } }, mounted(){ console.log(' a component ',this) } })
组件调用示例以下git
<div id="app" class="app"> <ca unicom-id="a-id1"></ca> <ca unicom-id="a-id2"></ca> <cb1></cb1> <cb2></cb2> <cc></cc> <hr> <cbtn></cbtn> </div>
{ // Vue中增长 增长unicom参数 // 这里的unicom,指 上面传入的参数 unicom: { // instruct1:通信指令 // sender:发送指令者($vm) // args:指令发出者附带参数 // 参数若是为对象,是引用类型,若是须要设置,请深度克隆一遍 instruct1 (sender, ...args) { // .... this 为当前组件 }, instruct2 (sender, ...args) { } } }
{ // Vue中增长 增长unicomName参数 // 指定分组 属于 group, 全部实例,都属于这个分组 unicomName: 'group' }
{ // 组件能够加入多个分组 unicomName: ['group1', 'group2'] }
<!-- 加入group分组 --> <component unicom-name="group"></component>
<!-- 指定$vm的 id 为 id1 --> <component unicom-id="id1"></component>
{ methods:{ method1 () { // 发送 instruct1 指令,参数为 1, 2 this.$unicom('instruct1', 1, 2) } } }
instruct1@group (发送到指定分组)instruct1#id1 (发送到指定组件)github
@group (获取指定分组组件)vuex
#id1 (获取指定组件)npm
指令使用 ~ 打头gulp
~instruct1 (指令延迟发送,直到包含有instruct1指令的组件出现)~instruct1@group (指令延迟发送,直到出现分组命名group的组件)数组
~instruct1#id1 (指令延迟发送,直到出现命名id1的组件)
组件监听使用, 指令使用 ~ 打头, 第二个参数为 callback
~@group (监听分组命名group的组件出现)~#id1 (监听命名id1的组件出现)
~ (监放任意新出现的组件)
只作基本的源码解析,更加详细能够咨询szpoppy
建议先阅读vue插件机制https://cn.vuejs.org/v2/guide/plugins.html
拿到源码‘unicom.js’第一步,先用编译器把全部的方法都收起来,除了install函数
接下里咱们重点从入口install看起,另外导入插件并app.use的过程当中,第一步其实就是调用的install函数
function install(vue, { name = 'unicom', idName, groupName } = {}) { //简单几行代码判断是否安装过 // 添加原型方法,全局组件调用 vue.prototype['$' + name] = unicomQuery // unicomIdName = 'unicomId' id做为惟一标识 unicomIdName = idName || (name + 'Id') // unicomGroupName = 'unicomName' 分组 unicomGroupName = groupName || (name + 'Name') // 全局混入 vue.mixin({ props: watch: beforeCreate(){} created(){}, destroyed(){} }) // 自定义属性合并策略 let merge = vue.config.optionMergeStrategies // 改变了自定义属性unicomName和unicom的合并策略 merge[name] = merge[unicomGroupName] = function (parentVal, childVal){ //... } }
其实,按照这样一划分,你们很简单的就能看到这个插件的制做部分大概就分这几块:
利用vue原型链挂载一个全局的‘$unicom’方法,能够在全局内调用,也能够做为组件内节点click时的方法,click直接发送数据
// 组件行级表达式使用方式 <button @click="$unicom('message', '通用Send')">发送指令 message</button> <button @click="$unicom('message@a', 'Send@a')">发送指令 message@a</button>
// 函数内直接调用使用方式 methods:{ sendData(){ this.$unicom('message@c', '测试数据') } },
如不了解,建议阅读https://cn.vuejs.org/v2/guide/mixins.html
插件逻辑处理的重点部分:全局混入mixin
props:这个部分很是简单,就是为了让每一个组件都能在组件调用时传递变量‘unicom-id’或者‘unicom-name’(通常是静态变量)
watch:这个部分主要就是当组件调用时‘unicom-id’或者‘unicom-name’传递过来的是动态变量对其进行实时监听
beforeCreate:在组件已解析但未加载时,利用‘this.$options’去获取自定义‘unicom’属性,而后在每个组件内加入事件机制;最后利用Map集合以组件vm做为key,将该组件的分组和通讯函数合并的对象做为value存起来
created:在组件已经解析和载入到dom结构以后,从Map集合中获取当前组件的分组和通讯函数信息,判断是否有其它组件在当前组件未建立以前给它发送了数据,若是有,响应该延迟发送的数据
destroyed:组件销毁逻辑
如不了解,建议阅读vue中的optionMergeStrategies
这个部分看起来简单的几行,其实倒是个插件开发过程当中比较重点的部分
如何理解这个‘optionMergeStrategies’呢?该组件主要针对自定义option属性的混合;官方解释是:’当组件和混入对象含有同名选项时,这些选项将以恰当的方式混合‘。
确定不少人仍是不明白,其实说实话我也不算明白,可是我简单解释一下:
简单理解它在当前插件的做用:子组件和上层组件有相同option属性时,让子组件正确合并上层组件的自定义属性
咱们能够很确定一点:vue自己并无这两个option属性,甚至极可能不少人也历来没有本身在组件声明时自定义options属性
若是你没有试过,也没有关系,看了本篇文章以后你就知道了
为何咱们要自定义option属性呢?这两个属性的做用很明确,‘unicomName’是作分组声明的,‘unicom’是作通讯函数的;而后在mixin的各个生命周期再利用‘this.$options’获取自定义option属性进行进一步的逻辑处理,并声明optionMergeStrategies合并策略
利用map集合以组件vm为单位存储该组件的分组和通讯函数
每次存通讯函数、分组的时候都会把对应的vm实例存储下来,因此要找通讯函数或者对应分组就很是简单
这个组件较我一开始使用已经通过了一次对代码更加直观的改进,我的以为很是值得你们阅读和使用,开源不易,务必点个star
"vue-unicom"的做者:szpoppy,若是以为对你有用,请必定点个star,welcom