"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