日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > vue >内容正文

vue

Vue 组件间通信方法汇总

發(fā)布時間:2025/7/14 vue 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Vue 组件间通信方法汇总 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Vue 組件間通信方法匯總

?? 更多前端技術(shù)和知識點,搜索訂閱號 JS 菌 訂閱

除了使用 Vuex 方法外,vue 提供了各種各樣的組件間通信的方案。文章整理一下父子組件、兄弟組件、祖先后代組件間是如何通信的。 ?

? 父子組件通信

props 和 $emit 父子組件通信

子組件有時需要與父組件進(jìn)行溝通,溝通的方式就是子組件 emit 事件,父組件通過監(jiān)聽這個事件來做進(jìn)一步動作。而父組件與子組件通信則使用 props

假設(shè)這里有一個父組件并引入了一個子組件 my-comp:

<my-comp v-for="msg in msgs" :key="msg.id" :msg="msg"></my-comp> 復(fù)制代碼

父組件有一系列 msg 數(shù)據(jù)需要通過子組件渲染,將 msg 作為 prop 傳遞給子組件即可:

import MyComp from '@/components/MyComp.vue'export default {name: 'home',components: {MyComp},data () {return {msgs: [{id: 1, data: 'hello js'}, {id: 2, data: 'css world'}, {id: 3, data: 'animated style'}]}} } 復(fù)制代碼

我們通過點擊子組件每一項觸發(fā)一個事件,父組件監(jiān)聽這個事件去動態(tài)改變子組件的 color 樣式,這就是父組件監(jiān)聽子組件事件,事件處理函數(shù)可以從子組件傳遞值給父組件:

<my-comp v-for="msg in msgs" :key="msg.id" :msg="msg" :colored="colored" @handle-change-color="handleChangeColor"></my-comp> 復(fù)制代碼

首先增加一個事件 handle-change-color 當(dāng)這個事件被觸發(fā)時修改名為 color 的 data,然后將 colored 通過 props 傳入到子組件:

