前言:
其實之前就想寫這個的,因為我覺得這么模塊化的框架,組件之間通信是非常重要的,也是最經常用到的一塊兒,
只是之前在項目里一直沒用到跨組件通信,現在用到了,也會用了,就一起寫出來得了 :)
一、父、子組件之間的通信
注:首先我們先將子組件在父組件中注冊,並且在父組件上使用!!!
1.創建組件:
在微信開發者工具中,我們可以直接創建組件;
先右鍵創建一個文件夾,然后在創建的這個文件夾上右鍵,新建Component;
這樣就成功的創建了一個組件;
2.在父組件中注冊,並使用:
首先,我們去到父組件中的.json文件中,在"usingComponents"中進行注冊
例: "usingComponents":{
"自定義name":"子組件的路徑(可以是絕對路徑,也可以是相對路徑)"
}
注冊完之后,我們就可以使用了,在父組件的.wxml文件中,直接使用
例: <b-detail-swiper /> (里面填的就是我們在注冊時,起的自定義name)
----------------------------華麗的分割線-------------------------------
1.父組件向子組件傳遞數據
父組件向子組件傳遞數據,可以傳遞number、array、object、string等數據
以上傳遞是數據是在項目中常用的,當然null跟undefined也是可以傳遞的
舉個例子吧:我們要像輪播圖組件中傳遞幾張圖片
注:imgList是我們自定義的名字,也是要在子組件中接收的名字
{{imgList}}中的imgList是我們父組件中js文件中data中的數據
例:<b-detail-swiper imgList="{{imgList}}" />
-----------------上面的代碼就是我們父組件向子組件傳遞數據的過程--------------------
父組件中傳遞了數據,子組件中就要接收參數
子組件中的.js文件中有一個Component對象,在這個對象中有一個properties的對象
例子:properties:{
imgList:{
type:Array //type: 數據類型(根據傳遞過來的數據進行填寫)
value:[] //value:默認值(當你沒有傳遞值的時候,就使用value中的值,類似default)
}
}
這樣就接收到了父組件傳遞過來的數據,在子組件中的.wxml文件中使用mastache語法:{{imgList}}引用
2.子組件向父組件傳遞自對應事件
舉個例子:我們在子組件中的wxml中,使用bind:tap監聽了一個onClick方法
在.js文件中的Component對象中的methods中使用onClick方法
在onClick方法使用triggerEvent發送自定義事件
例:methods:{
onClick(){
console.log('監聽到點擊事件')
const index = 1
this.triggerEvent("handleClick",{index},{})
}
}
//trigerEvent("method-name",{index},{});
該方法有3個參數:第一個參數:方法名,第二個參數:要傳遞的數據,
重點:第三個參數:沒有用過,不是很了解,希望有無意或有意看到的朋友在評論區給出自己的理解
---------------------------在父組件中使用------------------------------
例:
在父組件中的.wxml文件中:
<b-detail-swiper bind:handleClick="handleClick" />
在父組件中的.js文件中
在Page對象中
handleClick(event){
//獲取event對象
const index = event.detail.index;
console.log(index)
}
這樣我們獲取到子組件向父組件傳遞的數據
二、非父子組件之間的通信
wx小程序中的非父子組件通信其實特別簡單,
在我們創建小程序的時候就會生成一個app.js、app.json等文件
我們的非父子組件之間的通信就需要用到app.js文件
例子:
app.js文件:
App({
onLaunch:function(){
},
addObj(obj){
this.globalData.proList.push(obj)
}
globalData:{
name:'',
proList:[]
}
})
注:home組件跟profile組件不是父子組件的關系
在home跟profile組件的js文件中我們先進行引用,這一步是必須的,先獲取全局對象嘛
const app = getApp();
------------------------------發送數據----------------------------------
home.js文件:
const app = getApp();
Page({
onLoad:function(options){
app.globalData.name = 'b-clouds'
}
})
在home.js文件中,我們將app中的globalData中的name屬性的值改為'b-clouds',
這時全局對象中的name屬性的值就變成了'b-clouds'
---------------------------------獲取數據----------------------------------
profile.js文件:
const app = getApp();
Page({
onLoad:function(options){
},
//onClick只是一個單純的點擊事件
onClick(){
const name = app.globalData.name;
console.log(name)
//控制台打印出來的結果就是: b-clouds
}
})
上面的只是String類型數據的傳遞,那么其他類型呢?
number跟String類型傳遞數據的方法是一樣的
-------------------------------傳遞數據---------------------------------
而對象和數組傳遞數據的方式是一樣的
例子:
home.js:
Page:{
data:{
id:1001,
name:'b-clouds',
age:22,
height:1.81
}
onClick(){
const obj = {}
obj.id = this.data.id
obj.name = this.data.name
obj.age = this.data.age
obj.height = this.data.height
app.addObj(obj)
}
}
這樣在home文件中就將全局對象中的proList的值改變;
---------------------------------獲取數據-----------------------------------
profile.js文件:
const app = getApp();
Page({
data:{
proList:[]
}
//監聽頁面顯示
onShow:function(){
const proList = app.globalData.proList
this.setData({
proList //es6增強語法: proList:proList === proList
})
}
})
profile.wxml文件:
這里就可以直接使用mastache語法使用proList {{proList}}