今天小編給大家分享一下如何在vue中利用組件傳值實(shí)現(xiàn)觀察者模式的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)的開發(fā),更需要了解用戶,從用戶角度來建設(shè)網(wǎng)站,獲得較好的用戶體驗(yàn)。創(chuàng)新互聯(lián)建站多年互聯(lián)網(wǎng)經(jīng)驗(yàn),見的多,溝通容易、能幫助客戶提出的運(yùn)營(yíng)建議。作為成都一家網(wǎng)絡(luò)公司,打造的就是網(wǎng)站建設(shè)產(chǎn)品直銷的概念。選擇創(chuàng)新互聯(lián)建站,不只是建站,我們把建站作為產(chǎn)品,不斷的更新、完善,讓每位來訪用戶感受到浩方產(chǎn)品的價(jià)值服務(wù)。
Vue.prototype.$Bus = new Vue()
我們往vue的原型里注冊(cè)了一個(gè)全局變量$Bus,他的值是vue的實(shí)例,也就是說,到現(xiàn)在為止,$Bus里邊有了vue所有的屬性和方法,這下就好操作了
這就很符合觀察者模式的發(fā)布訂閱模式
我們?cè)诮M件1中寫如下代碼:
<template>
<div>
<button @click="send">發(fā)送</button>
</div>
</template>
<script>
export default {
methods: {
send () {
this.$Bus.$emit("send",'接收的信息')
}
}
}
</script>點(diǎn)擊按鈕發(fā)送一條信息,這個(gè)按鈕也就是充當(dāng)發(fā)布者,我們用到了vue的$emit這個(gè)api,那么訂閱者是什么呢?我不說你也應(yīng)該想到了,對(duì),就是他
<template>
<div>
{{message}}
</div>
</template>
<script>
export default {
data () {
return {
message: ''
}
},
mounted () {
this.$Bus.$on('send', (msg) => {
this.message = msg
})
}
}
</script>就是用$on這個(gè)屬性充當(dāng)接收者
從上可以看出,vue很多地方用到了觀察者的思想,包括他的雙向綁定也是如此

從上圖我們可以看出,vue是通過Object.defineProperty實(shí)現(xiàn)對(duì)數(shù)據(jù)的劫持,然后中間做了一個(gè)中轉(zhuǎn),最后渲染到vue層。
我們可以肯定的是,vue.js借鑒了觀察者模式,但是我感覺還是有點(diǎn)區(qū)別的,觀察者模式跟注重的是事件驅(qū)動(dòng),比如我買房這個(gè)動(dòng)作,第一次和銷售了解可能沒有合適的房源,然后銷售就會(huì)跟你說: ‘如果有合適的房源我們會(huì)第一時(shí)間通知你',當(dāng)有新房源的時(shí)候他會(huì)給你打電話通知你,這一系列的根源是買房這個(gè)事件,他驅(qū)動(dòng)了整套流程。而vue我們都知道是數(shù)據(jù)驅(qū)動(dòng),也就是只有data里的值發(fā)生改變的話,Object.defineProperty才會(huì)對(duì)他劫持,從而去更新dom,觸發(fā)視圖的更新。
那么有沒有更符合觀察者模式特征的?
當(dāng)然是node.js的events事件了。
首先我們看看events的工作流程:
var events = require('events');
// 創(chuàng)建 eventEmitter 對(duì)象
var eventEmitter = new events.EventEmitter();
// 創(chuàng)建事件處理程序
var connectHandler = function connected() {
console.log('連接成功。');
// 觸發(fā) data_received 事件
eventEmitter.emit('data_received');
}
// 綁定 connection 事件處理程序
eventEmitter.on('connection', connectHandler);
// 使用匿名函數(shù)綁定 data_received 事件
eventEmitter.on('data_received', function(){
console.log('數(shù)據(jù)接收成功。');
});
// 觸發(fā) connection 事件
eventEmitter.emit('connection');
console.log("程序執(zhí)行完畢。");輸出一下:

這就完全符合觀察者的工作模式,由emit發(fā)布,由on接收。所以說,node.js提供了很好的監(jiān)聽機(jī)制,還有他對(duì)整個(gè)事務(wù)的處理 。其支持了nodejs最特色的I/O模式,比如我們啟動(dòng)http服務(wù)時(shí)會(huì)監(jiān)聽其 connect / close,http.request時(shí)會(huì)監(jiān)聽 data / end等。
還有沒有類似的案例呢?
當(dāng)然,js有一個(gè)事件監(jiān)聽者----addEventListener,也有點(diǎn)觀察者的意思,具體用法我就不說了,想必大家用的都很熟悉。
其實(shí)只要你認(rèn)真想一想,還是有很多地方有觀察者的身影的,最簡(jiǎn)單的就是一個(gè)點(diǎn)擊事件,是不是也有其意思,發(fā)布者是一個(gè)按鈕,而接收者可以是表單,彈層等任何東西。
首先我們說說他的優(yōu)點(diǎn):
1,觀察者模式需要在觀察者和被觀察者之間建立一個(gè)耦合,他需要一個(gè)更加抽象化將二者聯(lián)系在一起
2,觀察者模式支持廣播,也就是一對(duì)多的關(guān)系,這就讓我們很容易想到一個(gè)技術(shù),就是socket,具體可以參考vue項(xiàng)目使用websocket技術(shù)
然鵝,他也是優(yōu)缺點(diǎn)的:
1,創(chuàng)建訂閱者本身要消耗一定的時(shí)間和內(nèi)存
2,當(dāng)訂閱一個(gè)消息時(shí),也許此消息并沒有發(fā)生,但這個(gè)訂閱者會(huì)始終存在內(nèi)存中。
3,觀察者模式弱化了對(duì)象之間的聯(lián)系,這本是好事情,但如果過度使用,對(duì)象與對(duì)象之間的聯(lián)系也會(huì)被隱藏的很深,會(huì)導(dǎo)致項(xiàng)目的難以跟蹤維護(hù)和理解。
等會(huì)兒,還有一個(gè)模式叫發(fā)布訂閱模式,很多人都以為他就是觀察者模式(包括我),后來我上網(wǎng)查了一下,發(fā)現(xiàn)他們還是有區(qū)別的,我們可以說觀察者模式和發(fā)布訂閱模式很像,真的很像,但是本質(zhì)還是有點(diǎn)區(qū)別的,最根本的就是調(diào)度中心不同。
舉個(gè)例子,觀察者模式更注重是目標(biāo)和觀察者是抽象類,比如天氣預(yù)報(bào),觀察者A負(fù)責(zé)監(jiān)聽天氣的變化,而B想得知天氣的變化需要將自己注冊(cè)到A中,而天氣變化的時(shí)候A觸發(fā)天氣變化,調(diào)度B的接口更新變化。
而發(fā)布訂閱模式是如何完成這個(gè)動(dòng)作的呢?A想要感知天氣變化,需要B這個(gè)調(diào)度中心,而B得到天氣變化需要依賴C的觸發(fā),可能我解釋的不是很清楚,網(wǎng)上有兩個(gè)圖比較好


以上就是“如何在vue中利用組件傳值實(shí)現(xiàn)觀察者模式”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
文章題目:如何在vue中利用組件傳值實(shí)現(xiàn)觀察者模式
本文URL:http://www.chinadenli.net/article18/igpjgp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化、標(biāo)簽優(yōu)化、Google、微信公眾號(hào)、軟件開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)