vue的$emit 與$on父子組件與兄弟組件的之間通信

来源:https://www.cnblogs.com/beyonds/archive/2018/05/13/9030619.html
-Advertisement-
Play Games

本文主要對vue 用$emit 與 $on 來進行組件之間的數據傳輸. 主要的傳輸方式有三種: 1.父組件到子組件通信 2.子組件到父組件的通信 3.兄弟組件之間的通信 一、父組件傳值給子組件 父組件給子組件傳子,使用props 2.子組件到父組件的通信 使用 $emit(eventname,opt ...


本文主要對vue 用$emit 與 $on 來進行組件之間的數據傳輸.

主要的傳輸方式有三種:

1.父組件到子組件通信

2.子組件到父組件的通信

3.兄弟組件之間的通信

 

一、父組件傳值給子組件

父組件給子組件傳子,使用props

//父組件:parent.vue
<template>
    <div>
        <child :vals = "msg"></child>
    </div>
</template>
<script>
import child from "./child";
export default {
    data(){
        return {
            msg:"我是父組件的數據,將傳給子組件"
        }
    },
    components:{
        child
    }
}
</script>


//子組件:child.vue
<template>
    <div>
        {{vals}}
    </div>
</template>
<script>
export default {
      props:{ //父組件傳值 可以是一個數組,對象
        vals:{
            type:String,//類型為字元竄
          default:"123" //可以設置預設值
        }
    },
}
</script>

 

2.子組件到父組件的通信

使用 $emit(eventname,option) 觸發事件, 參數一:自定義事件名稱,寫法,小寫或者用-連接,如event,event-name 不能寫駝峰寫法(eventName) 子組件給父組件傳值,可以在子組件中使用$emit觸發事件的值傳出去,父組件通過事件監聽,獲取數據   但是,這裡有一個問題, 1、究竟是由子組件內部主動傳數據給父組件,由父組件監聽接收(由子組件中操作決定什麼時候傳值) 2、還是通過父組件決定子組件什麼時候傳值給父組件,然後再監聽接收 (由父組件中操作決定什麼時候傳值) 兩種情況都有 2.1 : $meit事件觸發,通過子組件內部的事件觸發自定義事件$emit 2.2 : $meit事件觸發, 可以通過父組件操作子組件 (ref)的事件來觸發 自定義事件$emit 第一種情況:
//父組件:parent.vue
<template>
    <div>
        <child  v-on:childevent='wathChildEvent'></child>
        <div>子組件的數據為:{{msg}}</div>
    </div>
</template>
<script>
import child from "./child";
export default {
    data(){
        return{
            msg:""
        }
    },
    components:{
        child
    },
    methods:{
        wathChildEvent:function(vals){//直接監聽 又子組件觸發的事件,參數為子組件的傳來的數據
            console.log(vals);//結果:這是子組件的數據,將有子組件操作觸發傳給父組件
            this.msg = vlas;
        } 
    }
}
</script>

//子組件:child.vue
<template>
    <div>
       <input type="button" value="子組件觸發" @click="target">
    </div>
</template>
<script>
export default {
    data(){
            return {
            texts:'這是子組件的數據,將有子組件操作觸發傳給父組件'
            }
    },
    methods:{
        target:function(){ //有子組件的事件觸發 自定義事件childevent
            this.$emit('childevent',this.texts);//觸發一個在子組件中聲明的事件 childEvnet
        }
    },
}
</script>

第二種情況:

//父組件:parent.vue
<template>
    <div>
        <child  v-on:childevent='wathChildEvent' ref="childcomp"></child>
        <input type="button" @click="parentEnvet" value="父組件觸發" />
        <div>子組件的數據為:{{msg}}</div>
    </div>
</template>
<script>
import child from "./child";
export default {
    data(){
        return{
            msg:""
        }
    },
    components:{
        child
    },
    methods:{
        wathChildEvent:function(vals){//直接監聽 又子組件觸發的事件,參數為子組件的傳來的數據
            console.log(vals);//這是子組件的數據,將有子組件操作觸發傳給父組件
            this.msg = vlas;
        },
        parentEnvet:function(){
            this.$refs['childcomp'].target(); //通過refs屬性獲取子組件實例,又父組件操作子組件的方法觸發事件$meit
        }
    }
}
</script>

//子組件:child.vue
<template>
    <div>
      <!-- dothing..... -->
    </div>
</template>
<script>
export default {
    data(){
            return {
            texts:'這是子組件的數據,將有子組件操作觸發傳給父組件'
            }
    },
    methods:{
        target:function(){ //又子組件的事件觸發 自定義事件childevent
            this.$emit('childevent',this.texts);//觸發一個在子組件中聲明的事件 childEvnet
        }
    },
}
</script>

將兩者情況對比,區別就在於$emit 自定義事件的觸發是有父組件還是子組件去觸發

第一種,是在子組件中定義一個click點擊事件來觸發自定義事件$emit,然後在父組件監聽

第二種,是在父組件中第一一個click點擊事件,在組件中通過refs獲取實例方法來直接觸發事件,然後在父組件中監聽

 

3.兄弟組件之間的通信

 (1)、兄弟之間傳遞數據通過事件  (2)、創建一個新Vue的實例,讓各個兄弟共用同一個事件機制。(關鍵點)  (3)、傳遞數據方,通過事件觸發$emit(方法名,傳遞的數據)。  (4)、接收數據方,在mounted()鉤子函數(掛載實例)中 觸發事件$on(方法名,callback(接收數據的數據)),此時callback函數中的this已經發生了改變,可以使用箭頭函數。
//建立一個空的Vue實例,將通信事件掛載在該實例上
//emptyVue.js
import Vue from 'vue'
export default new Vue()

//兄弟組件a:childa.vue
<template>
    <div>
        <span>A組件->{{msg}}</span>
        <input type="button" value="把a組件數據傳給b" @click ="send">
    </div>
</template>
<script>
import vmson from "./emptyVue"
export default {
    data(){
        return {
            msg:"我是a組件的數據"
        }
    },
    methods:{
        send:function(){
            vmson.$emit("aevent",this.msg)
        }
    }
}
</script>


//兄弟組件b:childb.vue
<template>
     <div>
        <span>b組件,a傳的的數據為->{{msg}}</span>
    </div>
</template>
<script>
import vmson from "./emptyVue"
export default {
 data(){
        return {
            msg:""
        }
    },
    mounted(){
        vmson.$on("aevent",(val)=>{//監聽事件aevent,回調函數要使用箭頭函數;
            console.log(val);//列印結果:我是a組件的數據
            this.msg = val;
        })
    }
}
</script>


//父組件:parent.vue
<template>
    <div>
        <childa><childa>
        <childb></childb>
    </div>
</template>
<script>
import childa from "./childa";
import childb from "./childb";
export default {
    data(){
        return{
            msg:""
        }
    },
    components:{
        childa,
        childb
    },
  
}
</script>

 

到此,vue中的組件通信傳值基本可以搞定了,但是對於大型複雜的項目,建議採用vuex 狀態管理更適合....

推薦參考學習:https://vuex.vuejs.org/zh-cn/

          https://cn.vuejs.org/v2/api/#vm-emit

         https://cn.vuejs.org/v2/api/#vm-on

 

 完結。。。謝謝


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

-Advertisement-
Play Games
更多相關文章
  • 最的mysql在裝的時候就可以設置 ,但是低版本的好像不行,需要在裝了以後才能設置。 mac下,mysql5.7.18連接出錯,錯誤信息為:Access denied for user 'root'@'localhost' (using password: YES) ()裡面的為shell中輸入的命 ...
  • 在ubuntu系統中操作命令:登錄:mysql -uroot -p啟動:service mysql start停止:service mysql stop重啟:service mysql restart 創建資料庫:create database 資料庫名字 charset = utf8;刪除資料庫: ...
  • 1、Default模式,也是沒有設置緩存模式時的預設模式 這個模式實現http協議中的內容,比如響應碼是304時,當然還會結合E-Tag和LastModify等頭。 StringRequest request = new StringRequest(url, method); request.set ...
  • NoHttp請求自動維持Cookie: 1.支持Session、Cookie、臨時Cookie的位置。 2.支持App重啟、關機開機後繼續持久化維持。 3.提供了介面,允許開發者監聽Cookie的變化,也可以改變某個Cookie的值。 伺服器端: 客戶端: 文章:https://blog.csdn. ...
  • 原文 http://blog.votzone.com/2018/05/12/apk-merge.html 之前接手過一個sdk的開發工作,在開發過程中有一個很重要的點就是儘量使用代碼來創建控制項,資源文件最好放到assets目錄下,如果必須使用res資源,需要通過 getResources().get ...
  • bean實體類請求: 1.bean 2.針對bean的request 3.具體在activity中使用: 可以解析所有JavaBean的自定義請求 activity ...
  • NoHttpActivity CallServer: ResponseListener: HttpCallBack FastJsonRequest:自定義FastJsonRequest對象,所有的自定義對象都要繼承{@link RestReqeust} WaitDialog: Constants ...
  • 1. 全局安裝 2. 項目本地安裝 首先建立項目目錄,在命令行下進入項目目錄。並依次執行以下命令: 3. webpack的升級 全新webpack的升級。將“node_modules”目錄刪除,然後執行安裝命令: 已依賴了很多module老項目下webpack的升級。首先修改“package.jso ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...