Vue.js組件間通信的設計模式

作為開發人員,我們希望生成可管理和可維護的代碼,這也更易于調試和測試。為了實現這一點,我們采用了稱為模式的最佳實踐。模式是經過驗證的算法和架構,可以幫助我們以高效且可預測的方式完成特定任務。

在本教程中,我們將了解最常見的 Vue.js 組件通信模式,以及我們應該避免的一些陷阱。我們都知道,在現實生活中,沒有單一的解決方案可以解決所有問題。同樣,在 Vue.js 應用程序開發中,不存在適用于所有編程場景的通用模式。每種模式都有其自身的優點和缺點,并且適合特定的用例。

對于 Vue.js 開發人員來說,最重要的是了解所有最常見的模式,這樣我們就可以為給定的項目選擇正確的模式。這將導致正確且高效的組件通信。

為什么正確的組件通信很重要?

當我們使用 Vue.js 等基于組件的框架構建應用時,我們的目標是使應用的組件盡可能隔離。這使得它們可重用、可維護和可測試。為了使組件可重用,我們需要以更抽象和解耦(或松散耦合)的形式塑造它,因此,我們可以將其添加到我們的應用程序中或將其刪除,而不會破壞應用程序的功能。

但是,我們無法在應用程序的組件中實現完全隔離和獨立。在某些時候,它們需要相互通信:交換一些數據、更改應用程序的狀態等。因此,對于我們來說,學習如何正確完成這種通信,同時保持應用程序正常運行、靈活和可擴展非常重要。

立即學習前端免費學習筆記(深入)”;

Vue.js 組件通信概述

在 Vue.js 中,組件之間的通信主要有兩種類型:

  1. 直接的親子溝通,基于嚴格的父母與孩子以及孩子與父母的關系。
  2. 跨組件通信,其中一個組件可以與任何其他組件“對話”,無論它們之間的關系如何。

在以下部分中,我們將探討這兩種類型以及適當的示例。

直接親子溝通

Vue.js 開箱即用支持的組件通信的標準模型是通過 props 和自定義事件實現的父子模型。在下圖中,您可以直觀地看到該模型的實際效果。

Vue.js組件間通信的設計模式

如您所見,父級只能與其直接子級通信,子級也只能直接與其父級通信。在此模型中,不可能進行同級或跨組件通信。

在下面的部分中,我們將采用上圖中的組件,并在一系列實際示例中實現它們。

親子溝通

假設我們擁有的組件是游戲的一部分。大多數游戲都會在界面中的某個位置顯示游戲得分。想象一下,我們在 Parent A 組件中聲明了一個 score 變量,并且我們希望在 Child A 組件中顯示它。那么,我們怎樣才能做到這一點呢?

為了將數據從父級發送到子級,Vue.js 使用 props。傳遞屬性需要三個必要步驟:

  1. 在子級中注冊屬性,如下所示:props: [“score”]
  2. 使用子模板中注冊的屬性,如下所示:分數:{{ Score }}
  3. 將該屬性綁定到 score 變量(在父級模板中),如下所示:

讓我們探索一個完整的示例,以更好地了解實際發生的情況:

// HTML part  <div id="app">   <grand-parent></grand-parent> </div>  // JavaScript part  Vue.component('ChildB',{   template:`     <div id="child-b">       <h2>Child B</h2>       <div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">data {{ this.$data }}
? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享