Vue組件間通信方式

来源:https://www.cnblogs.com/jiajialove/archive/2019/09/11/11507386.html
-Advertisement-
Play Games

一.Props傳遞數據 當前組件接收到的 props 對象。Vue 實例代理了對其 props 對象屬性的訪問。在父組件中使用子組件,本質通過v-bind綁定屬性傳入子組件,子組件通過props接收父組件傳入的屬性。 二.$emit使用 觸發當前實例上的事件。附加參數都會傳給監聽器回調。子組件觸發父 ...


一.Props傳遞數據

  當前組件接收到的 props 對象。Vue 實例代理了對其 props 對象屬性的訪問。在父組件中使用子組件,本質通過v-bind綁定屬性傳入子組件,子組件通過props接收父組件傳入的屬性。

<template>
 <div>
  父組件:{{mny}}
  <Son1 :mny="mny"></Son1>
 </div>
</template>
<script>
import Son1 from "./Son1";
export default {
 components: {
  Son1
 },
 data() {
  return { mny: 100 };
 }
};
</script>

二.$emit使用

  觸發當前實例上的事件。附加參數都會傳給監聽器回調。子組件觸發父組件方法,通過回調的方式將修改的內容傳遞給父組件,父組件通過v-on接收子組件傳入的方法,並接收子組件傳入的參數。

<template>
 <div>
  父組件:{{mny}}
  <Son1 :mny="mny" @input="change"></Son1>
 </div>
</template>
<script>
import Son1 from "./Son1";
export default {
 methods: {
  change(mny) {
   this.mny = mny;
  }
 },
 components: {
  Son1
 },
 data() {
  return { mny: 100 };
 }
};
</script>

子組件觸發綁定自己身上的方法

<template>
 <div>
  子組件1: {{mny}}
  <button @click="$emit('input',200)">更改</button>
 </div>
</template>
<script>
export default {
 props: {
  mny: {
   type: Number
  }
 }
};
</script>

同步父子組件的數據,->子組件上使用的語法糖的寫法 (.sync和v-model寫法),v-model和.sync的區別在於v-model觸發的事件只能是input,而.sync可以自定義事件名

.sync

  對一個 prop 進行“雙向綁定”, 推薦以 update:myPropName 的模式觸發事件取而代之,然後父組件可以監聽那個事件並根據需要更新一個本地的數據屬性。

<Son1 :mny.sync="mny"></Son1>
<!-- 觸發的事件名 update:(綁定.sync屬性的名字) -->
<button @click="$emit('update:mny',200)">更改</button>

v-model

一個組件上的 v-model 預設會利用名為 value 的 prop 和名為 input 的事件.

<Son1 v-model="mny"></Son1>
<template>
 <div>
  子組件1: {{value}} // 觸發的事件只能是input
  <button @click="$emit('input',200)">更改</button>
 </div>
</template>
<script>
export default {
 props: {
  value: { // 接收到的屬性名只能叫value
   type: Number
  }
 }
};
</script>

三.$parent、$children

  $parent:  指定已創建的實例之父實例,在兩者之間建立父子關係。子實例可以用 this.$parent 訪問父實例,子實例被推入父實例的 $children 數組中。

  $children:  當前實例的直接子組件。需要註意 $children 並不保證順序,也不是響應式的。如果你發現自己正在嘗試使用 $children 來進行數據綁定,考慮使用一個數組配合 v-for 來生成子組件,並且使用 Array 作為真正的來源。

<Grandson1 :value="value"></Grandson1>
<template>
 <div>
  孫子:{{value}}
  <!-- 調用父組件的input事件 -->
  <button @click="$parent.$emit('input',200)">更改</button>
 </div>
</template>
<script>
export default {
 props: {
  value: {
   type: Number
  }
 }
};
</script>

四.$attrs、$listeners

$attrs:批量向下傳入屬性

  包含了父作用域中不作為 prop 被識別 (且獲取) 的特性綁定 (class 和 style 除外)。

<Son2 name="小明" age="10"></Son2>

<!-- 可以在son2組件中使用$attrs屬性,可以將屬性繼續向下傳遞 -->
<div>
  兒子2: {{$attrs.name}}
  <Grandson2 v-bind="$attrs"></Grandson2>
</div>


<template>
 <div>孫子:{{$attrs}}</div>
