index.tsx
2.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import React, { useMemo } from 'react';
import ReactDOM from 'react-dom';
import { Skeleton } from 'antd';
import { fetchComponent, isMobile } from './fetchComponent';
const packages = {
react: React,
'react-dom': ReactDOM,
};
export const QxDynamicComponent: React.FC<QxDynamicComponentProps> = (props) => {
const { config = {} } = props;
const {
profile: _profile = {},
skeleton = true,
component,
fileServer = false,
request,
url,
...rest
} = getComponentConfig();
const profile = useMemo(() => ({ ...rest, ..._profile }), [_profile, rest]);
const Comp = useMemo<React.FC<typeof profile>>(() => {
return React.lazy(async () => {
try {
return await fetchComponent(url, component, packages, fileServer, request);
} catch (error) {
console.warn(error);
return {
default: () => <span style={{ color: 'red' }}>加载错误: {error.message}</span>,
};
}
});
}, [url]);
function getComponentConfig(key?: string) {
const mergedConfig: QxDynamicComponentProps = Object.assign(
{},
props,
config[isMobile() ? 'h5' : 'pc'] || {},
{
url: isMobile() ? props.h5Url : props.url,
},
);
return key ? mergedConfig[key] : mergedConfig;
}
return (
<React.Suspense
fallback={
skeleton ? typeof skeleton === 'boolean' ? <Skeleton.Input active /> : skeleton : null
}
>
<Comp {...profile} />
</React.Suspense>
);
};
export interface QxDynamicComponentProps extends Record<string, any> {
/**
* 组件地址
*/
url: string;
/**
* 移动端组件地址
*/
h5Url: string;
/**
* 组件 props
*/
profile?: Record<string, any>;
/**
* 是否显示加载骨架
*/
skeleton?: boolean | React.ReactNode;
/**
* 组件名称
*/
component: string;
/**
* 文件服务,未 true 时会自动拼接文件服务器地址
*/
fileServer?: boolean;
/**
* 组件生效范围
*/
scope: Record<'form' | 'search' | 'table' | 'card', boolean>;
/**
* 请求方法
*/
request?: any;
/**
* 配置项
*/
config?: Partial<Record<PlatformType, QxDynamicComponentProps>>;
}
export type PlatformType = 'h5' | 'pc';