最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue組件間通信方法總結(jié)(父子組件、兄弟組件及祖先后代組件間)

 更新時(shí)間:2019年04月17日 09:07:59   作者:JS菌  
這篇文章主要給大家介紹了關(guān)于Vue組件間通信的相關(guān)資料,其中包括父子組件、兄弟組件及祖先后代組件間的通信,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

🌊 父子組件通信

props 和 $emit 父子組件通信

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

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

<my-comp v-for="msg in msgs" :key="msg.id" :msg="msg"></my-comp>

父組件有一系列 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'
 }]
 }
 }
}

我們通過點(diǎn)擊子組件每一項(xiàng)觸發(fā)一個(gè)事件,父組件監(jiān)聽這個(gè)事件去動(dòng)態(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>

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

import MyComp from '@/components/MyComp.vue'

export default {
 name: 'home',
 components: { // 注冊(cè)組件
 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)聽事件動(dòng)態(tài)改變 colored
 }
 // handleChangeColor (param) { // 子組件觸發(fā)的事件可能包含參數(shù)
 }
}

然后編輯子組件:

<div>
 <div @click="handleClick" :style="{color}">
 {{msg.id}} - {{msg.data}} ⭕
 </div>
</div>

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

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

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

效果如下:

父組件 $children 操作子組件

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

<template>
 <div @click="handleClick" class="home">
 <my-comp v-for="msg in msgs" :key="msg.id" :msg="msg"></my-comp>
 </div>
</template>

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
 })
 }
 }
}

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

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

子組件 $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>

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

import MyComp from '@/components/MyComp.vue'

export default {
 name: 'home',
 components: {
 MyComp
 },
 data () {
 return {
 colored: false, // 父組件維護(hù)一個(gè) colored 狀態(tài)
 msgs: [{
  // ...
 }]
 }
 }
}

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

<template>
 <div>
 <div @click="handleClick" :style="{color}">
 {{msg.id}} - {{msg.data}} ⭕
 </div>
 </div>
</template>

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

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

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

非父子組件通信

中央事件總線

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

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

// src/eventBus.js

import Vue from 'vue'
export default new Vue()

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

import bus from '@/eventbus'

export default {
 // ...
 methods: {
 handleClick (e) {
  bus.$emit('change-color')
 }
 }
}

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

import bus from '@/eventbus'

export default {
 // ...
 mounted () {
 bus.$on('change-color', () => {
  this.colored = !this.colored
 })
 }
}

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

provide/inject

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

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

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

⚠️ 必須為一個(gè)對(duì)象

 methods: {
 handleChangeColor () {
  this.colored.value = !this.colored.value
 }
 }

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

export default {
 name: 'MyComp',
 inject: ['colored'], // inject colored
 computed: {
 color () {
  return this.colored.value ? 'red' : 'black' // do more...
 }
 },
// ...

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

$root 直接訪問根組件

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

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

// src/main.js

new Vue({
 data () {
 return { // 在這里?。?
  colored: false
 }
 },
 router,
 store,
 render: h => h(App)
}).$mount('#app')

然后我們?cè)谄渌鱾€(gè)組件中都能夠使用:

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

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Vue實(shí)現(xiàn)訂單支付倒計(jì)時(shí)功能

    Vue實(shí)現(xiàn)訂單支付倒計(jì)時(shí)功能

    這篇文章主要給大家介紹了Vue實(shí)現(xiàn)訂單支付倒計(jì)時(shí)功能,倒計(jì)時(shí)這要運(yùn)用在創(chuàng)建訂單后15分鐘內(nèi)進(jìn)行支付,否則訂單取消,本文結(jié)合示例代碼給大家詳細(xì)講解,需要的朋友可以參考下
    2023-08-08
  • 利用vue+elementUI設(shè)置省市縣三級(jí)聯(lián)動(dòng)下拉列表框的詳細(xì)過程

    利用vue+elementUI設(shè)置省市縣三級(jí)聯(lián)動(dòng)下拉列表框的詳細(xì)過程

    在做電商項(xiàng)目的時(shí)候需要添加修改收貨地址,如何實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)選取省市區(qū)地址困擾了我不少時(shí)間,這篇文章主要給大家介紹了關(guān)于利用vue+elementUI設(shè)置省市縣三級(jí)聯(lián)動(dòng)下拉列表框的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • vue-cli的webpack模板項(xiàng)目配置文件分析

    vue-cli的webpack模板項(xiàng)目配置文件分析

    本篇文章主要對(duì)vue-cli的webpack模板項(xiàng)目配置文件進(jìn)行分析。具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-04-04
  • vue使用axios導(dǎo)出后臺(tái)返回的文件流為excel表格詳解

    vue使用axios導(dǎo)出后臺(tái)返回的文件流為excel表格詳解

    這篇文章主要介紹了vue使用axios導(dǎo)出后臺(tái)返回的文件流為excel表格方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Vue body樣式修改方式

    Vue body樣式修改方式

    這篇文章主要介紹了Vue body樣式修改方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • vue中的el-form表單rule校驗(yàn)問題(特殊字符、中文、數(shù)字等)

    vue中的el-form表單rule校驗(yàn)問題(特殊字符、中文、數(shù)字等)

    這篇文章主要介紹了vue中的el-form表單rule校驗(yàn)問題(特殊字符、中文、數(shù)字等),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • vue中如何進(jìn)行異步請(qǐng)求

    vue中如何進(jìn)行異步請(qǐng)求

    前端的數(shù)據(jù)均是通過接口請(qǐng)求拿到的,而Vue本身不支持ajax請(qǐng)求,那么該怎么解決Vue中的異步請(qǐng)求呢?這兒提供了幾種方法,希望對(duì)大家有所幫助
    2022-05-05
  • vue中Form 表單的 resetFields() 失效原因及問題解決

    vue中Form 表單的 resetFields() 失效原因及問題解決

    在Vue項(xiàng)目中,使用formRef.value.resetFields()方法重置表單時(shí)可能遇到不起作用的問題,下面就來介紹一下如何解決,感興趣的可以了解一下
    2024-09-09
  • vue模版編譯詳情

    vue模版編譯詳情

    本文的初衷是想讓更多哎學(xué)習(xí)的人知道并了解vue模版編譯,所以文中主要以階段流程為主,不會(huì)涉及過多的底層代碼邏輯,需要的朋友可以參考一下
    2021-09-09
  • vue封裝echarts組件,數(shù)據(jù)動(dòng)態(tài)渲染方式

    vue封裝echarts組件,數(shù)據(jù)動(dòng)態(tài)渲染方式

    這篇文章主要介紹了vue封裝echarts組件,數(shù)據(jù)動(dòng)態(tài)渲染方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12

最新評(píng)論

高碑店市| 镇安县| 民丰县| 博罗县| 盐边县| 吴川市| 阳新县| 元谋县| 洪湖市| 禹城市| 化德县| 乌拉特前旗| 城口县| 沾益县| 宜昌市| 平舆县| 奇台县| 沙雅县| 汨罗市| 仙居县| 湖口县| 宁国市| 林周县| 定南县| 乌拉特前旗| 都匀市| 宜阳县| 延津县| 礼泉县| 河曲县| 遵义市| 长寿区| 巴楚县| 裕民县| 邹城市| 准格尔旗| 通化市| 永登县| 曲周县| 德令哈市| 扶绥县|