Vue組件通信的方式

vue.jpg

在vue組件的使用中,相互間的傳值是普遍的現(xiàn)象,不管是父子組件間,兄弟組件間,亦或是更深層次關(guān)系組件間都是必不可少的

props/$emit

這是我們平時開發(fā)中用得最多的一種通信方式,子組件通過props屬性獲取父組件傳來的對應(yīng)數(shù)據(jù),子組件通過$emit向父組件發(fā)送消息

// 父組件
<template>
  <div class="hello">
    <Content :name="kobe" @message="childrenMessage"></Content>
  </div>
</template>

<script>
import Content from './Content'
export default {
  name: 'HelloWorld',
  methods: {
    childrenMessage (msg) {
      alert('我接受到了,子組件你上傳的信息是' + msg)
    }
  },
  components: {
    Content
  }
}
</script>

<style scoped>
h3 {
  margin: 40px 0 0;
}
ul {
  list-style-type: none;
  padding: 0;
}
li {
  display: inline-block;
  margin: 0 10px;
}
a {
  color: #42b983;
}
</style>

// 子組件
<template>
    <div class="content">
        <button @click="btnClick">{{name}}老鐵,點擊我一下下</button>
    </div>
</template>
<script>
export default {
    name: 'Content',
    props: {
        name: {
            type: String,
            default: ''
        }
    },
    methods: {
        btnClick () {
            this.$emit('message', '嘿,我向上傳遞信息了')
        }
    }
}
</script>
<style scoped>
    .content {
        width: 200px;
        height: 200px;
        background-color: aqua;
    }
</style>

父子之間通信推薦

$$emit/$on

當(dāng)兄弟組件之間需要傳值的時候我們通常會用eventBus來實現(xiàn),這個方法使通過創(chuàng)建一個vue實例,當(dāng)做$emit事件的處理中心來觸發(fā)監(jiān)聽事件

// eventBus.js
import Vue from 'vue';  
export default new Vue(); 

// content.vue
<template>
    <div class="content">
        <button @click="btnClick">{{name}}老鐵,點擊我一下下</button>
        <span>content2向我傳的是: {{siblingMsg}}</span>
    </div>
</template>
<script>
import bus from '../config/bus'
export default {
    name: 'Content',
    data () {
        return {
            siblingMsg: ''
        }
    },
    props: {
        name: {
            type: String,
            default: ''
        }
    },
    methods: {
        btnClick () {
            this.$emit('message', '嘿,我向上傳遞信息了')
        }
    },
    mounted () {
        bus.$on('siblingMsg', msg => {
            this.siblingMsg = msg
        })
    },
    destroyed () {
        bus.$off('siblingMsg')
    }
}
</script>
<style scoped>
    .content {
        width: 200px;
        height: 200px;
        background-color: aqua;
    }
</style>

// content2.vue
<template>
    <div class="content2">
        <h1>我是content2組件</h1>
        <button @click="btnClick">{{name}}老鐵,點擊我一下下</button>
        <button @click="siblingMsg">我要向content傳值</button>
    </div>
</template>
<script>
import bus from '../config/bus'
export default {
    name: 'Content',
    props: {
        name: {
            type: String,
            default: ''
        }
    },

    methods: {
        btnClick () {
            this.$emit('message', '嘿,我content2向上傳遞信息了')
        },
        siblingMsg () {
           bus.$emit('siblingMsg', '來啊,互相傷害啊') 
        }
    }
}
</script>
<style scoped>
    .content2 {
        width: 200px;
        height: 200px;
        background-color: rgb(255, 145, 0);
    }
</style>

使用eventbus的時候監(jiān)聽事件寫在mounted()中且在destroyed要銷毀,不然會造成變量污染

$$parent/$children

parent 可以用來從一個子組件訪問父組件的實例,而children可以遍歷全部子組件。也可以借助ref來訪問

provide/inject

通信方式是從上到下,不需要從下往上

// A.vue
export default {
  provide: {
    name: 'kobe bryant'
  }
}

// B.vue
export default {
  inject: ['name'],
  mounted () {
    console.log(this.name);  // 'kobe bryant
  }
}

vuex

雖然說vuex也可以做組件通信的事,但是未免有點浪費了,vuex還是做一些狀態(tài)管理比較好。像登錄信息什么的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • vue是數(shù)據(jù)驅(qū)動視圖更新的框架, 所以對于vue來說組件間的數(shù)據(jù)通信非常重要,那么組件之間如何進行數(shù)據(jù)通信的呢?首...
    云翼飛閱讀 636評論 0 0
  • 前言 組件是 vue.js最強大的功能之一,而組件實例的作用域是相互獨立的,這就意味著不同組件之間的數(shù)據(jù)無法相互引...
    用技術(shù)改變世界閱讀 2,304評論 1 3
  • Vue組件之間通信的七種方式 使用Vue也有很長一段時間,但是一直以來都沒對其組件之間的通信做一個總結(jié),這次就借此...
    豆豆_4edc閱讀 683評論 0 2
  • 組件系統(tǒng) 組件通訊是vue.js的核心之一,不管是在項目中,還是面試中,都是必考的知識點之一。組件通訊通常涉及到父...
    大臉貓的前端之路閱讀 915評論 0 3
  • 作者:黃庭麗 霧沒晨曦早,秋雨洗校園。 清早起來,望向窗外,單調(diào)的墨色渲染著天空,聲聲鳥鳴,刺穿了天空。閑閑密...
    忄and怡閱讀 316評論 0 0

友情鏈接更多精彩內(nèi)容