其實對於vue中元件通訊這件事大家也都不陌生。甚至張口就來,畢竟這也是面試中的經常會問到的。由於之前沒有進行過細緻的考慮,在寫小專案的時候遇到了元件中通訊的需求,然後上來就寫,結果發現沒有用,查了好久才知道那種方式不適用這樣情況。所以經過這次事情決定寫篇文章,對於通訊方式進行更清楚更細緻的分類,畢竟不是每種通訊方式都適用於所有場景。(學習視訊分享:)
同瀏覽器同頁籤內主要涉及的就是父子元件的傳值。
對於狀態管理器的概念大家應該也不會陌生。
這對選項需要一起使用,以允許一個祖先元件向其所有子孫後代注入一個依賴,不論元件層次有多深,並在其上下游關係成立的時間裡始終生效。
provide
和 inject
繫結並不是可響應的。不過如果你傳入了一個可監聽的物件,那麼其物件的 property 還是可響應的。// parent.vue // 此處忽略template模板的東西 <script> export default { name: 'parent', // provide有兩種寫法 // 第一種 provide: { a: 1, b: 2 } // 第二種 provide() { return { a: 1, b: 2 } } } </script>
// child.vue // 此處忽略template模板的東西 <script> export default { name: 'child', // inject // 第一種 inject: [ 'a', 'b' ] // 第二種 inject: { abc: { // 可以指定任意不與data,props衝突的變數名,然後指定是指向provide中的哪個變數 from: 'a', default: 'sfd' // 如果預設值不是基本資料型別,那就得改用:default: () => {a:1,b:2} }, b: { default: '33' } } } </script>
正經的props/$emit可太常見了,都是用爛了的,就不用寫範例程式碼了吧。
問題:
// utils/eventBus.js import Vue from 'vue' const EventBus = new Vue() export default EventBus
// main.js // 進行全域性掛載 import eventBus from '@/utils/eventBus' Vue.prototype.$eventBos = eventBus
// views/parent.vue <template> <div> <button @click="test">測試</button> </div> </template> <script> export default { data() { return {} }, methods: { test() { this.$eventBus.$emit('testBus', 'test') } } }
// views/child.vue <template> <div> {{ testContent }} <!-- test --> </div> </template> <script> export default { data() { return { testContent: '' } }, mounted() { this.$eventBus.$on('test', e => this.testContent = e) } }
prop
接收會自動設定到子元件內部的最外層標籤上,如果是 class
和 style
的話,會合並最外層標籤的 class
和 style
。prop
屬性,可以使用 inheritAttrs
禁用繼承,然後通過 v-bind="$attrs"
把外部傳入的 非 prop
屬性設定給希望的標籤上,但是這不會改變 class
和 style
$attrs
來代理獲取所有父元件傳過來的值。.native
修飾器的) v-on
事件監聽器。它可以通過 v-on="$listeners"
傳入內部元件——在建立更高層次的元件時非常有用範例:這是父元件
這是子元件
這是執行展示:
同時可以發現子元件加上inheritAttrs:false之後根元件裡的未宣告props接受的變數消失了
同瀏覽器的不同頁籤之間的通訊,大多數的場景是:專案裡的增刪改查都是開啟的新頁面,然後新增結束後就觸發列表頁重新獲取列表。這種場景下有什麼方法呢?
// 需要監聽的頁面 mounted() { window.addEventListener('storage', this.storageEvent); }, beforeDestroy() { window.removeEventListener() } methods: { storageEvent(e) { console.log("storage值發生變化後觸發:", e) } }
不同瀏覽器的同一網站的有通訊的必要嗎?
如果有那就:websocket(比如聊天室)
哈哈哈哈
(學習視訊分享:、)
以上就是vue中不同情況下怎麼進行通訊?方式分享的詳細內容,更多請關注TW511.COM其它相關文章!