❶ Nuxtjs eventbus 插件
Nuxtjs 是 VUE SSR 的框架坦晌猜實現,有時會用到謹姿單獨的事件處理,在 nuxtjs 可按以下方法處理:
添加 plugins/bus-inject.js 內容讓型如下
聯合注入
在 nuxt.config.js 配置插件, 更多信息 https://nuxtjs.org/api/configuration-plugins
採用聯合注入方法後
❷ Vert.x 與 Node.js 有哪些區別
Vert.x是一個用於下一代非同步、可伸縮、並發應用的框架,旨在為JVM提供一個Node.js的替代方案。開發者可以通過它使用JavaScript、Ruby、Groovy、Java、甚至是混合語言來編寫應用。
在內部,一個vert.x實例會管理著一個小的線程集合,每個線程針對伺服器上的一個可用內核。基本上每個線程都實現了一個事件循環。當部署一個vert.x應用實例(又叫做verticle)時,伺服器會選擇一個事件循環分配給該實例。接下來針對該實例的任務都會通過該線程進行分配。由於在某一時刻可能會有成千上萬個verticle在運行,因此在同一時刻會將單個事件循環指定給多個verticle。
Verticle可與運行在相同或不同vert.x實例中的其他verticle進行通信,這是通過消息事件匯流排實現的,它類似於Erlang的actor模型。消息傳遞旨在讓系統能夠在多個可用核心上進行擴展而無需以多線程的方式來執行verticle代碼。
事件匯流排是分布式的,並不只會跨越伺服器,還會滲透進客戶端的JavaScript以處理「實時」的Web應用。
除了並發與消息傳遞外,vert.x還具有如下特性:
TCP/SSL伺服器與客戶端
HTTP/HTTPS伺服器與客戶端
WebSockets/SockJS支持
InfoQ有幸采訪到了VMWare的高級工程師Tim Fox以了解vert.x:
InfoQ:能否從架構上介紹一下vert.x及其構建方式?
Tim:vert.x的核心是用Java編寫的,接下來我們為每一種支持的JVM語言編寫了一個薄薄的API層,這樣每種語言都有一個適合於該語言的API了。我們並沒有向這些語言直接公開Java API。這意味著Ruby用戶會通過Ruby的方式編寫代碼,JS用戶會通過JS的方式編寫代碼。
InfoQ:能否描述一下在vert.x上典型的開發流程么,特別是與開發者使用Node.js的體驗進行一下對比?
我覺得這與node.js是非常類似的。實際的工作流程取決於你是在本地還是雲中運行應用。但這並非vert.x所特有的。
InfoQ:就調試、監控與運維來看,在JVM與Node.js上運行實時應用有何差別?
我想說監控與運維實際上與部署vert.x的環境之間的關系更為密切而非vert.x本身。比如說,如果將vert.x部署到雲中,那麼雲提供商可能就會為你提供監控。順便說一下,社區成員目前已經在OpenShift與Heroku上運行了Vert.x。我們希望不久之後CloudFoundry支持就會到來。
InfoQ:vert.x與Node.js有什麼基準比較么?
我們尚未發布任何的官方基準。但我自己已經完成了一些,在我所做的測試中,vert.x的性能與可伸縮性都遠遠超越了node.js。我希望在不久之後能夠發布一些基準。
InfoQ:vert.x與Netty相比如何呢?
Netty是個很棒的底層IO庫。Vert.x實際上使用了Netty。但vert.x是個用於編寫非同步應用的完整平台。Vert.x還提供了一個組件模型、文件IO及各種Netty所沒有的東西。我要說的是,在JVM世界中,Vert.x是更類似於Akka(也使用了Netty)之類的完整框架。
❸ Vue組件通信中eventBus的使用
原文鏈接: https://segmentfault.com/a/1190000013636153?utm_source=tag-newest
在vue1.0中,組件之間的通信主要通過vm.dispatch沿著父鏈向上傳播和用vm.dispatch沿著父鏈向上傳播和用vm.broadcast向下廣播來實現。然而在vue2.0中,已經廢除了這種用法。
vuex加入後,對組件之間的通信有了更加清晰的操作,對於中大型的項目來說,一開始就把vuex的使用計劃在內是明智的選擇。
然而在一些小型的項目,或者說像我這樣寫到一半才發現vue2.0用不了.broadcast和.broadcast和dispatch的人來說,就需要一個比較便捷的解決方法。那麼,eventBus的作用就體現出來了。
主要是現實途徑是在要相互通信的兄弟組件之中,都引入一個新的vue實例,然後通過分別調用這個實例的事件觸發和監聽來實現通信和參數傳遞。
這里來看一個簡單的例子:
比如,我們這里有三個組件,main.vue、click.vue、show.vue。click和show是父組件main下的兄弟組件,而且click是通過v-for在父組件中遍歷在了多個列表項中。這里要實現,click組件中觸發點擊事件後,由show組件將點擊的是哪個dom元素console出來。
首先,我們給click組件添加點擊事件
想要在doClick()方法中,實現對show組件的通信,我們需要新建一個js文件,來創建出我們的eventBus,我們把它命名為bus.js
importVuefrom'vue';exportdefaultnewVue();
這樣我們就創建了一個新的vue實例。接下來我們在click組件和show組件中import它。
importBusfrom'common/js/bus.js';
接下來,我們在doClick方法中,來觸發一個事件:
methods: { addCart(event){Bus.$emit('getTarget',event.target); } }
這里我們在click組件中每次點擊,都會在bus中觸發這個名為'getTarget'的事件,並將點擊事件的event.target順著事件傳遞出去。
接著,我們要在show組件中的created()鉤子中調用bus監聽這個事件,並接收參數:
created(){ Bus.$on('getTarget',target=>{console.log(target); }); }
這樣,在每次click組件的點擊事件中,就會把event.target傳遞到show中,並console出來。
所以eventBus的使用還是非常便捷的,但是如果是中大型項目,通信比較復雜,還是建議大家直接使用vuex。
來看一個實際例子:
我們創建了一個selection.vue的下拉框組件,在layout.vue組件中使用了selection.vue組件,我們要實現點擊layout.vue組件頁面的任意一處(除下拉框組件本身外),都可以將下拉框收起來。首先,新建了一個eventBus.js文件,在裡面新建了一個vue的實例賦值給const eventBus,在selection.vue和layout.vue中分別import eventBus from '../../eventBus'和import eventBus from '../eventBus',則eventBus對於selection.vue和layout.vue就是一個全局的vue實例對象,然後通過分別調用eventBus這個實例的事件觸發emit和事件監聽emit和事件監聽on來實現通信和參數傳遞。圖6,是為了在一個頁面中,把selection.vue使用了至少兩次,則我們點擊任意一個selection.vue的同時,要把其它的selection.vue給收起來,如圖7。
圖1:
圖2:
圖3:
圖4:
圖5:
圖6:
圖7: