Vue自帶的通信方式非常郁悶冰垄,只能自上而下的進(jìn)行數(shù)據(jù)綁定。一旦要反向通信或者廣播通信就要用到Vuex或者其它插件权她。但是這些東西實(shí)在太重了虹茶,煩躁,看著就不想用隅要。于是自己寫了一個(gè)好使的蝴罪。
實(shí)現(xiàn)原理:實(shí)現(xiàn)一個(gè)v-load指令和v-sync指令。用指令參數(shù)決定對(duì)應(yīng)的同步標(biāo)簽步清,指令值決定data的對(duì)應(yīng)關(guān)系要门。例子:
<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被同步到y(tǒng)our_name廓啊。
實(shí)現(xiàn)原理:
1.在Vue中使用Vue.directive來(lái)定義指令欢搜,其中bind:function(el,binding,vNode)的第三個(gè)參數(shù)vNode指向當(dāng)前Vue組件或?qū)嵗奶摂M節(jié)點(diǎn),當(dāng)指令所在的html標(biāo)簽正好是Vue實(shí)例或組件所在的標(biāo)簽時(shí)崖瞭,其componentInstance屬性指向Vue對(duì)象狂巢;當(dāng)指令所在的html標(biāo)簽是Vue實(shí)例或組件內(nèi)部的普通html標(biāo)簽時(shí),其contex屬性指向其所在的Vue對(duì)象书聚。
指令寫在一個(gè)Vue實(shí)例內(nèi)的組件上可以看到唧领,componentInstance對(duì)應(yīng)的是一個(gè)VueComponent對(duì)象,及指令所在的組件雌续,而contex對(duì)應(yīng)一個(gè)Vue$3對(duì)象斩个,及該組件所在的Vue實(shí)例。
2.當(dāng)我們使用var scope = vNode.componentInstance || vNode.context;獲取到一個(gè)Vue對(duì)象時(shí)驯杜,可以使用scope.$watch()函數(shù)在指令中動(dòng)態(tài)指定觀察對(duì)象受啥。
3.在Vue中,使用Vue.set對(duì)其它組件或?qū)嵗齞ata中的屬性進(jìn)行修改鸽心,能夠被該組件或?qū)嵗齽?dòng)態(tài)響應(yīng)滚局。
以上是預(yù)備知識(shí),下面上代碼:
Load.js
接著看Sync.js
進(jìn)行js壓縮和混淆并取消開(kāi)發(fā)環(huán)境下的錯(cuò)誤提示之后的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)}}});
共計(jì)490字節(jié)
一個(gè)字:爽
測(cè)試結(jié)果:
注意:
只能指定data中的根屬性而不能指定子屬性糯景,如:
return {title:'asdasd',content:'asdasd',writer:{name:''asdasd",profile:"asdasd"}};
對(duì)于這種嘁圈,只能直接指定觀察writer而不能指定觀察profile省骂。
*:其實(shí)是可以做到的,但是這樣一般夠用了最住。而且我懶钞澳。
另外,簡(jiǎn)書(shū)的文本編輯器做的真是爛涨缚。UI明明做的不錯(cuò)的說(shuō)轧粟,結(jié)果整出這么個(gè)玩意兒,真是夠了仗岖。