@canlooks/can-ui 0.0.78 → 0.0.80

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.
Files changed (82) hide show
  1. package/dist/cjs/components/calendar/calendar.style.js +124 -124
  2. package/dist/cjs/components/cascade/cascade.js +1 -1
  3. package/dist/cjs/components/clickAway/clickAway.d.ts +1 -1
  4. package/dist/cjs/components/inputBase/inputBase.js +2 -5
  5. package/dist/cjs/components/popper/popper.js +3 -2
  6. package/dist/cjs/components/select/select.js +1 -1
  7. package/dist/cjs/components/status/status.d.ts +6 -6
  8. package/dist/cjs/components/treeSelect/treeSelect.js +1 -1
  9. package/dist/cjs/extensions/reactiveForm/reactiveForm.d.ts +2 -2
  10. package/dist/cjs/utils/utils.d.ts +7 -2
  11. package/dist/cjs/utils/utils.js +17 -3
  12. package/dist/esm/components/calendar/calendar.style.js +124 -124
  13. package/dist/esm/components/cascade/cascade.js +2 -2
  14. package/dist/esm/components/clickAway/clickAway.d.ts +1 -1
  15. package/dist/esm/components/inputBase/inputBase.js +3 -6
  16. package/dist/esm/components/popper/popper.js +3 -2
  17. package/dist/esm/components/select/select.js +2 -2
  18. package/dist/esm/components/status/status.d.ts +6 -6
  19. package/dist/esm/components/treeSelect/treeSelect.js +2 -2
  20. package/dist/esm/extensions/reactiveForm/reactiveForm.d.ts +2 -2
  21. package/dist/esm/utils/utils.d.ts +7 -2
  22. package/dist/esm/utils/utils.js +16 -3
  23. package/extensions/curd.cjs +5 -5
  24. package/extensions/documentViewer.cjs +5 -5
  25. package/extensions/textFormatter.cjs +5 -5
  26. package/package.json +1 -1
  27. package/documentation/dist/assets/index-DvrKS6Tv.js +0 -7747
  28. package/documentation/dist/atom-one-dark.min.css +0 -1
  29. package/documentation/dist/components/accordion.md +0 -38
  30. package/documentation/dist/components/actionSheet.md +0 -49
  31. package/documentation/dist/components/alert.md +0 -38
  32. package/documentation/dist/components/anchorList.md +0 -36
  33. package/documentation/dist/components/autocomplete.md +0 -68
  34. package/documentation/dist/components/avatar.md +0 -79
  35. package/documentation/dist/components/badge.md +0 -33
  36. package/documentation/dist/components/bottomNavigation.md +0 -39
  37. package/documentation/dist/components/breadcrumb.md +0 -28
  38. package/documentation/dist/components/bubbleConfirm.md +0 -34
  39. package/documentation/dist/components/button.md +0 -62
  40. package/documentation/dist/components/card.md +0 -30
  41. package/documentation/dist/components/cascade.md +0 -48
  42. package/documentation/dist/components/checkbox.md +0 -36
  43. package/documentation/dist/components/colorPicker.md +0 -27
  44. package/documentation/dist/components/contextMenu.md +0 -27
  45. package/documentation/dist/components/counter.md +0 -29
  46. package/documentation/dist/components/dataGrid.md +0 -112
  47. package/documentation/dist/components/dateTimePicker.md +0 -35
  48. package/documentation/dist/components/dateTimeRangePicker.md +0 -36
  49. package/documentation/dist/components/descriptions.md +0 -35
  50. package/documentation/dist/components/dialog.md +0 -56
  51. package/documentation/dist/components/divider.md +0 -26
  52. package/documentation/dist/components/drawer.md +0 -40
  53. package/documentation/dist/components/flex.md +0 -20
  54. package/documentation/dist/components/form.md +0 -131
  55. package/documentation/dist/components/formDialog.md +0 -36
  56. package/documentation/dist/components/grid.md +0 -34
  57. package/documentation/dist/components/highlight.md +0 -26
  58. package/documentation/dist/components/image.md +0 -90
  59. package/documentation/dist/components/input.md +0 -39
  60. package/documentation/dist/components/loading.md +0 -46
  61. package/documentation/dist/components/menu.md +0 -85
  62. package/documentation/dist/components/pagination.md +0 -38
  63. package/documentation/dist/components/pickerDialog.md +0 -56
  64. package/documentation/dist/components/placeholder.md +0 -30
  65. package/documentation/dist/components/progress.md +0 -43
  66. package/documentation/dist/components/radio.md +0 -37
  67. package/documentation/dist/components/rating.md +0 -35
  68. package/documentation/dist/components/resizable.md +0 -41
  69. package/documentation/dist/components/scrollbar.md +0 -31
  70. package/documentation/dist/components/segmented.md +0 -57
  71. package/documentation/dist/components/select.md +0 -30
  72. package/documentation/dist/components/skeleton.md +0 -26
  73. package/documentation/dist/components/slidableActions.md +0 -53
  74. package/documentation/dist/guide/appComponent.md +0 -30
  75. package/documentation/dist/guide/globalMethods.md +0 -238
  76. package/documentation/dist/guide/icon.md +0 -57
  77. package/documentation/dist/guide/introduction.md +0 -2
  78. package/documentation/dist/guide/overrideProps.md +0 -0
  79. package/documentation/dist/guide/startup.md +0 -23
  80. package/documentation/dist/guide/theme.md +0 -249
  81. package/documentation/dist/index.html +0 -13
  82. package/documentation/dist/logo.png +0 -0
