目前使用的方式有兩種,一種是父子組件方法傳遞,一種是系統提供的emitter。
一、父子組件方法傳遞
1.1 使用場景
當我們父組件中有一個方法,需要子組件在修改完數據后回調父組件的方法時候。有點抽象:這樣解釋一下,父組件A中創建了子組件B,A中一個方法是需要B端更新數據后調用來刷新頁面。這樣我們就需要將A中的方法傳遞給子組件B。然后,B端改完數據后調用這個方法。
1.2 偽代碼實現
//父組件A中的偽代碼//A組件中的方法實現startCalcuteMoney() {//。。。。這里進行方法處理}build() {Column() {ListItem() {TopCellItem({startCalcute:this.startCalcuteMoney.bind(this)})}}
}//=========================================////子組件B中的偽代碼@Component
struct TopCellItem {//接受父類傳遞的方法startCalcute:() => voidbuild() {Column(){Text('點擊調用父組件方法').fontSize(20).onClick(() => {this.startCalcute()})}
}
比較好理解,不過需要注意的是父組件在傳遞給子組件方法的時候需要bind(this)。
當B組件TopCellItem點擊Text的時候就可以回調父組件的方法了。
二、emitter
可以先看一下官方文檔,解釋的比較清晰。
2.1 使用場景
這個對于原生iOS開發來說就像notification通知,或者swift的EventBus。可以實現跨頁面,跨組件的一對多的傳遞。例如主題設置,我在設置完主題顏色的時候,需要所有監聽到的地方發生更改。這就需要用到emitter了。
2.2 偽代碼實現
//發送信號的方法saveportfoilRate() {//發送信號let eventData = {data: { //發送的數據"rate": this.portfolioRate,}};let innerEvent = {eventId: 11, //發送的ID,需要跟監聽方一致priority: emitter.EventPriority.HIGH};emitter.emit(innerEvent, eventData);}//=====================================================//監聽信號的地方listenRateChange() {let innerEvent = {eventId: 11 //監聽的ID,需要跟發送方一致};function EmitterCallback(eventData) {//處理收到的數據}emitter.on(innerEvent, EmitterCallback.bind(this));}
同樣需要注意的是,在監聽信號的地方需要bind(this)。
當組件A中調用發送信號的地方時候,組件B在監聽的地方就可以收到了。需要注意的是需要先監聽再發送。