</template>

$listeners:批量向下傳入方法

  包含了父作用域中的 (不含 .native 修飾器的) v-on 事件監聽器。

<Son2 name="小珠峰" age="10" @click="()=>{this.mny = 500}"></Son2>
<!-- 可以在son2組件中使用listeners屬性,可以將方法繼續向下傳遞 -->
<Grandson2 v-bind="$attrs" v-on="$listeners"></Grandson2>

<button @click="$listeners.click()">更改</button>

五.Provide & Inject

依賴註入原理,provide 和 inject 主要為高階插件/組件庫提供用例。並不推薦直接用於應用程式代碼中。

Provide:在父級中註入依賴數據

  provide 選項應該是一個對象或返回一個對象的函數。該對象包含可註入其子孫的屬性。

provide() {
  return { parentMsg: "父親" };
},

Inject:在任意子組件中可以註入父級數據

inject: ["parentMsg"] // 會將數據掛載在當前實例上

六.Ref使用

  一個對象,持有註冊過 ref 特性的所有 DOM 元素和組件實例。可以在父組件中獲取子組件的屬性和方法。

<Grandson2 v-bind="$attrs" v-on="$listeners" ref="grand2"></Grandson2>
mounted() { // 獲取組件定義的屬性
  console.log(this.$refs.grand2.name);
}

七.EventBus

用於跨組件通知(不複雜的項目可以使用這種方式)

Vue.prototype.$bus = new Vue();

在vue原型對象上添加一個公共發放,暴露vue示例,供組件接收方法

mounted() {
   this.$bus.$emit("my", "我是Grandson1");
 },

兄弟間組件接收方法

mounted() {
  this.$bus.$on("my", data => {
   console.log(data);
  });
 },

八.Vuex通信

全局統一狀態管理,用於大型項目組件間通信,管理數據狀態。

vue所有通信方式總結,嗯,就醬啦~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先我們準備蘋果手機一臺,數據線一根,然後連接到電腦。 1.電腦安裝iTunes 軟體,網址:http://soft.onlinedown.net/soft/279734.htm 安裝完成之後打開iTunes ,此時蘋果設備應該會彈出授權,點擊允許就行。 進入這個界面之後,證明我們已經成功連接到蘋果 ...
  • 在開發者模式下,在開發者選項中,可以勾選“顯示觸摸操作”,然後只要點擊屏幕就會在點擊的位置有圈圈顯示。如何找到繪製圈圈的代碼部分,有什麼技巧來閱讀代碼量這麼大的android系統源碼呢?以下請跟著小老弟我來一起分析吧。 1. android設置功能的代碼是在packages/apps/Setting ...
  • ### 簡介 最近因為項目的要求,需要把開發的模塊打包成aar,供其他項目調用,在搞了一段時間後,發現這裡還是有很多需要註意的地方,所以記錄一下,幫助大家不要走彎路。 **首先何為aar包?** ![](https://img2018.cnblogs.com/blog/1312938/201909/ ...
  • Vue CLI 是一個基於 Vue.js 進行快速開發的完整系統,Vue CLI 致力於將 Vue 生態中的工具基礎標準化。它確保了各種構建工具能夠基於智能的預設配置即可平穩銜接,這樣你可以專註在撰寫應用上,而不必花好幾天去糾結配置的問題。與此同時,它也為每個工具提供了調整配置的靈活性。 概念 通俗 ...
  • 序 現在依舊記得第一次看到webpack3.x 版本配置時候的狀態 剛開始看到這些真的是一臉懵。希望這篇文章能幫到剛開始入門的同學。 webpack 是什麼? webpack是一個模塊化打包工具,webpack 通過入口分析項目結構,找到JavaScript模塊以及一些不能直接在瀏覽器上運行的語言、 ...
  • 博主廢話少說,直接介紹css常用的屬性和屬性值;屬性和值只需過一遍,頁面的結構還是需要佈局,佈局的只是後期會更新的。 提供一些圖標的網站:font-awesome: http://fontawesome.dashgame.com/ | iconfont: http://www.iconfont.cn ...
  • 這個例子告訴你如何使用JavaScript將網頁中的內容保存到文件。 ...
  • 如何在js中添加強類型判斷,除了ts,你還可以選擇flow. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...