@@ -16,128 +16,128 @@ exports.classes = (0, utils_1.defineInnerClasses)('calendar', [
16
16
  'yearItem',
17
17
  'foot'
18
18
  ]);
19
- exports.style = (0, utils_1.defineCss)(({ divider, text, spacing }) => (0, react_1.css) `
20
- .${exports.classes.head} {
21
- height: 40px;
22
- display: flex;
23
- align-items: center;
24
- justify-content: space-between;
25
- border-bottom: 1px solid ${divider};
26
- padding: 0 ${menuItem_style_1.menuListPadding}px;
27
- position: relative;
28
-
29
- .${exports.classes.headSide} {
30
- z-index: 1;
31
- }
32
-
33
- .${exports.classes.headControl} {
34
- color: ${text.placeholder};
35
- }
36
-
37
- .${exports.classes.headCenter} {
38
- display: flex;
39
- align-items: center;
40
- justify-content: center;
41
- position: absolute;
42
- inset: 0;
43
-
44
- .${exports.classes.headButton} {
45
- font-weight: bold;
46
- color: ${text.primary};
47
- }
48
- }
49
- }
50
-
51
- .${exports.classes.body} {
52
- padding: ${spacing[3]}px ${spacing[4]}px;
53
- display: grid;
54
- place-items: center;
55
-
56
- &[data-view-type=date] {
57
- font-size: ${13 / 14}em;
58
- grid-template-columns: repeat(7, 36px);
59
- grid-template-rows: repeat(7, 36px);
60
-
61
- .${exports.classes.dateItem} {
62
- width: 24px;
63
- height: 24px;
64
-
65
- &:not([data-variant=filled]) {
66
- color: ${text.primary};
67
- border-color: ${text.disabled};
68
-
69
- &[data-other-month=true] {
70
- color: ${text.placeholder};
71
- }
72
- }
73
-
74
- &:disabled {
75
- width: 100%;
76
- border-radius: 0;
77
- }
78
- }
79
- }
80
-
81
- &[data-view-type=month], &[data-view-type=year] {
82
- grid-template-columns: repeat(3, 84px);
83
- grid-template-rows: repeat(4, 63px);
84
-
85
- .${exports.classes.monthItem},
86
- .${exports.classes.yearItem} {
87
- width: 72px;
88
- padding-inline: 0;
89
-
90
- &:not([data-variant=filled]) {
91
- color: ${text.primary};
92
- }
93
- }
94
- }
95
- }
96
-
97
- &[data-size=small] {
98
- .${exports.classes.body} {
99
- &[data-view-type=date] {
100
- grid-template-columns: repeat(7, 30px);
101
- grid-template-rows: repeat(7, 30px);
102
- }
103
-
104
- &[data-view-type=month], &[data-view-type=year] {
105
- grid-template-columns: repeat(3, 70px);
106
- grid-template-rows: repeat(4, 52.5px);
107
-
108
- .${exports.classes.monthItem},
109
- .${exports.classes.yearItem} {
110
- width: 60px;
111
- }
112
- }
113
- }
114
- }
115
-
116
- &[data-size=large] {
117
- .${exports.classes.body} {
118
- &[data-view-type=date] {
119
- font-size: 1em;
120
- grid-template-columns: repeat(7, 42px);
121
- grid-template-rows: repeat(7, 42px);
122
-
123
- .${exports.classes.dateItem} {
124
- width: 32px;
125
- height: 32px;
126
- }
127
- }
128
-
129
- &[data-view-type=month], &[data-view-type=year] {
130
- grid-template-columns: repeat(3, 98px);
131
- grid-template-rows: repeat(4, 73.5px);
132
- }
133
- }
134
- }
135
-
136
- .${exports.classes.foot} {
137
- height: 41px;
138
- display: flex;
139
- align-items: center;
140
- justify-content: center;
141
- border-top: 1px solid ${divider};
142
- }
19
+ exports.style = (0, utils_1.defineCss)(({ divider, text, spacing }) => (0, react_1.css) `
20
+ .${exports.classes.head} {
21
+ height: 40px;
22
+ display: flex;
23
+ align-items: center;
24
+ justify-content: space-between;
25
+ border-bottom: 1px solid ${divider};
26
+ padding: 0 ${menuItem_style_1.menuListPadding}px;
27
+ position: relative;
28
+
29
+ .${exports.classes.headSide} {
30
+ z-index: 1;
31
+ }
32
+
33
+ .${exports.classes.headControl} {
34
+ color: ${text.placeholder};
35
+ }
36
+
37
+ .${exports.classes.headCenter} {
38
+ display: flex;
39
+ align-items: center;
40
+ justify-content: center;
41
+ position: absolute;
42
+ inset: 0;
43
+
44
+ .${exports.classes.headButton} {
45
+ font-weight: bold;
46
+ color: ${text.primary};
47
+ }
48
+ }
49
+ }
50
+
51
+ .${exports.classes.body} {
52
+ padding: ${spacing[3]}px ${spacing[4]}px;
53
+ display: grid;
54
+ place-items: center;
55
+
56
+ &[data-view-type=date] {
57
+ font-size: ${13 / 14}em;
58
+ grid-template-columns: repeat(7, 36px);
59
+ grid-template-rows: repeat(7, 36px);
60
+
61
+ .${exports.classes.dateItem} {
62
+ width: 24px;
63
+ height: 24px;
64
+
65
+ &:not([data-variant=filled]) {
66
+ color: ${text.primary};
67
+ border-color: ${text.disabled};
68
+
69
+ &[data-other-month=true] {
70
+ color: ${text.placeholder};
71
+ }
72
+ }
73
+
74
+ &:disabled {
75
+ width: 100%;
76
+ border-radius: 0;
77
+ }
78
+ }
79
+ }
80
+
81
+ &[data-view-type=month], &[data-view-type=year] {
82
+ grid-template-columns: repeat(3, 84px);
83
+ grid-template-rows: repeat(4, 63px);
84
+
85
+ .${exports.classes.monthItem},
86
+ .${exports.classes.yearItem} {
87
+ width: 72px;
88
+ padding-inline: 0;
89
+
90
+ &:not([data-variant=filled]) {
91
+ color: ${text.primary};
92
+ }
93
+ }
94
+ }
95
+ }
96
+
97
+ &[data-size=small] {
98
+ .${exports.classes.body} {
99
+ &[data-view-type=date] {
100
+ grid-template-columns: repeat(7, 30px);
101
+ grid-template-rows: repeat(7, 30px);
102
+ }
103
+
104
+ &[data-view-type=month], &[data-view-type=year] {
105
+ grid-template-columns: repeat(3, 70px);
106
+ grid-template-rows: repeat(4, 52.5px);
107
+
108
+ .${exports.classes.monthItem},
109
+ .${exports.classes.yearItem} {
110
+ width: 60px;
111
+ }
112
+ }
113
+ }
114
+ }
115
+
116
+ &[data-size=large] {
117
+ .${exports.classes.body} {
118
+ &[data-view-type=date] {
119
+ font-size: 1em;
120
+ grid-template-columns: repeat(7, 42px);
121
+ grid-template-rows: repeat(7, 42px);
122
+
123
+ .${exports.classes.dateItem} {
124
+ width: 32px;
125
+ height: 32px;
126
+ }
127
+ }
128
+
129
+ &[data-view-type=month], &[data-view-type=year] {
130
+ grid-template-columns: repeat(3, 98px);
131
+ grid-template-rows: repeat(4, 73.5px);
132
+ }
133
+ }
134
+ }
135
+
136
+ .${exports.classes.foot} {
137
+ height: 41px;
138
+ display: flex;
139
+ align-items: center;
140
+ justify-content: center;
141
+ border-top: 1px solid ${divider};
142
+ }
143
143
  `);
@@ -60,7 +60,7 @@ loading, options, labelKey = 'label', primaryKey = 'value', childrenKey = 'child
60
60
  setInnerOptions(await loadOptions(searchValue, parent));
61
61
  }, loading);
62
62
  (0, react_1.useEffect)(() => {
63
- if (loadOptions && !searchable && !innerOpen.current && (0, utils_1.toArray)(innerValue)?.length) {
63
+ if (loadOptions && !searchable && !innerOpen.current && !(0, utils_1.isNoValue)(innerValue)) {
64
64
  // 第一次渲染就有value,需要请求数据
65
65
  innerLoadOptions(innerSearchValue.current);
66
66
  }
@@ -60,7 +60,7 @@ export declare function ClickAway({ ref, container, eventType, onClickAway, disa
60
60
  results: number;
61
61
  security: string;
62
62
  unselectable: "off" | "on";
63
- popover: "" | "auto" | "manual";
63
+ popover: "" | "auto" | "manual" | "hint";
64
64
  popoverTargetAction: "toggle" | "hide" | "show";
65
65
  popoverTarget: string;
66
66
  inert: boolean;
@@ -57,13 +57,10 @@ min, max, step, precision, placeholder, disabled, readOnly, autoFocus, defaultVa
57
57
  }
58
58
  };
59
59
  const shouldRenderClearButton = () => {
60
- if (!clearable || disabled || readOnly || (0, utils_1.isUnset)(innerValue.current)) {
60
+ if (!clearable || disabled || readOnly) {
61
61
  return false;
62
62
  }
63
- if (Array.isArray(innerValue.current) || typeof innerValue.current === 'string') {
64
- return !!innerValue.current.length;
65
- }
66
- return true;
63
+ return (0, utils_1.isNoValue)(innerValue.current);
67
64
  };
68
65
  return ((0, jsx_runtime_1.jsxs)("div", { ...(0, utils_1.mergeComponentProps)(props, {
69
66
  ref: innerRef,
@@ -468,9 +468,10 @@ function Popper({ ref, popperRef, anchorElement, container = document.body, effe
468
468
  const click = () => {
469
469
  setOpenForce(false);
470
470
  };
471
- anchorRef.current.addEventListener('click', click);
471
+ const anchorEl = anchorRef.current;
472
+ anchorEl.addEventListener('click', click);
472
473
  return () => {
473
- anchorRef.current.removeEventListener('click', click);
474
+ anchorEl.removeEventListener('click', click);
474
475
  };
475
476
  }
476
477
  }, [clickToClose]);
@@ -115,7 +115,7 @@ showCheckbox = !!multiple, loading, options, labelKey = 'label', primaryKey = 'v
115
115
  value: innerValue,
116
116
  onClear,
117
117
  onBlur
118
- }), "data-focused": innerOpen.current, children: inputBaseProps => (0, jsx_runtime_1.jsxs)("div", { className: select_style_1.classes.contentWrap, children: [!(0, utils_1.toArray)(innerValue)?.length
118
+ }), "data-focused": innerOpen.current, children: inputBaseProps => (0, jsx_runtime_1.jsxs)("div", { className: select_style_1.classes.contentWrap, children: [(0, utils_1.isNoValue)(innerValue)
119
119
  ? (0, jsx_runtime_1.jsx)("div", { className: select_style_1.classes.placeholder, children: props.placeholder ?? '请选择' })
120
120
  : (0, jsx_runtime_1.jsx)("div", { className: select_style_1.classes.backfill, children: renderBackfillFn() }), (0, jsx_runtime_1.jsx)("input", { size: 1, ...(0, utils_1.mergeComponentProps)(inputBaseProps, inputProps), "data-hidden": "true" }), (0, jsx_runtime_1.jsx)("div", { className: select_style_1.classes.arrow, "data-open": innerOpen.current, children: loading
121
121
  ? (0, jsx_runtime_1.jsx)(loadingIndicator_1.LoadingIndicator, {})
@@ -3,12 +3,12 @@ import { DivProps, Status as IStatus } from '../../types';
3
3
  import { FontAwesomeIconProps } from '@fortawesome/react-fontawesome';
4
4
  export type StatusType = IStatus | 'confirm' | 'unknown';
5
5
  export declare const statusMapToIconDefinition: {
6
- info: import("@fortawesome/fontawesome-common-types").IconDefinition;
7
- success: import("@fortawesome/fontawesome-common-types").IconDefinition;
8
- warning: import("@fortawesome/fontawesome-common-types").IconDefinition;
9
- error: import("@fortawesome/fontawesome-common-types").IconDefinition;
10
- confirm: import("@fortawesome/fontawesome-common-types").IconDefinition;
11
- unknown: import("@fortawesome/fontawesome-common-types").IconDefinition;
6
+ info: import("@fortawesome/free-solid-svg-icons").IconDefinition;
7
+ success: import("@fortawesome/free-solid-svg-icons").IconDefinition;
8
+ warning: import("@fortawesome/free-solid-svg-icons").IconDefinition;
9
+ error: import("@fortawesome/free-solid-svg-icons").IconDefinition;
10
+ confirm: import("@fortawesome/free-solid-svg-icons").IconDefinition;
11
+ unknown: import("@fortawesome/free-solid-svg-icons").IconDefinition;
12
12
  };
13
13
  export interface StatusIconProps extends Partial<FontAwesomeIconProps> {
14
14
  status?: StatusType;
@@ -74,7 +74,7 @@ placeholder = '请选择', autoFocus, clearable, onClear, ...props }) => {
74
74
  return ((0, jsx_runtime_1.jsx)(popper_1.Popper, { css: popper_style_1.popperStyle, open: innerOpen.current, onOpenChange: openChangeHandler, placement: "bottom", variant: "collapse", trigger: ['click', 'enter'], disabled: props.disabled || props.readOnly, sizeAdaptable: sizeAdaptable, content: (0, jsx_runtime_1.jsx)(tree_1.Tree, { ...props, nodes: options, value: innerValue, onChange: setInnerValue }), ...popperProps, popperRef: popperRef, onPointerDown: e => {
75
75
  popperProps?.onPointerDown?.(e);
76
76
  e.preventDefault();
77
- }, children: (0, jsx_runtime_1.jsx)(inputBase_1.InputBase, { clearable: !!props.multiple, css: treeSelect_style_1.style, className: (0, utils_1.clsx)(treeSelect_style_1.classes.root, props.className), "data-focused": open, value: innerValue, onClear: clearHandler, placeholder: placeholder, autoFocus: autoFocus, disabled: props.disabled, readOnly: props.readOnly, children: inputBaseProps => (0, jsx_runtime_1.jsxs)("div", { className: treeSelect_style_1.classes.contentWrap, children: [!(0, utils_1.toArray)(innerValue)?.length
77
+ }, children: (0, jsx_runtime_1.jsx)(inputBase_1.InputBase, { clearable: !!props.multiple, css: treeSelect_style_1.style, className: (0, utils_1.clsx)(treeSelect_style_1.classes.root, props.className), "data-focused": open, value: innerValue, onClear: clearHandler, placeholder: placeholder, autoFocus: autoFocus, disabled: props.disabled, readOnly: props.readOnly, children: inputBaseProps => (0, jsx_runtime_1.jsxs)("div", { className: treeSelect_style_1.classes.contentWrap, children: [(0, utils_1.isNoValue)(innerValue)
78
78
  ? (0, jsx_runtime_1.jsx)("div", { className: treeSelect_style_1.classes.placeholder, children: placeholder })
79
79
  : (0, jsx_runtime_1.jsx)("div", { className: treeSelect_style_1.classes.backfill, children: renderBackfillFn() }), (0, jsx_runtime_1.jsx)("input", { size: 1, ...(0, utils_1.mergeComponentProps)(inputBaseProps, inputProps), "data-hidden": "true" }), (0, jsx_runtime_1.jsx)("div", { className: treeSelect_style_1.classes.arrow, "data-open": open, children: loading
80
80
  ? (0, jsx_runtime_1.jsx)(loadingIndicator_1.LoadingIndicator, {})
@@ -22,9 +22,9 @@
22
22
  import { FormProps, FormRef } from '../../components/form';
23
23
  import { ReactElement, Ref } from 'react';
24
24
  import { ReactiveFormItem } from './reactiveFormItem';
25
- export type ReactiveFormPropsRef = Pick<FormRef, 'submit' | 'getFormErrors' | 'getFieldError' | 'resetForm' | 'resetField' | 'isFormTouched' | 'isFieldTouched'>;
25
+ export type ReactiveFormRef = Pick<FormRef, 'submit' | 'getFormErrors' | 'getFieldError' | 'resetForm' | 'resetField' | 'isFormTouched' | 'isFieldTouched'>;
26
26
  export interface ReactiveFormProps extends Omit<FormProps, 'ref' | 'initialValue' | 'onChange' | 'onFinish' | 'items'> {
27
- ref?: Ref<ReactiveFormPropsRef>;
27
+ ref?: Ref<ReactiveFormRef>;
28
28
  onChange?(): void;
29
29
  onFinish?(): void;
30
30
  }
@@ -80,13 +80,18 @@ export declare function isPromise<T>(it: any): it is Promise<T>;
80
80
  * @param promise
81
81
  */
82
82
  export declare function getPromiseState(promise: Promise<any>): Promise<'pending' | 'fulfilled' | 'rejected'>;
83
+ /**
84
+ * 判断表单控件是否为空值
85
+ * @param value
86
+ */
87
+ export declare function isNoValue(value: any): boolean;
83
88
  /**
84
89
  * 将节点用某个分隔符拼接起来,通常用于渲染多选项
85
90
  * @param arr
86
91
  * @param callback
87
- * @param seperator
92
+ * @param separator
88
93
  */
89
- export declare function joinNodes<T>(arr: T[], callback: (item: T, index: number) => ReactNode, seperator?: ReactNode): (string | number | bigint | boolean | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | import("react").ReactPortal | Promise<string | number | bigint | boolean | import("react").ReactPortal | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | null | undefined)[];
94
+ export declare function joinNodes<T>(arr: T[], callback: (item: T, index: number) => ReactNode, separator?: ReactNode): (string | number | bigint | boolean | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | import("react").ReactPortal | Promise<string | number | bigint | boolean | import("react").ReactPortal | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | null | undefined)[];
90
95
  /**
91
96
  * 修复数字输入框的值,包括最大值最小值限制,以及小数点精度
92
97
  * @param value
@@ -14,6 +14,7 @@ exports.cloneRef = cloneRef;
14
14
  exports.isUnset = isUnset;
15
15
  exports.isPromise = isPromise;
16
16
  exports.getPromiseState = getPromiseState;
17
+ exports.isNoValue = isNoValue;
17
18
  exports.joinNodes = joinNodes;
18
19
  exports.fixInputNumber = fixInputNumber;
19
20
  exports.isChildOf = isChildOf;
@@ -216,16 +217,29 @@ function getPromiseState(promise) {
216
217
  return res === s ? 'pending' : 'fulfilled';
217
218
  }).catch(() => 'rejected');
218
219
  }
220
+ /**
221
+ * 判断表单控件是否为空值
222
+ * @param value
223
+ */
224
+ function isNoValue(value) {
225
+ if (isUnset(value)) {
226
+ return true;
227
+ }
228
+ if (Array.isArray(value) || typeof value === 'string') {
229
+ return !value.length;
230
+ }
231
+ return false;
232
+ }
219
233
  /**
220
234
  * 将节点用某个分隔符拼接起来,通常用于渲染多选项
221
235
  * @param arr
222
236
  * @param callback
223
- * @param seperator
237
+ * @param separator
224
238
  */
225
- function joinNodes(arr, callback, seperator = ' / ') {
239
+ function joinNodes(arr, callback, separator = ' / ') {
226
240
  return arr.flatMap((item, index) => {
227
241
  return index > 0
228
- ? [seperator, callback(item, index)]
242
+ ? [separator, callback(item, index)]
229
243
  : callback(item, index);
230
244
  });
231
245
  }