目錄
同視窗(也就是同一個瀏覽器同一個頁籤內)
#props:適用相鄰兩個元件的傳值(父->子);$emit: 子->父
eventBus: 地位與vuex差不多,適用任意元件,包容性極強
$attrs / $listeners
不同窗口(同浏览器不同页签内)
监听stroage事件
不同浏览器
首頁 web前端 Vue.js vue中不同情況怎麼進行通訊?方式分享

vue中不同情況怎麼進行通訊?方式分享

Apr 20, 2022 pm 08:39 PM
vue

vue中不同情況下怎麼進行通訊?以下這篇文章給大家分析一下vue中不同情況下的通訊方式,希望對大家有幫助!

vue中不同情況怎麼進行通訊?方式分享

其實對於vue中元件通訊這件事大家也都不陌生。甚至張口就來,畢竟這也是面試中的常會問到的。由於之前沒有進行過細緻的考慮,在寫小項目的時候遇到了組件中通訊的需求,然後上來就寫,結果發現沒有用,查了好久才知道那種方式不適用這樣情況。所以經過這次事情決定要寫篇文章,對於通訊方式進行更清楚更細緻的分類,畢竟不是每種通訊方式都適用於所有場景。 (學習影片分享:vuejs教學

同視窗(也就是同一個瀏覽器同一個頁籤內)

##同瀏覽器同頁簽內主要涉及的就是父子元件的傳值。

vuex:狀態管理器:適用一個專案裡的任何元件,包容性極強

對於狀態管理器的概念大家應該也不會陌生。


    多個元件可以共用一個或多個狀態值。不管組件的層級有多深都可以正常存取。所以這是一種官方直接支援的通訊方式。
  • 注意:
  • 對於小型單頁應用而言,該選擇並不是很建議,對於小型專案而言使用vuex反而會變得更加繁瑣,就像是一個75斤150cm的人,穿了一件170cm110斤人的衣服一樣,看著就很鬆鬆垮垮撐不起來。

provide / inject (寫法基於v2.2.1以上版本):適用N級元件,但是必須是單線傳承的那種

#這對選項需要一起使用,以允許一個祖先組件向其所有子孫後代注入一個依賴,不論組件層次有多深,並在其上下游關係成立的時間裡始終生效。

    就是相當於有N層樓的樓房,最頂層的是父級組件,每層樓之間會公用一個管子,這個管子就是provide。而管子在每層樓都有一個出口叫:inject
  • 注意:
  • provide 和 inject 綁定並不是可回應的。不過如果你傳入了一個可監聽的對象,那麼其對象的 property 還是可回應的。
  • 讓咱們來看看程式碼
  • // parent.vue
    // 此处忽略template模板的东西
    <script>
    export default {
        name: &#39;parent&#39;,
        // provide有两种写法
        // 第一种
        provide: {
            a: 1,
            b: 2
        }
        // 第二种
        provide() {
            return {
                a: 1,
                b: 2
            }
        }
    }
    </script>
    登入後複製
    // child.vue
    // 此处忽略template模板的东西
    <script>
    export default {
        name: &#39;child&#39;,
        // inject
        // 第一种
        inject: [ &#39;a&#39;, &#39;b&#39; ]
        // 第二种
        inject: {
            abc: { // 可以指定任意不与data,props冲突的变量名,然后指定是指向provide中的哪个变量
                from: &#39;a&#39;,
                default: &#39;sfd&#39; // 如果默认值不是基本数据类型,那就得改用:default: () => {a:1,b:2}
            },
            b: {
                default: &#39;33&#39;
            }
        }
    }
    </script>
    登入後複製

#props:適用相鄰兩個元件的傳值(父->子);$emit: 子->父

正經的props/$emit可太常見了,都是用爛了的,就不用寫範例程式碼了吧。

    只適用於相鄰層級的父子元件之間傳值
  • 對於多層元件的傳值雖然也能用props傳,但是吧,這樣的話會讓程式碼很難維護,極不建議。

eventBus: 地位與vuex差不多,適用任意元件,包容性極強

問題:

    不方便維護:如果在專案裡用的多了,可能出現方法名稱衝突導致異常的問題,而且比較不方便檢驗。
  • 範例:
  • // utils/eventBus.js
    import Vue from &#39;vue&#39;
    const EventBus = new Vue()
    export default EventBus
    登入後複製
    // main.js
    // 进行全局挂载
    import eventBus from &#39;@/utils/eventBus&#39;
    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(&#39;testBus&#39;, &#39;test&#39;)
            }
        }
    }
    登入後複製
    // views/child.vue
    <template>
        <div>
            {{ testContent }} <!-- test -->
        </div>
    </template>
    <script>
    export default {
        data() {
            return {
                testContent: &#39;&#39;
            }
        },
        mounted() {
            this.$eventBus.$on(&#39;test&#39;, e => this.testContent = e)
        }
    }
    登入後複製

$attrs / $listeners

    $attrs
    • #官方解釋
        從父元件傳給自訂子元件的屬性,如果沒有 
      • prop 接收會自動設定到子元件內部的最外層標籤上,如果是 class 和 style 的話,會合併最外層標籤的 class 和 style
      • 如果子元件中不想繼承父元件傳入的非 
      • prop 屬性,可以使用 inheritAttrs 停用繼承,然後透過 v-bind="$ attrs" 將外部傳入的非 prop 屬性設為希望的標籤上,但這不會改變 class 和 style
    • 當父元件向子元件傳值,但是子元件並沒有全部將傳過來的值在props中宣告時,在子元件裡就可以透過
    • $attrs來代理程式取得所有父元件傳過來的值。
    • 範例:這是父元件

vue中不同情況怎麼進行通訊?方式分享

    這是子元件: 沒有宣告props

    vue中不同情況怎麼進行通訊?方式分享

    #這是dom展示:

    vue中不同情況怎麼進行通訊?方式分享

    ######
    • 此时,通过dom可以发现,所有没有声明的信息,全部出现在了子组件的根元素上。
    • 如果要让没有声明的信息不出现在子组件的根元素上,那就在子组件与data同级的位置加个属性:inheritAttrs: false;这样就不会未通过props接收的变量就不会出现在子组件的根元素上了
    • 至于怎么传递给子组件的子组件的子组件的子组件....等,那就需要给子组件的子组件依次都绑定:v-bind="$attrs"即可。
    • 注意这样只适用于传递数据。
  • $listeners
    • 官方解释:包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。它可以通过 v-on="$listeners" 传入内部组件——在创建更高层次的组件时非常有用
    • 当父组件向子组件传递回调时,子组件可以通过$listeners代理所有回调。
    • 示例:这是父组件

vue中不同情況怎麼進行通訊?方式分享

    • 这是子组件

vue中不同情況怎麼進行通訊?方式分享

    • 这是执行展示:

      vue中不同情況怎麼進行通訊?方式分享

    • 同时可以发现子组件加上inheritAttrs:false之后根组件里的未声明props接受的变量消失了

      vue中不同情況怎麼進行通訊?方式分享

  • 最后:建议最好不要用这个玩意,虽然他们都可以相对便捷的将第一级组件的属性,方法回调传递给N级子组件中的任一级,但是之后进行bug定位,或者分析需求将会是一个比较大的挑战。

不同窗口(同浏览器不同页签内)

同浏览器的不同页签之间的通讯,大多数的场景是:项目里的增删改查都是打开的新页面,然后新增结束后就触发列表页重新获取列表。这种场景下有什么方法呢?

监听stroage事件

// 需要监听的页面
mounted() {
    window.addEventListener(&#39;storage&#39;, this.storageEvent);
},
beforeDestroy() {
    window.removeEventListener()
}
methods: {
    storageEvent(e) {
        console.log("storage值发生变化后触发:", e)
    }
}
登入後複製
  • 切记:第一条:要记得将监听的事件在组件销毁之前解除监听。否则会给你惊”喜“
  • 切记:第二条:其中监听方法回调一定要在methods中定义,然后通过this进行引用,否则你在解除事件监听的时候将无效。

不同浏览器

不同浏览器的同一网站的有通讯的必要吗?
如果有那就:websocket(比如聊天室)
哈哈哈哈

(学习视频分享:web前端开发编程入门

以上是vue中不同情況怎麼進行通訊?方式分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

vue怎麼給按鈕添加函數 vue怎麼給按鈕添加函數 Apr 08, 2025 am 08:51 AM

可以通過以下步驟為 Vue 按鈕添加函數:將 HTML 模板中的按鈕綁定到一個方法。在 Vue 實例中定義該方法並編寫函數邏輯。

vue中怎麼用bootstrap vue中怎麼用bootstrap Apr 07, 2025 pm 11:33 PM

在 Vue.js 中使用 Bootstrap 分為五個步驟:安裝 Bootstrap。在 main.js 中導入 Bootstrap。直接在模板中使用 Bootstrap 組件。可選:自定義樣式。可選:使用插件。

vue.js怎麼引用js文件 vue.js怎麼引用js文件 Apr 07, 2025 pm 11:27 PM

在 Vue.js 中引用 JS 文件的方法有三種:直接使用 &lt;script&gt; 標籤指定路徑;利用 mounted() 生命週期鉤子動態導入;通過 Vuex 狀態管理庫進行導入。

vue中的watch怎麼用 vue中的watch怎麼用 Apr 07, 2025 pm 11:36 PM

Vue.js 中的 watch 選項允許開發者監聽特定數據的變化。當數據發生變化時,watch 會觸發一個回調函數,用於執行更新視圖或其他任務。其配置選項包括 immediate,用於指定是否立即執行回調,以及 deep,用於指定是否遞歸監聽對像或數組的更改。

vue返回上一頁的方法 vue返回上一頁的方法 Apr 07, 2025 pm 11:30 PM

Vue.js 返回上一頁有四種方法:$router.go(-1)$router.back()使用 &lt;router-link to=&quot;/&quot;&gt; 組件window.history.back(),方法選擇取決於場景。

vue多頁面開發是啥意思 vue多頁面開發是啥意思 Apr 07, 2025 pm 11:57 PM

Vue 多頁面開發是一種使用 Vue.js 框架構建應用程序的方法,其中應用程序被劃分為獨立的頁面:代碼維護性:將應用程序拆分為多個頁面可以使代碼更易於管理和維護。模塊化:每個頁面都可以作為獨立的模塊,便於重用和替換。路由簡單:頁面之間的導航可以通過簡單的路由配置來管理。 SEO 優化:每個頁面都有自己的 URL,這有助於搜索引擎優化。

怎樣查詢vue的版本 怎樣查詢vue的版本 Apr 07, 2025 pm 11:24 PM

可以通過以下方法查詢 Vue 版本:使用 Vue Devtools 在瀏覽器的控制台中查看“Vue”選項卡。使用 npm 運行“npm list -g vue”命令。在 package.json 文件的“dependencies”對像中查找 Vue 項。對於 Vue CLI 項目,運行“vue --version”命令。檢查 HTML 文件中引用 Vue 文件的 &lt;script&gt; 標籤中的版本信息。

vue怎麼用函數截流 vue怎麼用函數截流 Apr 08, 2025 am 06:51 AM

Vue 中的函數截流是一種技術,用於限制函數在指定時間段內被調用的次數,防止性能問題。實現方法為:導入 lodash 庫:import { debounce } from 'lodash';使用 debounce 函數創建截流函數:const debouncedFunction = debounce(() =&gt; { / 邏輯 / }, 500);調用截流函數,控制函數在 500 毫秒內最多被調用一次。

See all articles