首頁 > web前端 > js教程 > 主體

4種Vue組件通訊方式實例分享

小云云
發布: 2018-02-07 14:23:24
原創
2427 人瀏覽過

本文主要和大家分享4種Vue元件通訊方式:父子元件的通訊、非父子元件的eventBus通訊、利用本機快取實作元件通訊、Vuex通訊。希望能幫助大家。

第一種通訊方式:父子元件通訊

父元件傳遞資料給子元件

  • #父元件總共需要做4件事

    • 1.import son from './son.js' 引入子元件son

    • 2.在components : { "son"} 裡註冊所有子元件名稱

    • 3.在父元件的template應用子元件,

    • #4.如果需要傳遞資料給子元件,就在template模板裡寫

           
 // 1.引入子组件 
     import counter from './counter'     import son from './son'
登入後複製
// 2.在ccmponents里注册子组件    components : {
        counter,
        son
    },
登入後複製
           
// 3.在template里使用子组件   <son></son>
登入後複製
  • 子元件只需要做1件事

    • 1.用props接受資料,就可以直接使用資料

    • #1.用props接受資料,就可以直接使用資料

2.子元件接受到的資料,不能去修改。如果你的確需要修改,可以用計算屬性,或把資料賦值給子元件data裡的一個變數

  •            
     // 4.如果需要传递数据,也是在templete里写
     
       <counter :num="number"></counter>
    登入後複製
            #   
       // 1.用Props接受数据      props: [               'num'
               ],
    登入後複製
    ##子元件傳遞資料元件向父元件所示給父元件一樣給父元件

    子元件傳送資料給父元件
    • #子元件到子元件向父元件傳遞資料給父元件
    • #父元件總共需要做2件事
    • #在template裡定義事件
    ##在methods裡寫函數,監聽子組件的事件觸發
  •            
// 2.如果需要修改得到的数据,可以这样写
   props: [            'num'
        ],  data () {        return {
            number : this.num
        }
    },
登入後複製
           
// 1. 在templete里应用子组件时,定义事件changeNumber
      <counter :num="number"                 @changeNumber="changeNumber"
      >
      </counter>
登入後複製

思考

在資料變更後,用$emit觸發即可

           

// 2. 用changeNumber监听事件是否触发
        methods: {
            changeNumber(e){                console.log('子组件emit了',e);                this.number = e
            },
        }
登入後複製
第二種通訊方式: eventBus
  • #eventBus這種通訊方式,針對的是非父子組件之間的通信,它的原理還是透過事件的觸發和監聽。

    但是因為是非父子組件的關係,他們需要有一個中間組件來連接。
  • 我是使用的透過在根元件,也就是#app元件上定義了一個所有元件都可以存取的元件,具體使用方式如下

    使用eventBus傳遞資料,我們一共需要做3件事情
  • 1.給app元件添加Bus屬性(這樣所有元件都可以透過this.$root.Bus存取到它,而且不需要引入任何檔案)

2.在元件1裡,this.$root.Bus.$emit觸發事件


3.在元件2裡,this. $root.Bus.$on監聽事件

           
// 1. 子组件在数据变化后,用$emit触发即可,第二个参数可以传递参数
        methods: {
            increment(){                    this.number++                    this.$emit('changeNumber', this.number)
                },
        }
登入後複製
           
// 1.在main.js里给app组件,添加bus属性import Vue from 'vue'new Vue({
  el: '#app',
  components: { App },  template: '<App/>',
  data(){    return {
      Bus : new Vue()
    }
  }
})
登入後複製
       

// 2.在组件1里,触发emitincrement(){
        this.number++
        this.$root.Bus.$emit('eventName', this.number)
    },
登入後複製
 
// 3.在组件2里,监听事件,接受数据mounted(){    this.$root.Bus.$on('eventName', value => {        this.number = value
        console.log('busEvent');
    })
},
登入後複製
    中之前使用中這樣溝通方式)     #rrrereeesion#3 月來說明這種溝通方式:狀態比較混亂,不太容易維持。

透過window.localStorage.getItem(key) 取得資料
透過window.localStorage.setItem(key,value) 儲存資料

注意用JSON.parse() / JSON.stringify () 做資料格式轉換。

第四種通訊方式: 利用Vuex

Vuex比較複雜,可以單獨寫一篇

相關推薦:

Vue組件化開發經驗分享

######vue元件父與子通訊詳解############權限管理模組中動態載入Vue元件實例詳解### ###

以上是4種Vue組件通訊方式實例分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!