Skip to content

Commit

Permalink
feat(miniProgramBus): 优化实现,支持返回数据类回调
Browse files Browse the repository at this point in the history
  • Loading branch information
fjc0k committed Aug 27, 2020
1 parent b04d161 commit aa9a690
Show file tree
Hide file tree
Showing 2 changed files with 113 additions and 38 deletions.
38 changes: 9 additions & 29 deletions src/mp/miniProgramBus.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,6 @@
/// <reference types="miniprogram-api-typings" />
import { Defined } from '../types'
import {
EventBus,
EventBusBeforeEmit,
EventBusBeforeOn,
EventBusListener,
} from '../utils'
import { EventBus, EventBusBeforeOn, EventBusListener } from '../utils'
import { patchMiniProgram } from './patchMiniProgram'

export interface MiniProgramBusListeners {
Expand Down Expand Up @@ -73,7 +68,8 @@ export interface MiniProgramBusListeners {
>
}

const pageListenerToCurrentPageListener: Partial<Record<
/** @private */
export const pageListenerToCurrentPageListener: Partial<Record<
keyof MiniProgramBusListeners,
keyof MiniProgramBusListeners
>> = {
Expand All @@ -90,10 +86,12 @@ const pageListenerToCurrentPageListener: Partial<Record<
pageTabItemTap: 'currentPageTabItemTap',
}

const pageListeners = Object.keys(pageListenerToCurrentPageListener) as Array<
keyof MiniProgramBusListeners
>
const currentPageListeners = pageListeners.map(
/** @private */
export const pageListeners = Object.keys(
pageListenerToCurrentPageListener,
) as Array<keyof MiniProgramBusListeners>
/** @private */
export const currentPageListeners = pageListeners.map(
pageListener => pageListenerToCurrentPageListener[pageListener],
) as Array<keyof MiniProgramBusListeners>

Expand All @@ -109,22 +107,4 @@ export const miniProgramBus = new EventBus<MiniProgramBusListeners>({
}
return res
}, {}),
beforeEmit: pageListeners.reduce<
// @ts-ignore
EventBusBeforeEmit<MiniProgramBusListeners>
>((res, pageListenerName) => {
res[pageListenerName] = function (ctx) {
this.emit({
name: pageListenerToCurrentPageListener[pageListenerName]!,
context: ctx,
tag: ctx.__PAGE_ID__,
})
if (pageListenerName === 'pageUnload') {
for (const currentPageListenerName of currentPageListeners) {
this.off(currentPageListenerName, ctx.__PAGE_ID__)
}
}
}
return res
}, {}),
})
113 changes: 104 additions & 9 deletions src/mp/patchMiniProgram.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { currentPageListeners, miniProgramBus } from './miniProgramBus'
import { ensureInMiniProgram } from './ensureInMiniProgram'
import { MiniProgramApi } from '../utils'
import { miniProgramBus } from './miniProgramBus'
import { last, MiniProgramApi } from '../utils'