import MyComp from '@/components/MyComp.vue'export default {name: 'home',components: { // 注冊組件MyComp},data () {return {colored: false, // 狀態(tài)msgs: [{id: 1, data: 'hello js'}, {id: 2, data: 'css world'}, {id: 3, data: 'animated style'}]}},methods: {handleChangeColor () {this.colored = !this.colored // 監(jiān)聽事件動態(tài)改變 colored}// handleChangeColor (param) { // 子組件觸發(fā)的事件可能包含參數(shù)} } 復(fù)制代碼

然后編輯子組件:

<div><div @click="handleClick" :style="{color}">{{msg.id}} - {{msg.data}} ?</div> </div> 復(fù)制代碼

首先渲染數(shù)據(jù),并監(jiān)聽 click 點擊事件,當(dāng)點擊觸發(fā)事件處理函數(shù) handleClick

export default {name: 'MyComp',computed: {color () { // color 為樣式return this.colored ? 'red' : 'black' // 根據(jù)父組件傳入的 props 動態(tài)修改樣式}},props: ['msg', 'colored'],methods: {handleClick (e) {this.$emit('handle-change-color') // 使用 $emit 方法觸發(fā)父組件 handle-change-color 事件// this.$emit('handler', 'param') // 還可以給事件傳遞參數(shù)}} } 復(fù)制代碼

子組件接收 colored 父組件傳遞來的 prop,返回一個計算后的屬性 color,根據(jù) colored 返回不同樣式。handleClick 處理當(dāng)子組件元素被點擊時 $emit 派發(fā)父組件的 handle-change-color 事件

效果如下:

父組件 $children 操作子組件

使用 $children 操作子組件。如上述例子中,colored 被定義在父組件中,可以將其移動到子組件中,并在父組件通過 $children 訪問到子組件:

<template><div @click="handleClick" class="home"><my-comp v-for="msg in msgs" :key="msg.id" :msg="msg"></my-comp></div> </template> 復(fù)制代碼

handleClick 事件被放置在 div 中

import MyComp from '@/components/MyComp.vue'export default {// ...data () {return {msgs: [{// ...}]}},methods: {handleClick () {this.$children.forEach(child => {child.$data.colored = !child.$data.colored // 逐一控制子組件的 $data})}} } 復(fù)制代碼

在子組件中不需要 $emit 事件,只需維護(hù)一個 data:

export default {name: 'MyComp',data () {return {colored: false // colored 狀態(tài)}},computed: {color () {return this.colored ? 'red' : 'black'}},props: ['msg'] } 復(fù)制代碼

子組件 $parent 訪問父組件

子組件可通過 $parent 來修改父組件的 $data,因此 colored 定義在父組件中。

<template><div class="home"><my-comp v-for="msg in msgs" :key="msg.id" :msg="msg" :colored="colored"></my-comp></div> </template> 復(fù)制代碼

通過 prop 傳遞 colored 參數(shù)給子組件

import MyComp from '@/components/MyComp.vue'export default {name: 'home',components: {MyComp},data () {return {colored: false, // 父組件維護(hù)一個 colored 狀態(tài)msgs: [{// ...}]}} } 復(fù)制代碼

父組件定義 colored 狀態(tài)

<template><div><div @click="handleClick" :style="{color}">{{msg.id}} - {{msg.data}} ?</div></div> </template> 復(fù)制代碼

子組件渲染 msg 并監(jiān)聽 click 事件

export default {// ...props: ['msg', 'colored'],methods: {handleClick (e) {this.$parent.$data.colored = !this.$parent.$data.colored}} } 復(fù)制代碼

通過 $parent 訪問父組件,并修改 $data 狀態(tài)

? 非父子組件通信

中央事件總線

我們可以使用使用中央事件總線來處理非父子組件間的通信

具體步驟是創(chuàng)建一個 Vue 實例,然后 $on 監(jiān)聽事件,$emit 來派發(fā)事件

// src/eventBus.jsimport Vue from 'vue' export default new Vue() 復(fù)制代碼

首先創(chuàng)建并導(dǎo)出一個 Vue 實例

import bus from '@/eventbus'export default {// ...methods: {handleClick (e) {bus.$emit('change-color')}} } 復(fù)制代碼

后代元素 $emit 觸發(fā) eventBus 的事件

import bus from '@/eventbus'export default {// ...mounted () {bus.$on('change-color', () => {this.colored = !this.colored})} } 復(fù)制代碼

祖先元素 $on 方法監(jiān)聽 eventBus 的事件

provide/inject

適用于祖先和后代關(guān)系的組件間的通信,祖先元素通過 provide 提供一個值,后代元素則通過 inject 獲取到這個值。這個值默認(rèn)是非響應(yīng)的,如果是對象那么則是響應(yīng)式的:

export default {name: 'home',provide () {return {colored: this.colored // 依賴于 data}},components: {MyComp},data () {return {colored: { // 必須為對象value: false},msgs: [{ // ... 復(fù)制代碼

首先通過 provide 對外提供一個 colored,這個屬性依賴于 data 中的 colored,該變量必須為一個對象,才是響應(yīng)式的。

?? 必須為一個對象

methods: {handleChangeColor () {this.colored.value = !this.colored.value}} 復(fù)制代碼

祖先組件監(jiān)聽事件或其他途徑去修改 data 改變狀態(tài)。

export default {name: 'MyComp',inject: ['colored'], // inject coloredcomputed: {color () {return this.colored.value ? 'red' : 'black' // do more...}}, // ... 復(fù)制代碼

后代組件通過 inject 獲取到祖先組件提供的對象,根據(jù)對象做進(jìn)一步動作。

$root 直接訪問根組件

根據(jù)官方的文檔,我們可以通過 $root 來直接訪問到 Vue 實例

比方說將數(shù)據(jù)存儲在 Vue 實例中:

// src/main.jsnew Vue({data () {return { // 在這里!!colored: false}},router,store,render: h => h(App) }).$mount('#app') 復(fù)制代碼

然后我們在其他各個組件中都能夠使用:

export default {name: 'MyComp',// ...mounted () {console.log(this.$root) // 直接訪問到根組件},// ... } 復(fù)制代碼

請關(guān)注我的訂閱號,不定期推送有關(guān) JS 的技術(shù)文章,只談技術(shù)不談八卦 ?

轉(zhuǎn)載于:https://juejin.im/post/5cb5ac246fb9a068b748af2b

總結(jié)

以上是生活随笔為你收集整理的Vue 组件间通信方法汇总的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 韩国毛片视频 | 777片理伦片在线观看 | 欧美在线网站 | 国产日韩一区二区在线 | 国产精品视频1区 | xxx黄色片 | 亚洲国产免费看 | 男女一区二区三区 | 北京少妇xxxx做受 | 伊人久久国产 | av黄色影院| 日本美女全裸 | 日韩精品――中文字幕 | 日韩和欧美的一区二区 | av网站观看 | 亚洲精品久久久久久 | 日本一区二区三区电影在线观看 | 影音先锋成人在线 | 日韩欧美黄色 | 国产伦精品一区二区三区网站 | 奇米影视狠狠 | 五月婷婷色综合 | 亚洲三级影视 | 精品无码人妻一区二区三区品 | 337p粉嫩大胆噜噜噜亚瑟影院 | 欧美体内she精高潮 日韩一区免费 | av视屏| 狠狠操亚洲 | 日本熟妇一区二区三区 | 91 在线视频 | 深夜视频一区二区 | 99这里有精品 | 欧美视频一区二区三区在线观看 | 婷婷人体 | 狠狠人妻久久久久久综合 | 青青草视频免费观看 | 秘密基地动漫在线观看免费 | 尤物视频在线免费观看 | 一级a性色生活片久久无 | 美女黄色小视频 | 亚洲国产成人精品91久久久 | 欧美日一区二区 | 日本免费成人 | 日韩三级黄 | 一区二区三区四区在线视频 | 欧美黑粗硬 | 欧美日韩一区二区三区电影 | 久久一区欧美 | 操女人的逼逼 | 操在线视频| 爱情岛论坛亚洲线路一 | 亚洲性大片 | 成人黄色在线播放 | 日本中文视频 | 五月天婷婷导航 | 日本男女激情视频 | 香蕉精品视频在线观看 | 天天色天天爱 | 91爱国产 | 一级国产精品 | 特种兵之深入敌后 | 国产一区二区三区四区 | 高清av在线 | 三级特黄 | 欧美久久成人 | 黑人精品欧美一区二区蜜桃 | 用力插视频 | 91视频青青草 | 日本3级网站 | 天天草天天摸 | 91精品视频免费 | 国产成人无码一区二区三区在线 | 日本黄色免费看 | 亚洲色图p | 色妻影院 | 亚洲v| 亚洲另类欧美日韩 | 欧美日韩国产一级 | 一本久道视频一本久道 | 香蕉视频免费在线观看 | 黑人中文字幕一区二区三区 | 欧美精品激情 | 色婷婷久久久 | av在线播放网 | bbbbbbbbb毛片大片按摩 | 免费亚洲一区 | 国产色a | 18男女无套免费视频 | 99国产精品久久久久99打野战 | 中文文字幕一区二区三三 | 人妖天堂狠狠ts人妖天堂狠狠 | 精品无码m3u8在线观看 | 国产精品国产三级国产传播 | 免费av一区二区三区 | 99热这里只有精品在线观看 | 亚洲成人18| 综合久久91| 午夜三级福利 | 帮我拍拍漫画全集免费观看 |