全棧爬坑之路:愉快的Vue組件通信

Vue自帶的通信方式非常郁悶,只能自上而下的進行數據綁定。一旦要反向通信或者廣播通信就要用到Vuex或者其它插件。但是這些東西實在太重了,煩躁,看著就不想用。于是自己寫了一個好使的。

實現原理:實現一個v-load指令和v-sync指令。用指令參數決定對應的同步標簽,指令值決定data的對應關系。例子:

<sender v-sync:abc="{id:'my_id',name:'my_name'}"></sender>

<receiver v-load:abc="{id:'your_id',name:'your_name'}"></receiver>

于是sender組件data中的my_id被同步到receiver中的your_id,my_name被同步到your_name。

實現原理:

1.在Vue中使用Vue.directive來定義指令,其中bind:function(el,binding,vNode)的第三個參數vNode指向當前Vue組件或實例的虛擬節點,當指令所在的html標簽正好是Vue實例或組件所在的標簽時,其componentInstance屬性指向Vue對象;當指令所在的html標簽是Vue實例或組件內部的普通html標簽時,其contex屬性指向其所在的Vue對象。

指令寫在一個Vue實例內的組件上

可以看到,componentInstance對應的是一個VueComponent對象,及指令所在的組件,而contex對應一個Vue$3對象,及該組件所在的Vue實例。

2.當我們使用var scope = vNode.componentInstance || vNode.context;獲取到一個Vue對象時,可以使用scope.$watch()函數在指令中動態指定觀察對象。

3.在Vue中,使用Vue.set對其它組件或實例data中的屬性進行修改,能夠被該組件或實例動態響應。

以上是預備知識,下面上代碼:

Load.js

Load.js實際就是把自身對象的引用和數據的對應關系注冊進一個全局的postman對象中。

接著看Sync.js

簡書的貼代碼功能做的有點爛啊....ORZ,湊合著看吧。

進行js壓縮和混淆并取消開發環境下的錯誤提示之后的min版本

var postman={};Vue.directive("load",{bind:function(b,e,c){var f=e.arg;var a=c.componentInstance||c.context;var d=e.value;if(typeof postman[f]=="undefined"){postman[f]=[]}postman[f].push({vue:a,map:d})}});Vue.directive("sync",{bind:function(b,e,c){var f=e.arg;var a=c.componentInstance||c.context;var d=e.value;for(key in d){(function(g){a.$watch(d[g],function(i,h){for(targetKey in postman[f]){var k=postman[f][targetKey];var j=k.vue;var l=k.map[g];Vue.set(j,l,i)}},{deep:true})})(key)}}});

共計490字節

一個字:爽


測試結果:


兩個字:愉悅


注意:

只能指定data中的根屬性而不能指定子屬性,如:

return {title:'asdasd',content:'asdasd',writer:{name:''asdasd",profile:"asdasd"}};

對于這種,只能直接指定觀察writer而不能指定觀察profile。

*:其實是可以做到的,但是這樣一般夠用了。而且我懶。


另外,簡書的文本編輯器做的真是爛。UI明明做的不錯的說,結果整出這么個玩意兒,真是夠了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內容,還有我對于 Vue 1.0 印象不深的內容。關于...
    云之外閱讀 5,074評論 0 29
  • Vue 實例 屬性和方法 每個 Vue 實例都會代理其 data 對象里所有的屬性:var data = { a:...
    云之外閱讀 2,241評論 0 6
  • 1.安裝 可以簡單地在頁面引入Vue.js作為獨立版本,Vue即被注冊為全局變量,可以在頁面使用了。 如果希望搭建...
    Awey閱讀 11,074評論 4 129
  • 深入響應式 追蹤變化: 把普通js對象傳給Vue實例的data選項,Vue將使用Object.defineProp...
    冥冥2017閱讀 4,894評論 6 16
  • 喬登在報紙上得知他的老朋友伯尼去世了。 他跟兒子談起了這個老朋友。 在喬登小的時候,他的父親很早就去世了。 在喬登...
    陶心魚閱讀 552評論 1 0