function patchAppOptions(
mp: MiniProgramApi,
Expand Down Expand Up @@ -69,68 +69,163 @@ function patchPageOptions(

const onShow = pageOptions.onShow
pageOptions.onShow = function () {
miniProgramBus.emit({
name: 'currentPageShow',
context: this,
tag: (this as any).__PAGE_ID__,
})
miniProgramBus.emit({ name: 'pageShow', context: this })
return onShow?.call(this)
}

const onReady = pageOptions.onReady
pageOptions.onReady = function () {
miniProgramBus.emit({
name: 'currentPageReady',
context: this,
tag: (this as any).__PAGE_ID__,
})
miniProgramBus.emit({ name: 'pageReady', context: this })
return onReady?.call(this)
}

const onHide = pageOptions.onHide
pageOptions.onHide = function () {
miniProgramBus.emit({
name: 'currentPageHide',
context: this,
tag: (this as any).__PAGE_ID__,
})
miniProgramBus.emit({ name: 'pageHide', context: this })
return onHide?.call(this)
}

const onUnload = pageOptions.onUnload
pageOptions.onUnload = function () {
miniProgramBus.emit({
name: 'currentPageUnload',
context: this,
tag: (this as any).__PAGE_ID__,
})
miniProgramBus.emit({ name: 'pageUnload', context: this })
return onUnload?.call(this)
const res = onUnload?.call(this)
for (const currentPageListenerName of currentPageListeners) {
miniProgramBus.off(currentPageListenerName, (this as any).__PAGE_ID__)
}
return res
}

const onPullDownRefresh = pageOptions.onPullDownRefresh
pageOptions.onPullDownRefresh = function () {
miniProgramBus.emit({
name: 'currentPagePullDownRefresh',
context: this,
tag: (this as any).__PAGE_ID__,
})
miniProgramBus.emit({ name: 'pagePullDownRefresh', context: this })
return onPullDownRefresh?.call(this)
}

const onReachBottom = pageOptions.onReachBottom
pageOptions.onReachBottom = function () {
miniProgramBus.emit({
name: 'currentPageReachBottom',
context: this,
tag: (this as any).__PAGE_ID__,
})
miniProgramBus.emit({ name: 'pageReachBottom', context: this })
return onReachBottom?.call(this)
}

const onShareAppMessage = pageOptions.onShareAppMessage
pageOptions.onShareAppMessage = function (payload) {
miniProgramBus.emit({ name: 'pageShareAppMessage', context: this }, payload)
return onShareAppMessage?.call(this, payload)
const pageListenerData = miniProgramBus.emit(
{
name: 'currentPageShareAppMessage',
context: this,
tag: (this as any).__PAGE_ID__,
},
payload,
)
const globalListenerData = miniProgramBus.emit(
{ name: 'pageShareAppMessage', context: this },
payload,
)
const originalListenerData = onShareAppMessage?.call(this, payload)
return (
originalListenerData || last(pageListenerData) || last(globalListenerData)
)
}

// @ts-ignore
const onShareTimeline = pageOptions.onShareTimeline
// @ts-ignore
pageOptions.onShareTimeline = function (payload) {
miniProgramBus.emit({ name: 'pageShareTimeline', context: this }, payload)
return onShareTimeline?.call(this, payload)
const pageListenerData = miniProgramBus.emit(
{
name: 'currentPageShareTimeline',
context: this,
tag: (this as any).__PAGE_ID__,
},
payload,
)
const globalListenerData = miniProgramBus.emit(
{ name: 'pageShareTimeline', context: this },
payload,
)
const originalListenerData = onShareTimeline?.call(this, payload)
return (
originalListenerData || last(pageListenerData) || last(globalListenerData)
)
}

const onAddToFavorites = pageOptions.onAddToFavorites
pageOptions.onAddToFavorites = function (payload) {
miniProgramBus.emit({ name: 'pageAddToFavorites', context: this }, payload)
return onAddToFavorites?.call(this, payload) || {}
const pageListenerData = miniProgramBus.emit(
{
name: 'currentPageAddToFavorites',
context: this,
tag: (this as any).__PAGE_ID__,
},
payload,
)
const globalListenerData = miniProgramBus.emit(
{ name: 'pageAddToFavorites', context: this },
payload,
)
const originalListenerData = onAddToFavorites?.call(this, payload)
return (
originalListenerData ||
last(pageListenerData) ||
last(globalListenerData) ||
{}
)
}

const onResize = pageOptions.onResize
pageOptions.onResize = function (payload) {
miniProgramBus.emit(
{
name: 'currentPageResize',
context: this,
tag: (this as any).__PAGE_ID__,
},
payload,
)
miniProgramBus.emit({ name: 'pageResize', context: this }, payload)
return onResize?.call(this, payload)
}

const onTabItemTap = pageOptions.onTabItemTap
pageOptions.onTabItemTap = function (payload) {
miniProgramBus.emit(
{
name: 'currentPageTabItemTap',
context: this,
tag: (this as any).__PAGE_ID__,
},
payload,
)
miniProgramBus.emit({ name: 'pageTabItemTap', context: this }, payload)
return onTabItemTap?.call(this, payload)
}
Expand Down

0 comments on commit aa9a690

Please sign in to comment.