Skip to content

Commit 1f1ac1f

Browse files
author
puhui999
committed
使用 tsx 封装 form-create 通用选择组件
1 parent 2148344 commit 1f1ac1f

File tree

11 files changed

+217
-65
lines changed

11 files changed

+217
-65
lines changed

src/components/FormCreate/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
import { useFormCreateDesigner } from './src/useFormCreateDesigner'
2-
import CurrencySelect from './src/CurrencySelect/index.vue'
2+
import { useCurrencySelect } from './src/components/useCurrencySelect'
33

4-
export { useFormCreateDesigner, CurrencySelect }
4+
export { useFormCreateDesigner, useCurrencySelect }

src/components/FormCreate/src/CurrencySelect/index.vue

Lines changed: 0 additions & 53 deletions
This file was deleted.
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import request from '@/config/axios'
2+
import { isEmpty } from '@/utils/is'
3+
import { CurrencySelectProps } from '@/components/FormCreate/src/type'
4+
5+
export const useCurrencySelect = (option: CurrencySelectProps) => {
6+
return defineComponent({
7+
name: option.name,
8+
props: {
9+
// 字典类型
10+
labelField: {
11+
type: String,
12+
default: () => option.labelField ?? ''
13+
},
14+
// 字典值类型
15+
valueField: {
16+
type: String,
17+
default: () => option.valueField ?? ''
18+
},
19+
// api 接口
20+
restful: {
21+
type: String,
22+
default: () => option.restful ?? ''
23+
}
24+
},
25+
setup(props) {
26+
const attrs = useAttrs()
27+
const options = ref<any[]>([]) // 下拉数据
28+
const getOptions = async () => {
29+
options.value = []
30+
if (isEmpty(props.restful)) {
31+
return
32+
}
33+
// TODO 只支持 GET 查询,复杂下拉构建条件请使用业务表单
34+
const data = await request.get({ url: props.restful })
35+
if (Array.isArray(data)) {
36+
options.value = data.map((item: any) => ({
37+
label: item[props.labelField],
38+
value: item[props.valueField]
39+
}))
40+
return
41+
}
42+
console.log(`接口[${props.restful}] 返回结果不是一个数组`)
43+
}
44+
45+
onMounted(async () => {
46+
await getOptions()
47+
})
48+
return () => (
49+
<>
50+
<el-select className="w-1/1" {...attrs}>
51+
{options.value.map((item, index) => (
52+
<el-option key={index} label={item.label} value={item.value} />
53+
))}
54+
</el-select>
55+
</>
56+
)
57+
}
58+
})
59+
}

src/components/FormCreate/src/config/index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,16 @@ import { useUploadImgsRule } from './useUploadImgsRule'
44
import { useDictSelectRule } from './useDictSelectRule'
55
import { useCurrencySelectRule } from './useCurrencySelectRule'
66
import { useEditorRule } from './useEditorRule'
7+
import { useUserSelectRule } from './useUserSelectRule'
8+
import { useDeptSelectRule } from './useDeptSelectRule'
79

810
export {
911
useUploadFileRule,
1012
useUploadImgRule,
1113
useUploadImgsRule,
1214
useDictSelectRule,
1315
useCurrencySelectRule,
14-
useEditorRule
16+
useEditorRule,
17+
useUserSelectRule,
18+
useDeptSelectRule
1519
}

src/components/FormCreate/src/config/useCurrencySelectRule.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import { generateUUID } from '@/utils'
22
import { localeProps, makeRequiredRule } from '@/components/FormCreate/src/utils'
33
import selectRule from '@/components/FormCreate/src/config/selectRule'
4+
import { DragRule } from '@/components/FormCreate/src/type'
45

