Vue.js中的組件通信

      網友投稿 841 2025-04-03

      注意:組件通信, 無論效果是如何的, Vue都是單向數據流(組件之間的數據通信)


      Vue.js中組件通信一共分為四種:

      父子組件通信

      子父組件通信

      非父子組件通信

      多組件狀態共享

      下面一一介紹:

      父子組件通信

      綁定的是簡單數據類型:

      父組件中定義數據, 通過單向數據綁定的形式, 將數據綁定在子組件身上, 屬性是自定義屬性

      子組件通過配置項中的props接收數據, props可以是一個數組,數組中放的是自定義屬性名稱

      那么這個自定義屬性可以向data中的數據一樣直接在子組件模板中使用

      父組件中數據一旦修改, 子組件數據就會修改, 那么這也就是單項數據流

      結構:

      I AM FATHER

      i am son

      我爸這個月給我了{{ money }}元

      子父通信

      綁定了復雜的數據類型:

      父組件中的數據是一復雜數據類型, 那么父組件綁定數據的時候, 給子組件的是一個引用地址

      子組件可以通過這個引用地址, 修改這個數據

      效果上像, 子組件和父組件通信了, 違背單項數據流

      父組件可以傳遞一個方法給子組件:

      父組件定義方法, 然后將這個方法通過單向數據綁定的形式傳遞給子組件

      子組件通過props屬性接收, 然后通過 @click = "方法名"

      通過自定義事件來實現通信:

      父組件中定義 數據 和 方法(方法時用來操作數據的)

      在子組件身上綁定自定義事件

      子組件定義方法, 在這個方法中通過 this.$emit(eventType,實際參數) 來調用自定義事件的事件處理程序

      結構:

      I 'm king

      國庫里現在有{{ gk }}元

      I 'm king

      國庫里現在有{{ gk }}元

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      //步驟1,父組件中定義數據和方法,gk,getMoney Vue.component('King',{ template:'#king', data(){ return { gk:0 } }, methods:{ getMoney(value){ this.gk+=value; } } }) //步驟3,子組件定義方法,這個方法中通過方法中通過 this.$emit(eventType,實際參數)觸發了步驟2的自定義事件 Vue.component('People',{ template:'#people', data(){ return { money:2000 } }, methods:{ giveMoney(){ this.$emit('getmoney',this.money/2) } } }) new Vue({ el:'#app' })

      1

      2

      Vue.js中的組件通信

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      非父子通信

      使用ref來綁定組件, (注意:ref也可以綁定DOM元素) 【ref鏈】

      在父組件的模板中, 使用ref = refName 綁定在兩個兄弟組件身上

      在任意一個子組件中, 就可以通過 this.$parent.$refs.refName 就可以獲得另一個子組件了, 同時這個自組件身上的數據和方法同樣也得到了

      結構:

      我是父親

      你好

      I am boy

      我現在有:{{ cash }} 錢

      I am girl

      Vue.component('Father',{ template: '#father', data () { return { name: 'father' } } }) Vue.component('Boy',{ template: '#boy', data () { return { cash: 2000 } }, methods: { incrementCash (value) { this.cash += value } } }) Vue.component('Girl',{ template: '#girl', data () { return { money: 1000 } }, methods: { give(){ console.log('===================================='); console.log(this.$parent); console.log('===================================='); // console.log( this.$parent.$refs ) // { body: Vuecomponent,girl: VueComponent } this.$parent.$refs.boy.incrementCash( this.money ) // this.$parent.$children } } }) new Vue({ el: '#app' })

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      通過事件總線(bus)

      它是通過事件的發布(聲明), 以及事件的訂閱(觸發)來做的

      首先在js中 創建一個bus對象(vm)

      var bus = new Vue()

      在Boy組件中定義數據, 和修改數據的方法

      在Boy組件中 通過 created 鉤子 , 進行bus事件的發布

      注意:參數傳遞問題實參寫在 bus.$emit('add',1000)

      created: { bus.$on('add',this.addCount) }

      1

      2

      在MyButton組件的方法中通過 bus進行事件的訂閱

      結構:

      I 'm boy

      我現在有{{ cash }}元

      I 'm girl

      /* 1.它是通過事件的發布(聲明), 以及事件的訂閱(觸發)來做的 2.首先在js中 創建一個bus對象(vm) 3.在Boy組件中定義數據, 和修改數據的方法 4.在Boy組件中 通過 created 鉤子 , 進行bus事件的發布 注意:參數傳遞問題實參寫在 bus.$emit('add',1000) */ let bus=new Vue(); Vue.component('Boy',{ template:'#boy', data(){ return { cash:0 } }, methods:{ getMoney(value){ this.cash+=value; } }, created(){ bus.$on('add',this.getMoney) } }) Vue.component('Girl',{ template:'#girl', methods:{ giveMoney(){ bus.$emit('add',1000) } } }) new Vue({ el:'#app' })

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      多組件狀態共享

      javaScript Vue

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:怎么填充Excel背景
      下一篇:制造業生產管理數字化(制造業加速數字化)
      相關文章
      色偷偷亚洲第一综合| 亚洲人AV在线无码影院观看| 亚洲最大福利视频网站| 亚洲日本va午夜中文字幕久久| 亚洲综合小说另类图片动图| 亚洲乱码一二三四区乱码| 亚洲黄色中文字幕| 久久精品国产亚洲av影院 | 久久99国产亚洲高清观看首页| 亚洲国产av一区二区三区| 亚洲avav天堂av在线网毛片| 亚洲av永久中文无码精品 | 亚洲欧美不卡高清在线| 精品丝袜国产自在线拍亚洲| 亚洲人成电影网站久久| 亚洲中文字幕无码av永久| 亚洲熟妇AV日韩熟妇在线| 亚洲欧美国产欧美色欲| 亚洲AV无码成人精品区日韩| 国产精品手机在线亚洲| 亚洲第一页日韩专区| 久久亚洲国产成人精品无码区| 亚洲熟妇av一区二区三区| 亚洲国产成人高清在线观看| 久久亚洲精品国产精品黑人| 亚洲精品免费视频| 亚洲成年人电影在线观看| 亚洲一区二区三区高清不卡| 在线综合亚洲欧洲综合网站| 久久精品国产亚洲av天美18| 亚洲成a人在线看天堂无码| 亚洲午夜国产精品无码 | 亚洲欧美日韩国产精品一区| 色欲色欲天天天www亚洲伊| 日韩色视频一区二区三区亚洲| 日韩色视频一区二区三区亚洲| 亚洲日韩在线第一页| 国产亚洲精AA在线观看SEE| 久久久久亚洲AV无码网站| 亚洲国产精品综合久久网各| 亚洲一区二区观看播放|