@hzab/hierarchical-statistics 0.0.5 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -10
- package/README.md +142 -127
- package/package.json +9 -5
- package/src/components/Breadcrumb/index.tsx +46 -25
- package/src/components/InfiniteListUiMobile/index.tsx +69 -62
- package/src/components/InfiniteListUiPc/index.tsx +78 -77
- package/src/type.d.ts +79 -79
- package/src/use-infinite-list.ts +146 -144
package/CHANGELOG.md
CHANGED
|
@@ -1,10 +1,25 @@
|
|
|
1
|
-
# @hzab/component-boilerplate@0.0.
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
# @hzab/component-boilerplate@0.0.
|
|
10
|
-
|
|
1
|
+
# @hzab/component-boilerplate@0.0.7
|
|
2
|
+
|
|
3
|
+
- feat: 支持自定义面包屑 Render ,控制最后一个面包屑是否允许点击,增加动态渲染key值
|
|
4
|
+
|
|
5
|
+
# @hzab/component-boilerplate@0.0.6
|
|
6
|
+
|
|
7
|
+
- fix: 修复跳转同路由,listRender参数依赖没有更新问题
|
|
8
|
+
|
|
9
|
+
# @hzab/component-boilerplate@0.0.5
|
|
10
|
+
|
|
11
|
+
- fix: 暴露面包屑回显数据breadcrumbData
|
|
12
|
+
|
|
13
|
+
# @hzab/component-boilerplate@0.0.4
|
|
14
|
+
|
|
15
|
+
- fix: dependencies改成peerDependencies
|
|
16
|
+
- fix: 样式index.module.less改成index.less引入
|
|
17
|
+
- fix: 新增className外层类名传递
|
|
18
|
+
|
|
19
|
+
# @hzab/component-boilerplate@0.0.3
|
|
20
|
+
|
|
21
|
+
- fix: 适配mobile的ItemRender自定义字段
|
|
22
|
+
|
|
23
|
+
# @hzab/component-boilerplate@0.0.1
|
|
24
|
+
|
|
25
|
+
组件初始化
|
package/README.md
CHANGED
|
@@ -1,127 +1,142 @@
|
|
|
1
|
-
# @hzab/group-user-selector
|
|
2
|
-
|
|
3
|
-
组件模板
|
|
4
|
-
|
|
5
|
-
- node@16.16.0
|
|
6
|
-
|
|
7
|
-
- 注意:首次克隆先执行 npm run prepare 命令
|
|
8
|
-
|
|
9
|
-
# 组件
|
|
10
|
-
|
|
11
|
-
## 示例
|
|
12
|
-
|
|
13
|
-
```jsx
|
|
14
|
-
import InfiniteListUIPc from "@hzab/hierarchical-statistics/src/components/InfiniteListUiPc";
|
|
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
|
-
## API
|
|
54
|
-
|
|
55
|
-
### InfoPanel Attributes
|
|
56
|
-
|
|
57
|
-
| 参数
|
|
58
|
-
|
|
|
59
|
-
| listModal
|
|
60
|
-
| breadModel
|
|
61
|
-
| showHome
|
|
62
|
-
| onNodeClick
|
|
63
|
-
| onNodeSelect
|
|
64
|
-
| onBreadcrumbClick
|
|
65
|
-
| fieldList
|
|
66
|
-
| fieldBreadcrumb
|
|
67
|
-
| parentField
|
|
68
|
-
| homeBreadcrumb
|
|
69
|
-
| style
|
|
70
|
-
| listStyle
|
|
71
|
-
| readcrumbStyle
|
|
72
|
-
| separatorStyle
|
|
73
|
-
| listRenderProps
|
|
74
|
-
| virtualPagedListProps| Object
|
|
75
|
-
| separator
|
|
76
|
-
| Slots
|
|
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
|
-
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
1
|
+
# @hzab/group-user-selector
|
|
2
|
+
|
|
3
|
+
组件模板
|
|
4
|
+
|
|
5
|
+
- node@16.16.0
|
|
6
|
+
|
|
7
|
+
- 注意:首次克隆先执行 npm run prepare 命令
|
|
8
|
+
|
|
9
|
+
# 组件
|
|
10
|
+
|
|
11
|
+
## 示例
|
|
12
|
+
|
|
13
|
+
```jsx
|
|
14
|
+
import InfiniteListUIPc from "@hzab/hierarchical-statistics/src/components/InfiniteListUiPc";
|
|
15
|
+
<InfiniteListUIPc
|
|
16
|
+
ref={listRef}
|
|
17
|
+
style={{
|
|
18
|
+
maxWidth: "400px",
|
|
19
|
+
}}
|
|
20
|
+
listModal={
|
|
21
|
+
new DataModel({
|
|
22
|
+
getListApi: "/api/v1/sysOrg/getDeptTree",
|
|
23
|
+
query: {
|
|
24
|
+
pageNum: 1,
|
|
25
|
+
pageSize: 8,
|
|
26
|
+
},
|
|
27
|
+
})
|
|
28
|
+
}
|
|
29
|
+
fieldList={{
|
|
30
|
+
value: "orgId",
|
|
31
|
+
label: "orgName",
|
|
32
|
+
}}
|
|
33
|
+
Slots={{
|
|
34
|
+
renderItem: (record) => (
|
|
35
|
+
<div
|
|
36
|
+
onClick={() => {
|
|
37
|
+
listRef.current.handleNodeClick(record);
|
|
38
|
+
}}
|
|
39
|
+
style={{ padding: "12px 30px", border: "1px solid red" }}
|
|
40
|
+
>
|
|
41
|
+
<div>{record?.orgName}</div>
|
|
42
|
+
</div>
|
|
43
|
+
),
|
|
44
|
+
}}
|
|
45
|
+
virtualPagedListProps={{
|
|
46
|
+
height: 300,
|
|
47
|
+
dynamicHeightMode: true,
|
|
48
|
+
noMoreComponent: <div>没有更多数据了</div>,
|
|
49
|
+
}}
|
|
50
|
+
></InfiniteListUIPc>;
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## API
|
|
54
|
+
|
|
55
|
+
### InfoPanel Attributes
|
|
56
|
+
|
|
57
|
+
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|
|
58
|
+
| --------------------- | ------------------------------ | ---- | -------- | ------------------------------------------- |
|
|
59
|
+
| listModal | Object | 是 | - | 列表数据模型 DataModel,必须包含 getListApi |
|
|
60
|
+
| breadModel | Object | 否 | - | 回显数据模型 DataModel,必须包含 getApi |
|
|
61
|
+
| showHome | boolean | 否 | - | 是否显示面包屑首页 |
|
|
62
|
+
| onNodeClick | function(item) | 否 | - | item 点击事件 |
|
|
63
|
+
| onNodeSelect | function(item) | 否 | - | item 选中事件 |
|
|
64
|
+
| onBreadcrumbClick | function(item) | 否 | - | 回显点击事件 |
|
|
65
|
+
| fieldList | {value: number, label: string} | 否 | - | 列表默认关联字段 |
|
|
66
|
+
| fieldBreadcrumb | {value: number, label: string} | 否 | - | 面包屑显示对应关联字段 |
|
|
67
|
+
| parentField | string | 否 | parentId | 请求接口关联字段 |
|
|
68
|
+
| homeBreadcrumb | string | 否 | 首页 | 面包屑首页名称 |
|
|
69
|
+
| style | CSSProperties | 否 | - | 组件外层样式 |
|
|
70
|
+
| listStyle | CSSProperties | 否 | - | 列表外层样式 |
|
|
71
|
+
| readcrumbStyle | CSSProperties | 否 | - | 面包屑外层样式 |
|
|
72
|
+
| separatorStyle | CSSProperties | 否 | - | 面包屑分割符样式 |
|
|
73
|
+
| listRenderProps | Object | 否 | - | list-render-mobile 配置 |
|
|
74
|
+
| virtualPagedListProps | Object | 否 | - | virtualPagedList 配置 |
|
|
75
|
+
| separator | string | 否 | - | 分隔符 默认"-" |
|
|
76
|
+
| Slots | Object | 是 | - | 插槽 |
|
|
77
|
+
|
|
78
|
+
### Slots
|
|
79
|
+
|
|
80
|
+
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|
|
81
|
+
| --------------- | -------- | ---- | ------ | ------------------------------- |
|
|
82
|
+
| fixRenderCenter | Function | 否 | - | 固定在头部 面包屑和列表之间插槽 |
|
|
83
|
+
| itemRender | Function | 是 | - | 自定义列表项 |
|
|
84
|
+
|
|
85
|
+
# 组件开发流程
|
|
86
|
+
|
|
87
|
+
- 在 config/webpack.config.js 中按需修改 library 配置的文件名
|
|
88
|
+
- 在 config/webpack.config.js 中按需修改 alias 配置的包名,便于本地调试
|
|
89
|
+
- 在 tsconfig.json 中按需修改 paths 配置的包名,解决 ts 报错问题
|
|
90
|
+
- npm run dev
|
|
91
|
+
|
|
92
|
+
## 文件目录
|
|
93
|
+
|
|
94
|
+
- example 本地开发测试代码
|
|
95
|
+
- src 组件源码
|
|
96
|
+
|
|
97
|
+
## 命令
|
|
98
|
+
|
|
99
|
+
- Mac 执行该命令,设置 pre-commit 为可执行文件
|
|
100
|
+
|
|
101
|
+
- npm run mac-chmod
|
|
102
|
+
- chmod +x .husky && chmod +x .husky/pre-commit
|
|
103
|
+
|
|
104
|
+
- 生成文档:npm run docs
|
|
105
|
+
- 本地运行:npm run dev
|
|
106
|
+
|
|
107
|
+
## 发布
|
|
108
|
+
|
|
109
|
+
- npm 源和云效源都需要发布
|
|
110
|
+
|
|
111
|
+
- 命令:npm publish --access public
|
|
112
|
+
- 发布目录:
|
|
113
|
+
- src
|
|
114
|
+
|
|
115
|
+
### 迭代发布命令-版本自增
|
|
116
|
+
|
|
117
|
+
- beta: 需要手动修改 package.json 中的 version,添加 -betaX 版本号。使用 npm publish --beta 发布
|
|
118
|
+
- 0.0.x: npm run publish-patch
|
|
119
|
+
- 0.x.0: npm run publish-minor
|
|
120
|
+
- x.0.0: npm run publish-major
|
|
121
|
+
|
|
122
|
+
### nrm
|
|
123
|
+
|
|
124
|
+
- 安装
|
|
125
|
+
npm install -g nrm
|
|
126
|
+
- 增加源
|
|
127
|
+
nrm add aliyun https://packages.aliyun.com/62046985b3ead41b374a17f7/npm/npm-registry/
|
|
128
|
+
- 切换源
|
|
129
|
+
nrm use aliyun
|
|
130
|
+
nrm use npm
|
|
131
|
+
- 登录(账号密码在 https://packages.aliyun.com/npm/npm-registry/guide 查看)
|
|
132
|
+
npm login --registry=https://packages.aliyun.com/62046985b3ead41b374a17f7/npm/npm-registry/
|
|
133
|
+
|
|
134
|
+
## 配置
|
|
135
|
+
|
|
136
|
+
### 配置文件
|
|
137
|
+
|
|
138
|
+
- 本地配置文件:config/config.js
|
|
139
|
+
|
|
140
|
+
### webpack 配置文件
|
|
141
|
+
|
|
142
|
+
- config/webpack.config.js
|
package/package.json
CHANGED
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hzab/hierarchical-statistics",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.7",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "src",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"dev": "webpack serve -c ./config/webpack.config.js --env local",
|
|
8
8
|
"build": "webpack -c ./config/webpack.config.js --env production",
|
|
9
|
-
"
|
|
10
|
-
"publish
|
|
11
|
-
"
|
|
9
|
+
"version:alpha": "npm version prerelease --preid=alpha",
|
|
10
|
+
"publish:alpha": "npm publish --tag alpha",
|
|
11
|
+
"version:beta": "npm version prerelease --preid=beta",
|
|
12
|
+
"publish:beta": "npm publish --tag beta",
|
|
13
|
+
"version:patch": "npm version patch",
|
|
14
|
+
"version:minior": "npm version minor",
|
|
15
|
+
"version:major": "npm version major",
|
|
16
|
+
"publish:stable": "npm publish --access public",
|
|
12
17
|
"prepare": "husky install",
|
|
13
|
-
"mac-chmod": "chmod +x .husky && chmod +x .husky/pre-commit",
|
|
14
18
|
"docs": "typedoc"
|
|
15
19
|
},
|
|
16
20
|
"files": [
|
|
@@ -1,25 +1,46 @@
|
|
|
1
|
-
import "../index.less";
|
|
2
|
-
const BreadcrumbUI = (props: any) => {
|
|
3
|
-
const {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
1
|
+
import "../index.less";
|
|
2
|
+
const BreadcrumbUI = (props: any) => {
|
|
3
|
+
const {
|
|
4
|
+
labelKey = "label",
|
|
5
|
+
valueKey = "value",
|
|
6
|
+
readcrumbStyle,
|
|
7
|
+
separatorStyle,
|
|
8
|
+
separator,
|
|
9
|
+
breadcrumbData = [],
|
|
10
|
+
terminal,
|
|
11
|
+
handleBreadcrumbClick,
|
|
12
|
+
isAllowLastClick = false,
|
|
13
|
+
BreadcrumbItem,
|
|
14
|
+
} = props;
|
|
15
|
+
|
|
16
|
+
const handleBreadClick = (item, index) => {
|
|
17
|
+
if (!isAllowLastClick && index === breadcrumbData.length - 1) return;
|
|
18
|
+
handleBreadcrumbClick && handleBreadcrumbClick(item, index);
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
return (
|
|
22
|
+
<div className={`breadcrumb-box ${terminal !== "pc" ? "breadcrumb-box-mobile" : ""}`} style={readcrumbStyle}>
|
|
23
|
+
{breadcrumbData.map((item, index) =>
|
|
24
|
+
BreadcrumbItem ? (
|
|
25
|
+
<BreadcrumbItem key={item[valueKey] || index} item={item} index={index} />
|
|
26
|
+
) : (
|
|
27
|
+
<div className="breadcrumb-item" key={index}>
|
|
28
|
+
<span
|
|
29
|
+
className="breadcrumb-title"
|
|
30
|
+
style={{ color: breadcrumbData.length - 1 == index ? "#aeadad" : "#403ef5" }}
|
|
31
|
+
key={item[valueKey] || index}
|
|
32
|
+
onClick={() => handleBreadClick(item, index)}
|
|
33
|
+
>
|
|
34
|
+
{item[labelKey] || item}
|
|
35
|
+
</span>
|
|
36
|
+
<span className="breadcrumb-separator" style={separatorStyle}>
|
|
37
|
+
{breadcrumbData?.length - 1 != index ? separator : ""}
|
|
38
|
+
</span>
|
|
39
|
+
</div>
|
|
40
|
+
),
|
|
41
|
+
)}
|
|
42
|
+
</div>
|
|
43
|
+
);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export default BreadcrumbUI;
|
|
@@ -1,62 +1,69 @@
|
|
|
1
|
-
import { ForwardedRef, forwardRef, useImperativeHandle, useRef } from "react";
|
|
2
|
-
import { ConfigProvider, Spin } from "antd";
|
|
3
|
-
import ListRender from "@hzab/list-render-mobile";
|
|
4
|
-
import { useInfiniteList } from "../../use-infinite-list";
|
|
5
|
-
import { InfiniteListProps, InfiniteListInstance } from "../../type";
|
|
6
|
-
import Breadcrumb from "../Breadcrumb";
|
|
7
|
-
import "../index.less";
|
|
8
|
-
const InfiniteListUIMobile = (props: InfiniteListProps, ref: ForwardedRef<InfiniteListInstance>) => {
|
|
9
|
-
const {
|
|
10
|
-
states: {
|
|
11
|
-
readcrumbStyle,
|
|
12
|
-
separatorStyle,
|
|
13
|
-
separator,
|
|
14
|
-
listRenderProps,
|
|
15
|
-
style,
|
|
16
|
-
listModal,
|
|
17
|
-
breadcrumbData,
|
|
18
|
-
Slots,
|
|
19
|
-
loading,
|
|
20
|
-
listRef,
|
|
21
|
-
listStyle,
|
|
22
|
-
breadModel,
|
|
23
|
-
className,
|
|
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
|
-
|
|
1
|
+
import { ForwardedRef, forwardRef, useImperativeHandle, useRef } from "react";
|
|
2
|
+
import { ConfigProvider, Spin } from "antd";
|
|
3
|
+
import ListRender from "@hzab/list-render-mobile";
|
|
4
|
+
import { useInfiniteList } from "../../use-infinite-list";
|
|
5
|
+
import { InfiniteListProps, InfiniteListInstance } from "../../type";
|
|
6
|
+
import Breadcrumb from "../Breadcrumb";
|
|
7
|
+
import "../index.less";
|
|
8
|
+
const InfiniteListUIMobile = (props: InfiniteListProps, ref: ForwardedRef<InfiniteListInstance>) => {
|
|
9
|
+
const {
|
|
10
|
+
states: {
|
|
11
|
+
readcrumbStyle,
|
|
12
|
+
separatorStyle,
|
|
13
|
+
separator,
|
|
14
|
+
listRenderProps,
|
|
15
|
+
style,
|
|
16
|
+
listModal,
|
|
17
|
+
breadcrumbData,
|
|
18
|
+
Slots,
|
|
19
|
+
loading,
|
|
20
|
+
listRef,
|
|
21
|
+
listStyle,
|
|
22
|
+
breadModel,
|
|
23
|
+
className,
|
|
24
|
+
refreshKey,
|
|
25
|
+
},
|
|
26
|
+
actions: { fetchBreadData, handleSelectId, handleNodeClick, handleBreadcrumbClick },
|
|
27
|
+
} = useInfiniteList({ ...props, terminal: "mobile" });
|
|
28
|
+
useImperativeHandle(ref, () => ({
|
|
29
|
+
handleNodeClick,
|
|
30
|
+
handleSelectId,
|
|
31
|
+
listRef: listRef?.current,
|
|
32
|
+
listModal,
|
|
33
|
+
breadModel,
|
|
34
|
+
fetchBreadData,
|
|
35
|
+
breadcrumbData,
|
|
36
|
+
}));
|
|
37
|
+
return (
|
|
38
|
+
<div className={`infinite-level-box ${className || ""}`} style={style}>
|
|
39
|
+
<Spin spinning={loading}>
|
|
40
|
+
{/* 面包屑导航 */}
|
|
41
|
+
<div className="infinite-level-breadcrumb-position">
|
|
42
|
+
<Breadcrumb
|
|
43
|
+
terminal="mobile"
|
|
44
|
+
readcrumbStyle={readcrumbStyle}
|
|
45
|
+
separatorStyle={separatorStyle}
|
|
46
|
+
separator={separator}
|
|
47
|
+
breadcrumbData={breadcrumbData}
|
|
48
|
+
handleBreadcrumbClick={handleBreadcrumbClick}
|
|
49
|
+
Slots={Slots}
|
|
50
|
+
></Breadcrumb>
|
|
51
|
+
{Slots?.fixRenderCenter && <Slots.fixRenderCenter></Slots.fixRenderCenter>}
|
|
52
|
+
</div>
|
|
53
|
+
|
|
54
|
+
<div className="infinite-level-list-box" style={listStyle}>
|
|
55
|
+
{/* 移动端 */}
|
|
56
|
+
<ListRender
|
|
57
|
+
key={refreshKey}
|
|
58
|
+
ref={listRef}
|
|
59
|
+
model={listModal}
|
|
60
|
+
{...listRenderProps}
|
|
61
|
+
ItemRender={Slots.renderItem}
|
|
62
|
+
/>
|
|
63
|
+
</div>
|
|
64
|
+
</Spin>
|
|
65
|
+
</div>
|
|
66
|
+
);
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export default forwardRef<InfiniteListInstance, InfiniteListProps>(InfiniteListUIMobile);
|
|
@@ -1,77 +1,78 @@
|
|
|
1
|
-
import { ForwardedRef, forwardRef, useImperativeHandle, useRef } from "react";
|
|
2
|
-
import VirtualPagedList from "@hzab/headless-components/src/VirtualPagedList";
|
|
3
|
-
import { ConfigProvider, Spin, Empty, Button } from "antd";
|
|
4
|
-
import { useInfiniteList } from "../../use-infinite-list";
|
|
5
|
-
import Breadcrumb from "../Breadcrumb";
|
|
6
|
-
import { InfiniteListProps, InfiniteListInstance } from "../../type";
|
|
7
|
-
import "../index.less";
|
|
8
|
-
const InfiniteListUIPc = (props: InfiniteListProps, ref: ForwardedRef<InfiniteListInstance>) => {
|
|
9
|
-
const {
|
|
10
|
-
states: {
|
|
11
|
-
listModal,
|
|
12
|
-
breadModel,
|
|
13
|
-
readcrumbStyle,
|
|
14
|
-
separatorStyle,
|
|
15
|
-
separator,
|
|
16
|
-
style,
|
|
17
|
-
selectedLoadIdNode,
|
|
18
|
-
breadcrumbData,
|
|
19
|
-
Slots,
|
|
20
|
-
loading,
|
|
21
|
-
listStyle,
|
|
22
|
-
listRef,
|
|
23
|
-
virtualPagedListProps,
|
|
24
|
-
className,
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const
|
|
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
|
-
|
|
1
|
+
import { ForwardedRef, forwardRef, useImperativeHandle, useRef } from "react";
|
|
2
|
+
import VirtualPagedList from "@hzab/headless-components/src/VirtualPagedList";
|
|
3
|
+
import { ConfigProvider, Spin, Empty, Button } from "antd";
|
|
4
|
+
import { useInfiniteList } from "../../use-infinite-list";
|
|
5
|
+
import Breadcrumb from "../Breadcrumb";
|
|
6
|
+
import { InfiniteListProps, InfiniteListInstance } from "../../type";
|
|
7
|
+
import "../index.less";
|
|
8
|
+
const InfiniteListUIPc = (props: InfiniteListProps, ref: ForwardedRef<InfiniteListInstance>) => {
|
|
9
|
+
const {
|
|
10
|
+
states: {
|
|
11
|
+
listModal,
|
|
12
|
+
breadModel,
|
|
13
|
+
readcrumbStyle,
|
|
14
|
+
separatorStyle,
|
|
15
|
+
separator,
|
|
16
|
+
style,
|
|
17
|
+
selectedLoadIdNode,
|
|
18
|
+
breadcrumbData,
|
|
19
|
+
Slots,
|
|
20
|
+
loading,
|
|
21
|
+
listStyle,
|
|
22
|
+
listRef,
|
|
23
|
+
virtualPagedListProps,
|
|
24
|
+
className,
|
|
25
|
+
refreshKey,
|
|
26
|
+
},
|
|
27
|
+
actions: { handleSelectId, handleNodeClick, handleBreadcrumbClick, fetchBreadData },
|
|
28
|
+
} = useInfiniteList({ ...props, terminal: "pc" });
|
|
29
|
+
|
|
30
|
+
useImperativeHandle(ref, () => ({
|
|
31
|
+
handleNodeClick,
|
|
32
|
+
handleSelectId,
|
|
33
|
+
listRef: listRef?.current,
|
|
34
|
+
listModal,
|
|
35
|
+
breadModel,
|
|
36
|
+
fetchBreadData,
|
|
37
|
+
breadcrumbData,
|
|
38
|
+
}));
|
|
39
|
+
|
|
40
|
+
const loadData = async (pageNum) => {
|
|
41
|
+
listModal.query = { ...listModal.query, pageNum: pageNum };
|
|
42
|
+
const res = await listModal?.getList();
|
|
43
|
+
const list = res?.list ?? [];
|
|
44
|
+
return {
|
|
45
|
+
list,
|
|
46
|
+
isMore: res?.pagination?.total > (pageNum - 1) * listModal.query.pageSize + res?.list?.length ? true : false,
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
return (
|
|
50
|
+
<div className={`infinite-level-box ${className || ""}`} style={style}>
|
|
51
|
+
<Spin spinning={loading}>
|
|
52
|
+
{/* 面包屑导航 */}
|
|
53
|
+
<div className="infinite-level-breadcrumb-position">
|
|
54
|
+
<Breadcrumb
|
|
55
|
+
terminal="pc"
|
|
56
|
+
readcrumbStyle={readcrumbStyle}
|
|
57
|
+
separatorStyle={separatorStyle}
|
|
58
|
+
separator={separator}
|
|
59
|
+
breadcrumbData={breadcrumbData}
|
|
60
|
+
handleBreadcrumbClick={handleBreadcrumbClick}
|
|
61
|
+
></Breadcrumb>
|
|
62
|
+
{Slots?.fixRenderCenter && <Slots.fixRenderCenter></Slots.fixRenderCenter>}
|
|
63
|
+
</div>
|
|
64
|
+
<div className="infinite-level-list-box" style={listStyle}>
|
|
65
|
+
<VirtualPagedList
|
|
66
|
+
key={refreshKey}
|
|
67
|
+
ref={listRef}
|
|
68
|
+
{...virtualPagedListProps}
|
|
69
|
+
renderItem={Slots.renderItem}
|
|
70
|
+
loadMoreItems={loadData}
|
|
71
|
+
/>
|
|
72
|
+
</div>
|
|
73
|
+
</Spin>
|
|
74
|
+
</div>
|
|
75
|
+
);
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
export default forwardRef<InfiniteListInstance, InfiniteListProps>(InfiniteListUIPc);
|
package/src/type.d.ts
CHANGED
|
@@ -1,79 +1,79 @@
|
|
|
1
|
-
export type ListItem = {
|
|
2
|
-
children?: ListItem[];
|
|
3
|
-
value: number;
|
|
4
|
-
label: string;
|
|
5
|
-
[key: string]: any;
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
export type FieldItem = {
|
|
9
|
-
/** 选中当前关联id */
|
|
10
|
-
value: string;
|
|
11
|
-
/** 选中当前关联名称 */
|
|
12
|
-
label: string;
|
|
13
|
-
};
|
|
14
|
-
export type PathItem = {
|
|
15
|
-
value: number;
|
|
16
|
-
label: string;
|
|
17
|
-
};
|
|
18
|
-
export type InitSelectItem = PathItem;
|
|
19
|
-
export type OnNodeBreadcrumbClickType = PathItem & { index: number };
|
|
20
|
-
export interface InfiniteListInstance {
|
|
21
|
-
/** 点击下级节点事件 */
|
|
22
|
-
handleNodeClick?: (item: ListItem) => void;
|
|
23
|
-
/** 选中事件 */
|
|
24
|
-
handleSelectId?: (item: ListItem) => void;
|
|
25
|
-
listRef?: any;
|
|
26
|
-
listModal?: any;
|
|
27
|
-
breadModel?: any;
|
|
28
|
-
/** 面包屑回显数据 */
|
|
29
|
-
breadcrumbData?: any;
|
|
30
|
-
/** 面包屑数据请求方法 */
|
|
31
|
-
fetchBreadData?: () => Promise<void>;
|
|
32
|
-
}
|
|
33
|
-
export interface InfiniteListProps {
|
|
34
|
-
/** 添加外层类名 */
|
|
35
|
-
className?: string;
|
|
36
|
-
/** 面包屑显示对应关联字段默认 value,label */
|
|
37
|
-
fieldBreadcrumb?: FieldItem;
|
|
38
|
-
/** 是否有首页,默认false */
|
|
39
|
-
showHome?: boolean;
|
|
40
|
-
/** 关联字段默认 value,label */
|
|
41
|
-
fieldList?: FieldItem;
|
|
42
|
-
/** 列表请求接口下一级关联字段 */
|
|
43
|
-
parentField?: string;
|
|
44
|
-
/** 面包屑首页名称 */
|
|
45
|
-
homeBreadcrumb?: string;
|
|
46
|
-
/** 自定义面包屑 和 自定义列表 */
|
|
47
|
-
Slots: {
|
|
48
|
-
/** 固定在头部 面包屑和列表之间插槽 */
|
|
49
|
-
fixRenderCenter?: any;
|
|
50
|
-
/** 自定义列表项 */
|
|
51
|
-
renderItem: any;
|
|
52
|
-
};
|
|
53
|
-
/** 面包屑分割符 */
|
|
54
|
-
separator?: string;
|
|
55
|
-
/** 组件外层样式 */
|
|
56
|
-
style?: object;
|
|
57
|
-
/** 面包屑分割符css 样式 */
|
|
58
|
-
separatorStyle?: object;
|
|
59
|
-
/** 面包屑外层 自定义css 样式 */
|
|
60
|
-
readcrumbStyle?: object;
|
|
61
|
-
/** 设备是pc,还是mobile */
|
|
62
|
-
terminal?: string;
|
|
63
|
-
/** 列表外层 css 样式 */
|
|
64
|
-
listStyle?: object;
|
|
65
|
-
/** list modal */
|
|
66
|
-
listModal: any;
|
|
67
|
-
/** bread modal */
|
|
68
|
-
breadModel?: any;
|
|
69
|
-
/** list-render-mobile配置 */
|
|
70
|
-
listRenderProps?: object;
|
|
71
|
-
/** virtualPagedList 配置 */
|
|
72
|
-
virtualPagedListProps?: any;
|
|
73
|
-
/** 选中点击事件 */
|
|
74
|
-
onNodeClick?: (node: ListItem) => void;
|
|
75
|
-
/** 选中id */
|
|
76
|
-
onNodeSelect?: (node: ListItem) => void;
|
|
77
|
-
/** 选中回显点击事件 */
|
|
78
|
-
onBreadcrumbClick?: (node: OnNodeBreadcrumbClickType) => void;
|
|
79
|
-
}
|
|
1
|
+
export type ListItem = {
|
|
2
|
+
children?: ListItem[];
|
|
3
|
+
value: number;
|
|
4
|
+
label: string;
|
|
5
|
+
[key: string]: any;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export type FieldItem = {
|
|
9
|
+
/** 选中当前关联id */
|
|
10
|
+
value: string;
|
|
11
|
+
/** 选中当前关联名称 */
|
|
12
|
+
label: string;
|
|
13
|
+
};
|
|
14
|
+
export type PathItem = {
|
|
15
|
+
value: number;
|
|
16
|
+
label: string;
|
|
17
|
+
};
|
|
18
|
+
export type InitSelectItem = PathItem;
|
|
19
|
+
export type OnNodeBreadcrumbClickType = PathItem & { index: number };
|
|
20
|
+
export interface InfiniteListInstance {
|
|
21
|
+
/** 点击下级节点事件 */
|
|
22
|
+
handleNodeClick?: (item: ListItem) => void;
|
|
23
|
+
/** 选中事件 */
|
|
24
|
+
handleSelectId?: (item: ListItem) => void;
|
|
25
|
+
listRef?: any;
|
|
26
|
+
listModal?: any;
|
|
27
|
+
breadModel?: any;
|
|
28
|
+
/** 面包屑回显数据 */
|
|
29
|
+
breadcrumbData?: any;
|
|
30
|
+
/** 面包屑数据请求方法 */
|
|
31
|
+
fetchBreadData?: () => Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
export interface InfiniteListProps {
|
|
34
|
+
/** 添加外层类名 */
|
|
35
|
+
className?: string;
|
|
36
|
+
/** 面包屑显示对应关联字段默认 value,label */
|
|
37
|
+
fieldBreadcrumb?: FieldItem;
|
|
38
|
+
/** 是否有首页,默认false */
|
|
39
|
+
showHome?: boolean;
|
|
40
|
+
/** 关联字段默认 value,label */
|
|
41
|
+
fieldList?: FieldItem;
|
|
42
|
+
/** 列表请求接口下一级关联字段 */
|
|
43
|
+
parentField?: string;
|
|
44
|
+
/** 面包屑首页名称 */
|
|
45
|
+
homeBreadcrumb?: string;
|
|
46
|
+
/** 自定义面包屑 和 自定义列表 */
|
|
47
|
+
Slots: {
|
|
48
|
+
/** 固定在头部 面包屑和列表之间插槽 */
|
|
49
|
+
fixRenderCenter?: any;
|
|
50
|
+
/** 自定义列表项 */
|
|
51
|
+
renderItem: any;
|
|
52
|
+
};
|
|
53
|
+
/** 面包屑分割符 */
|
|
54
|
+
separator?: string;
|
|
55
|
+
/** 组件外层样式 */
|
|
56
|
+
style?: object;
|
|
57
|
+
/** 面包屑分割符css 样式 */
|
|
58
|
+
separatorStyle?: object;
|
|
59
|
+
/** 面包屑外层 自定义css 样式 */
|
|
60
|
+
readcrumbStyle?: object;
|
|
61
|
+
/** 设备是pc,还是mobile */
|
|
62
|
+
terminal?: string;
|
|
63
|
+
/** 列表外层 css 样式 */
|
|
64
|
+
listStyle?: object;
|
|
65
|
+
/** list modal */
|
|
66
|
+
listModal: any;
|
|
67
|
+
/** bread modal */
|
|
68
|
+
breadModel?: any;
|
|
69
|
+
/** list-render-mobile配置 */
|
|
70
|
+
listRenderProps?: object;
|
|
71
|
+
/** virtualPagedList 配置 */
|
|
72
|
+
virtualPagedListProps?: any;
|
|
73
|
+
/** 选中点击事件 */
|
|
74
|
+
onNodeClick?: (node: ListItem) => void;
|
|
75
|
+
/** 选中id */
|
|
76
|
+
onNodeSelect?: (node: ListItem) => void;
|
|
77
|
+
/** 选中回显点击事件 */
|
|
78
|
+
onBreadcrumbClick?: (node: OnNodeBreadcrumbClickType) => void;
|
|
79
|
+
}
|
package/src/use-infinite-list.ts
CHANGED
|
@@ -1,144 +1,146 @@
|
|
|
1
|
-
import { useState, useEffect, useRef } from "react";
|
|
2
|
-
import { ListItem, PathItem, InfiniteListProps } from "./type";
|
|
3
|
-
|
|
4
|
-
export function useInfiniteList(props: InfiniteListProps) {
|
|
5
|
-
const {
|
|
6
|
-
style,
|
|
7
|
-
listStyle,
|
|
8
|
-
separatorStyle,
|
|
9
|
-
readcrumbStyle,
|
|
10
|
-
listRenderProps,
|
|
11
|
-
showHome = true,
|
|
12
|
-
onNodeClick,
|
|
13
|
-
onNodeSelect,
|
|
14
|
-
onBreadcrumbClick,
|
|
15
|
-
parentField = "parentId",
|
|
16
|
-
homeBreadcrumb = "首页",
|
|
17
|
-
fieldBreadcrumb = {
|
|
18
|
-
value: "value",
|
|
19
|
-
label: "label",
|
|
20
|
-
},
|
|
21
|
-
fieldList = {
|
|
22
|
-
value: "value",
|
|
23
|
-
label: "label",
|
|
24
|
-
...props?.fieldList,
|
|
25
|
-
},
|
|
26
|
-
Slots,
|
|
27
|
-
separator = "/",
|
|
28
|
-
listModal,
|
|
29
|
-
breadModel,
|
|
30
|
-
virtualPagedListProps,
|
|
31
|
-
className,
|
|
32
|
-
} = props;
|
|
33
|
-
const [loading, setLoading] = useState(false);
|
|
34
|
-
const [selectedLoadIdNode, setSelectedLoadIdNode] = useState<number | null>(null);
|
|
35
|
-
const [selecteId, setSelectedId] = useState<number | null>();
|
|
36
|
-
const [breadcrumbData, setBreadcrumbData] = useState<PathItem[]>(
|
|
37
|
-
showHome ? [{ value: 0, label: homeBreadcrumb }] : [],
|
|
38
|
-
);
|
|
39
|
-
const
|
|
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
|
-
* @param {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
*
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
}
|
|
1
|
+
import { useState, useEffect, useRef } from "react";
|
|
2
|
+
import { ListItem, PathItem, InfiniteListProps } from "./type";
|
|
3
|
+
|
|
4
|
+
export function useInfiniteList(props: InfiniteListProps) {
|
|
5
|
+
const {
|
|
6
|
+
style,
|
|
7
|
+
listStyle,
|
|
8
|
+
separatorStyle,
|
|
9
|
+
readcrumbStyle,
|
|
10
|
+
listRenderProps,
|
|
11
|
+
showHome = true,
|
|
12
|
+
onNodeClick,
|
|
13
|
+
onNodeSelect,
|
|
14
|
+
onBreadcrumbClick,
|
|
15
|
+
parentField = "parentId",
|
|
16
|
+
homeBreadcrumb = "首页",
|
|
17
|
+
fieldBreadcrumb = {
|
|
18
|
+
value: "value",
|
|
19
|
+
label: "label",
|
|
20
|
+
},
|
|
21
|
+
fieldList = {
|
|
22
|
+
value: "value",
|
|
23
|
+
label: "label",
|
|
24
|
+
...props?.fieldList,
|
|
25
|
+
},
|
|
26
|
+
Slots,
|
|
27
|
+
separator = "/",
|
|
28
|
+
listModal,
|
|
29
|
+
breadModel,
|
|
30
|
+
virtualPagedListProps,
|
|
31
|
+
className,
|
|
32
|
+
} = props;
|
|
33
|
+
const [loading, setLoading] = useState(false);
|
|
34
|
+
const [selectedLoadIdNode, setSelectedLoadIdNode] = useState<number | null>(null);
|
|
35
|
+
const [selecteId, setSelectedId] = useState<number | null>();
|
|
36
|
+
const [breadcrumbData, setBreadcrumbData] = useState<PathItem[]>(
|
|
37
|
+
showHome ? [{ value: 0, label: homeBreadcrumb }] : [],
|
|
38
|
+
);
|
|
39
|
+
const [refreshKey, setRefreshKey] = useState(1);
|
|
40
|
+
const listRef = useRef<any>(null);
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* 下一级请求函数
|
|
44
|
+
* @param {ListItem} item - 选中的节点数据
|
|
45
|
+
*
|
|
46
|
+
*/
|
|
47
|
+
const handleNodeClick = (item: ListItem) => {
|
|
48
|
+
onNodeClick?.({
|
|
49
|
+
...item,
|
|
50
|
+
value: item[fieldList.value],
|
|
51
|
+
label: item[fieldList.label],
|
|
52
|
+
});
|
|
53
|
+
listModal.query = { ...listModal.query, [parentField]: item[fieldList.value] };
|
|
54
|
+
setSelectedLoadIdNode(item[fieldList.value]);
|
|
55
|
+
setBreadcrumbData((pre) => [
|
|
56
|
+
...pre,
|
|
57
|
+
{
|
|
58
|
+
value: item[fieldList.value],
|
|
59
|
+
label: item[fieldList.label],
|
|
60
|
+
},
|
|
61
|
+
]);
|
|
62
|
+
setRefreshKey((pre) => pre + 1);
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* 选中节点id
|
|
67
|
+
* @param {ListItem} item - 选中的节点
|
|
68
|
+
*
|
|
69
|
+
*/
|
|
70
|
+
const handleSelectId = (item: ListItem) => {
|
|
71
|
+
setSelectedId(item[fieldList.value]);
|
|
72
|
+
onNodeSelect?.({ ...item });
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* 处理面包屑点击事件
|
|
77
|
+
* @param {PathItem} item - 被点击的面包屑节点
|
|
78
|
+
* @param {number} index - 被点击的面包屑节点的索引
|
|
79
|
+
*/
|
|
80
|
+
const handleBreadcrumbClick = (item: PathItem, index: number) => {
|
|
81
|
+
if (breadcrumbData.length - 1 == index) return;
|
|
82
|
+
onBreadcrumbClick?.({
|
|
83
|
+
...item,
|
|
84
|
+
index: index,
|
|
85
|
+
});
|
|
86
|
+
listModal.query = { ...listModal.query, [parentField]: item.value };
|
|
87
|
+
setSelectedLoadIdNode(item.value);
|
|
88
|
+
setBreadcrumbData(breadcrumbData.slice(0, index + 1));
|
|
89
|
+
setRefreshKey((pre) => pre + 1);
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* 面包屑数据回显
|
|
94
|
+
*
|
|
95
|
+
*/
|
|
96
|
+
const fetchBreadData = async () => {
|
|
97
|
+
setLoading(true);
|
|
98
|
+
try {
|
|
99
|
+
const res = await breadModel?.get();
|
|
100
|
+
if (!res && !Array.isArray(res)) return;
|
|
101
|
+
let relPath =
|
|
102
|
+
res[0]?.path?.map((v: any) => {
|
|
103
|
+
return {
|
|
104
|
+
...v,
|
|
105
|
+
value: v[fieldBreadcrumb.value],
|
|
106
|
+
label: v[fieldBreadcrumb.label],
|
|
107
|
+
};
|
|
108
|
+
}) || [];
|
|
109
|
+
relPath && setBreadcrumbData(relPath);
|
|
110
|
+
} finally {
|
|
111
|
+
setLoading(false);
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
useEffect(() => {
|
|
116
|
+
fetchBreadData();
|
|
117
|
+
}, []);
|
|
118
|
+
|
|
119
|
+
return {
|
|
120
|
+
states: {
|
|
121
|
+
style,
|
|
122
|
+
listStyle,
|
|
123
|
+
separatorStyle,
|
|
124
|
+
readcrumbStyle,
|
|
125
|
+
selectedLoadIdNode,
|
|
126
|
+
breadcrumbData,
|
|
127
|
+
Slots,
|
|
128
|
+
listRenderProps,
|
|
129
|
+
separator,
|
|
130
|
+
loading,
|
|
131
|
+
selecteId,
|
|
132
|
+
listRef,
|
|
133
|
+
virtualPagedListProps,
|
|
134
|
+
listModal,
|
|
135
|
+
breadModel,
|
|
136
|
+
className,
|
|
137
|
+
refreshKey,
|
|
138
|
+
},
|
|
139
|
+
actions: {
|
|
140
|
+
handleSelectId,
|
|
141
|
+
handleNodeClick,
|
|
142
|
+
handleBreadcrumbClick,
|
|
143
|
+
fetchBreadData,
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
}
|