原则:
-
唯业务可变
-
预制,封装业务无关
-
内核用插件拓展
要求
-
使用 JSX 书写
-
完全支持 antdProps
-
支持自定义,能够拿到上下文
const { Header, Table, Column, Action } = ListPageTemplate
export function CampaignListPage(): ReactNode {
return (
<ListPageTemplate>
<Header />
<Table>
<Column {...antdProps} {...customProps} />
<Column />
<Column />
<Action />
<Action />
</Table>
</ListPageTemplate>
)
}
import { ReactNode, useMemo } from 'react'
export function CampaignListPage(): ReactNode {
const table = useMemo(() => createTable(), [])
const handleBizLogic = () => {
table.refresh()
}
const onRequest = async () => {
// ...
return [
{ label: 'free', value: 'FREE' },
{ label: 'paid', value: 'PAID' },
]
}
const onReaction = (column, table) => {
const { record } = column
column.setVisible(false)
// table.refresh()
}
return (
<TableContextProvider table={table}>
<Header />
<Table onRequest={() => {}} onInit={() => {}}>
<Column dataIndex="campaign_id" />
<Column dataIndex="charge_type" columnType="select" onRequest={onRequest} onReaction={[onReaction]} />
<Column />
<Action buttons={[]} />
</Table>
</TableContextProvider>
)
}
import { ReactNode, useMemo } from 'react'
export function CampaignDetailPage(): ReactNode {
const form = useMemo(() => createForm(), [])
const handleBizLogic = () => {
form.submit()
}
const onRequest = async () => {
// ...
return [
{ label: 'free', value: 'FREE' },
{ label: 'paid', value: 'PAID' },
]
}
const onReaction = (field: FormilyField, form: FormilyForm) => {
field.setVisible(false)
}
return (
<Form form={form} onInit={() => {}} onRequest={() => {}} requestId="123OrNull">
<Header />
<Field name="campaign_id" />
<Field name="charge_type" fieldType="select" onRequest={onRequest} onReaction={[onReaction]} />
<Field />
<Footer buttons={[]} />
</Form>
)
}
<Button buttonType='drawer-filter' filters={[]} />
<Button buttonType='column-toggle' toggles={[]} />
<Button buttonType='form-modal' fields={[]} />
<Button buttonType='page-nav' pageType='' onBeforeNav={} />
<Button buttonType='download-csv' downloadUrl='' />
<Button buttonType='upload-csv' />
<Button buttonType='edit-csv' />
const useTableColumnTogglePlugin = (table) => {
const tableProps = table.getTableProps()
// ...
}
function Table(props) {
useTableColumnTogglePlugin(table)
return <AntdTable {...props} />
}
const useFormTabGroupPlugin = (form) => {
const formProps = form.getFormProps()
// ...
}
function Form(props) {
useFormTabGroupPlugin(table)
return <FormilyForm {...props} />
}
function CampaignScene() {
return <></>
}
// with 确定的业务点
assign(CampaignScene, {
CampaignListPage: (userProps) => <CampaignListPage {...props} {...userProps} />,
CampaignDetailPage: (userProps) => <CampaignDetailPage {...props} {...userProps} />,
// ...
})
-
底层工具 + tests => 底层稳定
-
封装、预制 => 定义规范
-
组装、编排 => 终极提效