5-
export const useCurrencySelectRule = () => {
6+
export const useCurrencySelectRule = (): DragRule => {
67
const label = '通用选择器'
78
const name = 'CurrencySelect'
89
return {
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { generateUUID } from '@/utils'
2+
import { localeProps, makeRequiredRule } from '@/components/FormCreate/src/utils'
3+
import selectRule from '@/components/FormCreate/src/config/selectRule'
4+
import { DragRule } from '@/components/FormCreate/src/type'
5+
6+
export const useDeptSelectRule = (): DragRule => {
7+
const label = '部门选择器'
8+
const name = 'DeptSelect'
9+
return {
10+
icon: 'icon-select',
11+
label,
12+
name,
13+
rule() {
14+
return {
15+
type: name,
16+
field: generateUUID(),
17+
title: label,
18+
info: '',
19+
$required: false
20+
}
21+
},
22+
props(_, { t }) {
23+
return localeProps(t, name + '.props', [makeRequiredRule(), ...selectRule])
24+
}
25+
}
26+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { generateUUID } from '@/utils'
2+
import { localeProps, makeRequiredRule } from '@/components/FormCreate/src/utils'
3+
import selectRule from '@/components/FormCreate/src/config/selectRule'
4+
import { DragRule } from '@/components/FormCreate/src/type'
5+
6+
export const useUserSelectRule = (): DragRule => {
7+
const label = '用户选择器'
8+
const name = 'UserSelect'
9+
return {
10+
icon: 'icon-select',
11+
label,
12+
name,
13+
rule() {
14+
return {
15+
type: name,
16+
field: generateUUID(),
17+
title: label,
18+
info: '',
19+
$required: false
20+
}
21+
},
22+
props(_, { t }) {
23+
return localeProps(t, name + '.props', [makeRequiredRule(), ...selectRule])
24+
}
25+
}
26+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { Rule } from '@form-create/element-ui' //左侧拖拽按钮
2+
3+
//左侧拖拽按钮
4+
export interface MenuItem {
5+
label: string
6+
name: string
7+
icon: string
8+
}
9+
10+
//左侧拖拽按钮分类
11+
export interface Menu {
12+
title: string
13+
name: string
14+
list: MenuItem[]
15+
}
16+
17+
export interface MenuList extends Array<Menu> {}
18+
19+
//拖拽组件的规则
20+
export interface DragRule {
21+
icon: string
22+
name: string
23+
label: string
24+
children?: string
25+
inside?: true
26+
drag?: true | String
27+
dragBtn?: false
28+
mask?: false
29+
30+
rule(): Rule
31+
32+
props(v: any, v1: any): Rule[]
33+
}
34+
35+
// 通用下拉组件 Props 类型
36+
export interface CurrencySelectProps {
37+
name: string // 组件名称
38+
labelField?: string // 字典类型
39+
valueField?: string // 字典值类型
40+
restful?: string // api 接口
41+
}

src/components/FormCreate/src/useFormCreateDesigner.ts

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
import {
22
useCurrencySelectRule,
3+
useDeptSelectRule,
34
useDictSelectRule,
45
useEditorRule,
56
useUploadFileRule,
67
useUploadImgRule,
7-
useUploadImgsRule
8+
useUploadImgsRule,
9+
useUserSelectRule
810
} from './config'
911
import { Ref } from 'vue'
12+
import { Menu } from '@/components/FormCreate/src/type'
1013

1114
/**
1215
* 表单设计器增强 hook
@@ -26,7 +29,10 @@ export const useFormCreateDesigner = (designer: Ref) => {
2629
const dictSelectRule = useDictSelectRule()
2730
const currencySelectRule = useCurrencySelectRule()
2831

29-
onMounted(() => {
32+
/**
33+
* 构建表单组件
34+
*/
35+
const buildFormComponents = () => {
3036
// 移除自带的上传组件规则,使用 uploadFileRule、uploadImgRule、uploadImgsRule 替代
3137
designer.value?.removeMenuItem('upload')
3238
// 移除自带的富文本组件规则,使用 editorRule 替代
@@ -51,5 +57,35 @@ export const useFormCreateDesigner = (designer: Ref) => {
5157
label: component.label
5258
})
5359
})
60+
}
61+
62+
const userSelectRule = useUserSelectRule()
63+
const deptSelectRule = useDeptSelectRule()
64+
/**
65+
* 构建系统字段菜单
66+
*/
67+
const buildSystemMenu = () => {
68+
const components = [userSelectRule, deptSelectRule]
69+
const menu: Menu = {
70+
name: 'system',
71+
title: '系统字段',
72+
list: components.map((component) => {
73+
// 插入组件规则
74+
designer.value?.addComponent(component)
75+
// 插入拖拽按钮到 `system` 分类下
76+
return {
77+
icon: component.icon,
78+
name: component.name,
79+
label: component.label
80+
}
81+
})
82+
}
83+
designer.value?.addMenu(menu)
84+
}
85+
86+
onMounted(async () => {
87+
await nextTick()
88+
buildFormComponents()
89+
buildSystemMenu()
5490
})
5591
}

src/plugins/formCreate/index.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,22 @@ import install from '@form-create/element-ui/auto-import'
2020
//======================= 自定义组件 =======================
2121
import { UploadFile, UploadImg, UploadImgs } from '@/components/UploadFile'
2222
import { DictSelect } from '@/components/DictSelect'
23-
import { CurrencySelect } from '@/components/FormCreate'
23+
import { useCurrencySelect } from '@/components/FormCreate'
2424
import { Editor } from '@/components/Editor'
2525

26+
const UserSelect = useCurrencySelect({
27+
name: 'UserSelect',
28+
labelField: 'nickname',
29+
valueField: 'id',
30+
restful: '/system/user/simple-list'
31+
})
32+
const DeptSelect = useCurrencySelect({
33+
name: 'DeptSelect',
34+
labelField: 'name',
35+
valueField: 'id',
36+
restful: '/system/dept/simple-list'
37+
})
38+
2639
const components = [
2740
ElAside,
2841
ElPopconfirm,
@@ -40,7 +53,8 @@ const components = [
4053
UploadImgs,
4154
UploadFile,
4255
DictSelect,
43-
CurrencySelect,
56+
UserSelect,
57+
DeptSelect,
4458
Editor
4559
]
4660

0 commit comments

Comments
 (0)