define.ts 1.2 KB
Newer Older
fxy060608's avatar
fxy060608 已提交
1
import { once } from '@dcloudio/uni-shared'
fxy060608's avatar
fxy060608 已提交
2
import { createApp, DefineComponent } from 'vue'
fxy060608's avatar
fxy060608 已提交
3
import { createPageNode } from '../dom/Page'
fxy060608's avatar
fxy060608 已提交
4
import { setupPage } from './setup'
fxy060608's avatar
fxy060608 已提交
5
import __vuePlugin from '../plugin'
fxy060608's avatar
fxy060608 已提交
6
import { PageNodeOptions } from '../../../PageAction'
fxy060608's avatar
fxy060608 已提交
7

fxy060608's avatar
fxy060608 已提交
8
export type VueComponent = DefineComponent
fxy060608's avatar
fxy060608 已提交
9 10 11 12 13 14 15

const pagesMap = new Map<string, ReturnType<typeof createFactory>>()

export function definePage(pagePath: string, component: VueComponent) {
  pagesMap.set(pagePath, once(createFactory(component)))
}

fxy060608's avatar
fxy060608 已提交
16
export interface PageProps {
fxy060608's avatar
fxy060608 已提交
17
  pageId: number
fxy060608's avatar
fxy060608 已提交
18 19
  pagePath: string
  pageQuery: Record<string, any>
fxy060608's avatar
fxy060608 已提交
20
  pageInstance: Page.PageInstance['$page']
fxy060608's avatar
fxy060608 已提交
21 22
}

fxy060608's avatar
fxy060608 已提交
23 24 25 26
export function createPage(
  pageId: number,
  pagePath: string,
  pageQuery: Record<string, any>,
fxy060608's avatar
fxy060608 已提交
27
  pageInstance: Page.PageInstance['$page'],
fxy060608's avatar
fxy060608 已提交
28 29
  pageOptions: PageNodeOptions
) {
fxy060608's avatar
fxy060608 已提交
30 31 32 33 34 35 36 37
  return createApp(
    pagesMap.get(pagePath)!({
      pageId,
      pagePath,
      pageQuery,
      pageInstance,
    })
  )
fxy060608's avatar
fxy060608 已提交
38
    .use(__vuePlugin)
fxy060608's avatar
fxy060608 已提交
39
    .mount(createPageNode(pageId, pageOptions, true) as unknown as Element)
fxy060608's avatar
fxy060608 已提交
40 41 42
}

function createFactory(component: VueComponent) {
fxy060608's avatar
fxy060608 已提交
43 44
  return (props: PageProps) => {
    return setupPage(component, props)
fxy060608's avatar
fxy060608 已提交
45 46
  }
}