yuand 1.0.4 → 1.0.6

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.
@@ -163,13 +163,22 @@ var ProTable = function ProTable(props) {
163
163
  }
164
164
  }, [data, useData]);
165
165
  var _useMemo = useMemo(function () {
166
+ var isFunctionColumns = typeof columns === 'function';
167
+ var column = isFunctionColumns ? columns(data) : columns;
168
+ if (!isFunctionColumns) {
169
+ column.map(function (col) {
170
+ if (col.sorter) {
171
+ col.sortOrder = sorter && sorter.field === col.dataIndex ? sorter.order : null;
172
+ }
173
+ });
174
+ }
166
175
  return {
167
- column: typeof columns === "function" ? columns(data) : columns,
176
+ column: column,
168
177
  dataSource: getDataSource(data, dataKey),
169
178
  renderAlert: typeof alert === "function" ? alert(data) : alert,
170
179
  total: getTotal(totalKey, data)
171
180
  };
172
- }, [columns, data, dataKey, totalKey]),
181
+ }, [columns, data, dataKey, totalKey, sorter]),
173
182
  dataSource = _useMemo.dataSource,
174
183
  total = _useMemo.total,
175
184
  column = _useMemo.column,
@@ -224,7 +233,7 @@ var ProTable = function ProTable(props) {
224
233
  return function () {
225
234
  table.resetStore();
226
235
  };
227
- }, [table]);
236
+ }, []);
228
237
  var onFinish = useCallback(function (values) {
229
238
  if (formHandleValues) {
230
239
  values = formHandleValues(values);
@@ -26,7 +26,6 @@ export interface TableInstance<TData = any> {
26
26
  clear: () => void;
27
27
  refresh: () => void;
28
28
  reset: () => void;
29
- sortOrder: (key: string) => any;
30
29
  update: () => void;
31
30
  resetStore: () => void;
32
31
  form?: FormInstance;
@@ -40,13 +40,6 @@ var useTable = function useTable() {
40
40
  clear: function clear() {},
41
41
  refresh: function refresh() {},
42
42
  reset: function reset() {},
43
- sortOrder: function sortOrder(key) {
44
- var sorter = useStore.getState().sorter;
45
- if (sorter && sorter.field === key) {
46
- return sorter.order;
47
- }
48
- return null;
49
- },
50
43
  resetStore: function resetStore() {
51
44
  useStore.getState().setState(initState);
52
45
  },
@@ -56,20 +49,6 @@ var useTable = function useTable() {
56
49
  });
57
50
  }
58
51
  };
59
- useStore.subscribe(function (state, prevState) {
60
- var _state$sorter, _prevState$sorter, _state$sorter2, _prevState$sorter2;
61
- // 只在排序真正变化时才触发更新
62
- var sorterChanged = state.sorter !== prevState.sorter;
63
- var orderChanged = ((_state$sorter = state.sorter) === null || _state$sorter === void 0 ? void 0 : _state$sorter.order) !== ((_prevState$sorter = prevState.sorter) === null || _prevState$sorter === void 0 ? void 0 : _prevState$sorter.order);
64
- var fieldChanged = ((_state$sorter2 = state.sorter) === null || _state$sorter2 === void 0 ? void 0 : _state$sorter2.field) !== ((_prevState$sorter2 = prevState.sorter) === null || _prevState$sorter2 === void 0 ? void 0 : _prevState$sorter2.field);
65
- if (sorterChanged && (orderChanged || fieldChanged)) {
66
- // 创建新的引用以触发使用 tableRef.current 的组件更新
67
- tableRef.current = _objectSpread({}, tableRef.current);
68
- _update(function (v) {
69
- return v + 1;
70
- });
71
- }
72
- });
73
52
  }
74
53
  return [tableRef.current];
75
54
  };
@@ -11,31 +11,40 @@ import useFetch from "../../hooks/useFetch";
11
11
  import useX from "../../hooks/useX";
12
12
  import useTable from "./useTable";
13
13
  import "./style.css";
14
+
15
+ // 统一默认配置管理
14
16
  import { jsx as _jsx } from "react/jsx-runtime";
15
17
  import { jsxs as _jsxs } from "react/jsx-runtime";
16
- var defaultClassNames = {
17
- root: "main-container",
18
- form: "search-form",
19
- table: "main-table"
20
- };
21
- var defaultStyles = {
22
- root: {},
23
- form: {
24
- display: "flex",
25
- justifyContent: "space-between"
18
+ var DEFAULT_PAGE_SIZE_OPTIONS = [10, 20, 50, 100];
19
+ var DEFAULT_CONFIG = {
20
+ classNames: {
21
+ root: "main-container",
22
+ form: "search-form",
23
+ table: "main-table"
26
24
  },
27
- table: {},
28
- toolbar: {
29
- marginBottom: 15
25
+ styles: {
26
+ root: {},
27
+ form: {
28
+ display: "flex",
29
+ justifyContent: "space-between"
30
+ },
31
+ table: {},
32
+ toolbar: {
33
+ marginBottom: 15
34
+ }
35
+ },
36
+ pagination: {
37
+ showQuickJumper: true,
38
+ showSizeChanger: true,
39
+ hideOnSinglePage: false
30
40
  }
31
41
  };
32
- var DEFAULT_PAGE_SIZE_OPTIONS = [10, 20, 50, 100];
33
42
  var ProTable = function ProTable(props) {
34
- var _pagination$showQuick, _pagination$showSizeC, _pagination$hideOnSin, _pagination$pageSizeO, _pagination$showTotal, _classNames$root, _classNames$form, _classNames$table;
43
+ var _pagination$showTotal, _pagination$pageSizeO, _classNames$root, _classNames$form, _classNames$table;
35
44
  var _props$classNames = props.classNames,
36
- classNames = _props$classNames === void 0 ? defaultClassNames : _props$classNames,
45
+ classNames = _props$classNames === void 0 ? DEFAULT_CONFIG.classNames : _props$classNames,
37
46
  _props$styles = props.styles,
38
- styles = _props$styles === void 0 ? defaultStyles : _props$styles,
47
+ styles = _props$styles === void 0 ? DEFAULT_CONFIG.styles : _props$styles,
39
48
  table = props.table,
40
49
  locale = props.locale,
41
50
  _props$dataKey = props.dataKey,
@@ -51,16 +60,14 @@ var ProTable = function ProTable(props) {
51
60
  alert = props.alert,
52
61
  _props$toolbar = props.toolbar,
53
62
  toolbar = _props$toolbar === void 0 ? null : _props$toolbar,
54
- pagination = props.pagination,
63
+ _props$pagination = props.pagination,
64
+ pagination = _props$pagination === void 0 ? DEFAULT_CONFIG.pagination : _props$pagination,
55
65
  scroll = props.scroll,
56
66
  prop = _objectWithoutProperties(props, _excluded);
57
- (_pagination$showQuick = pagination.showQuickJumper) !== null && _pagination$showQuick !== void 0 ? _pagination$showQuick : pagination.showQuickJumper = true;
58
- (_pagination$showSizeC = pagination.showSizeChanger) !== null && _pagination$showSizeC !== void 0 ? _pagination$showSizeC : pagination.showSizeChanger = true;
59
- (_pagination$hideOnSin = pagination.hideOnSinglePage) !== null && _pagination$hideOnSin !== void 0 ? _pagination$hideOnSin : pagination.hideOnSinglePage = false;
60
- (_pagination$pageSizeO = pagination.pageSizeOptions) !== null && _pagination$pageSizeO !== void 0 ? _pagination$pageSizeO : pagination.pageSizeOptions = ProTable.pageSizeOptions;
61
67
  (_pagination$showTotal = pagination.showTotal) !== null && _pagination$showTotal !== void 0 ? _pagination$showTotal : pagination.showTotal = function (total) {
62
68
  return "\u5171 ".concat(total, " \u6761\u8BB0\u5F55");
63
69
  };
70
+ (_pagination$pageSizeO = pagination.pageSizeOptions) !== null && _pagination$pageSizeO !== void 0 ? _pagination$pageSizeO : pagination.pageSizeOptions = ProTable.pageSizeOptions;
64
71
  var formTitle = form.title,
65
72
  formExtra = form.extra,
66
73
  formRight = form.right,
@@ -112,13 +119,22 @@ var ProTable = function ProTable(props) {
112
119
  }),
113
120
  loading = _useFetch.loading;
114
121
  var _useMemo = useMemo(function () {
122
+ var isFunctionColumns = typeof columns === 'function';
123
+ var column = isFunctionColumns ? columns(data) : columns;
124
+ if (!isFunctionColumns) {
125
+ column.map(function (col) {
126
+ if (col.sorter) {
127
+ col.sortOrder = sorter && sorter.field === col.dataIndex ? sorter.order : null;
128
+ }
129
+ });
130
+ }
115
131
  return {
116
- column: typeof columns === "function" ? columns(data) : columns,
132
+ column: column,
117
133
  dataSource: getDataSource(data, dataKey),
118
134
  renderAlert: typeof alert === "function" ? alert(data) : alert,
119
135
  total: getTotal(totalKey, data)
120
136
  };
121
- }, [columns, data, dataKey, totalKey]),
137
+ }, [columns, data, dataKey, totalKey, sorter]),
122
138
  dataSource = _useMemo.dataSource,
123
139
  total = _useMemo.total,
124
140
  column = _useMemo.column,
@@ -163,7 +179,12 @@ var ProTable = function ProTable(props) {
163
179
  ready: true
164
180
  });
165
181
  }
166
- }, [table]);
182
+ }, []);
183
+ useEffect(function () {
184
+ return function () {
185
+ table.resetStore();
186
+ };
187
+ }, []);
167
188
  var onFinish = function onFinish(values) {
168
189
  if (formHandleValues) {
169
190
  values = formHandleValues(values);
@@ -206,10 +227,10 @@ var ProTable = function ProTable(props) {
206
227
  }, prop));
207
228
  };
208
229
  return /*#__PURE__*/_jsxs("div", {
209
- className: (_classNames$root = classNames === null || classNames === void 0 ? void 0 : classNames.root) !== null && _classNames$root !== void 0 ? _classNames$root : defaultClassNames.root,
230
+ className: (_classNames$root = classNames === null || classNames === void 0 ? void 0 : classNames.root) !== null && _classNames$root !== void 0 ? _classNames$root : DEFAULT_CONFIG.classNames.root,
210
231
  style: styles.root,
211
232
  children: [!!formItems && /*#__PURE__*/_jsxs("div", {
212
- className: (_classNames$form = classNames === null || classNames === void 0 ? void 0 : classNames.form) !== null && _classNames$form !== void 0 ? _classNames$form : defaultClassNames.form,
233
+ className: (_classNames$form = classNames === null || classNames === void 0 ? void 0 : classNames.form) !== null && _classNames$form !== void 0 ? _classNames$form : DEFAULT_CONFIG.classNames.form,
213
234
  style: styles.form,
214
235
  children: [/*#__PURE__*/_jsxs(Form, _objectSpread(_objectSpread({
215
236
  form: table.form,
@@ -234,7 +255,7 @@ var ProTable = function ProTable(props) {
234
255
  })]
235
256
  })), formRight]
236
257
  }), /*#__PURE__*/_jsxs("div", {
237
- className: (_classNames$table = classNames === null || classNames === void 0 ? void 0 : classNames.table) !== null && _classNames$table !== void 0 ? _classNames$table : defaultClassNames.table,
258
+ className: (_classNames$table = classNames === null || classNames === void 0 ? void 0 : classNames.table) !== null && _classNames$table !== void 0 ? _classNames$table : DEFAULT_CONFIG.classNames.table,
238
259
  style: styles.table,
239
260
  children: [toolbar && /*#__PURE__*/_jsx("div", {
240
261
  style: styles.toolbar,
@@ -25,7 +25,6 @@ export interface TableInstance<TData = any> {
25
25
  clear: () => void;
26
26
  refresh: () => void;
27
27
  reset: () => void;
28
- sortOrder: (key: string) => any;
29
28
  update: () => void;
30
29
  resetStore: () => void;
31
30
  form?: FormInstance;
@@ -86,7 +85,6 @@ export interface TableRef {
86
85
  clear: () => void;
87
86
  refresh: () => void;
88
87
  reset: () => void;
89
- sortOrder: (key: string) => "ascend" | "descend" | null;
90
88
  resetStore: () => void;
91
89
  update: () => void;
92
90
  }
@@ -47,13 +47,6 @@ var useTable = function useTable() {
47
47
  });
48
48
  },
49
49
  reset: function reset() {},
50
- sortOrder: function sortOrder(key) {
51
- var sorter = useStore.getState().sorter;
52
- if (sorter && sorter.field === key) {
53
- return sorter.order;
54
- }
55
- return null;
56
- },
57
50
  resetStore: function resetStore() {
58
51
  useStore.getState().setState(initState);
59
52
  },
@@ -63,15 +56,6 @@ var useTable = function useTable() {
63
56
  });
64
57
  }
65
58
  };
66
- useStore.subscribe(function (state, prevState) {
67
- var _state$sorter, _prevState$sorter;
68
- if (state.sorter !== prevState.sorter && ((_state$sorter = state.sorter) === null || _state$sorter === void 0 ? void 0 : _state$sorter.order) !== ((_prevState$sorter = prevState.sorter) === null || _prevState$sorter === void 0 ? void 0 : _prevState$sorter.order)) {
69
- tableRef.current = _objectSpread({}, tableRef.current);
70
- _update(function (v) {
71
- return v + 1;
72
- });
73
- }
74
- });
75
59
  }
76
60
  return [tableRef.current];
77
61
  };
@@ -154,13 +154,22 @@ var ProTable = (props) => {
154
154
  }
155
155
  }, [data, useData]);
156
156
  const { dataSource, total, column, renderAlert } = (0, import_react.useMemo)(() => {
157
+ const isFunctionColumns = typeof columns === "function";
158
+ let column2 = isFunctionColumns ? columns(data) : columns;
159
+ if (!isFunctionColumns) {
160
+ column2.map((col) => {
161
+ if (col.sorter) {
162
+ col.sortOrder = sorter && sorter.field === col.dataIndex ? sorter.order : null;
163
+ }
164
+ });
165
+ }
157
166
  return {
158
- column: typeof columns === "function" ? columns(data) : columns,
167
+ column: column2,
159
168
  dataSource: (0, import_table.getDataSource)(data, dataKey),
160
169
  renderAlert: typeof alert === "function" ? alert(data) : alert,
161
170
  total: (0, import_table.getTotal)(totalKey, data)
162
171
  };
163
- }, [columns, data, dataKey, totalKey]);
172
+ }, [columns, data, dataKey, totalKey, sorter]);
164
173
  const onSearch = () => {
165
174
  if (formItems) {
166
175
  table.form.submit();
@@ -211,7 +220,7 @@ var ProTable = (props) => {
211
220
  return () => {
212
221
  table.resetStore();
213
222
  };
214
- }, [table]);
223
+ }, []);
215
224
  const onFinish = (0, import_react.useCallback)((values) => {
216
225
  if (formHandleValues) {
217
226
  values = formHandleValues(values);
@@ -26,7 +26,6 @@ export interface TableInstance<TData = any> {
26
26
  clear: () => void;
27
27
  refresh: () => void;
28
28
  reset: () => void;
29
- sortOrder: (key: string) => any;
30
29
  update: () => void;
31
30
  resetStore: () => void;
32
31
  form?: FormInstance;
@@ -57,28 +57,11 @@ var useTable = (options = {}) => {
57
57
  },
58
58
  reset: () => {
59
59
  },
60
- sortOrder(key) {
61
- const sorter = useStore.getState().sorter;
62
- if (sorter && sorter.field === key) {
63
- return sorter.order;
64
- }
65
- return null;
66
- },
67
60
  resetStore() {
68
61
  useStore.getState().setState(initState);
69
62
  },
70
63
  update: () => update((v) => v + 1)
71
64
  };
72
- useStore.subscribe((state, prevState) => {
73
- var _a, _b, _c, _d;
74
- const sorterChanged = state.sorter !== prevState.sorter;
75
- const orderChanged = ((_a = state.sorter) == null ? void 0 : _a.order) !== ((_b = prevState.sorter) == null ? void 0 : _b.order);
76
- const fieldChanged = ((_c = state.sorter) == null ? void 0 : _c.field) !== ((_d = prevState.sorter) == null ? void 0 : _d.field);
77
- if (sorterChanged && (orderChanged || fieldChanged)) {
78
- tableRef.current = { ...tableRef.current };
79
- update((v) => v + 1);
80
- }
81
- });
82
65
  }
83
66
  return [tableRef.current];
84
67
  };
@@ -42,27 +42,29 @@ var import_useX = __toESM(require("../../hooks/useX"));
42
42
  var import_useTable = __toESM(require("./useTable"));
43
43
  var import_style = require("./style.css");
44
44
  var import_jsx_runtime = require("react/jsx-runtime");
45
- var defaultClassNames = {
46
- root: "main-container",
47
- form: "search-form",
48
- table: "main-table"
49
- };
50
- var defaultStyles = {
51
- root: {},
52
- form: {
53
- display: "flex",
54
- justifyContent: "space-between"
45
+ var DEFAULT_PAGE_SIZE_OPTIONS = [10, 20, 50, 100];
46
+ var DEFAULT_CONFIG = {
47
+ classNames: {
48
+ root: "main-container",
49
+ form: "search-form",
50
+ table: "main-table"
51
+ },
52
+ styles: {
53
+ root: {},
54
+ form: { display: "flex", justifyContent: "space-between" },
55
+ table: {},
56
+ toolbar: { marginBottom: 15 }
55
57
  },
56
- table: {},
57
- toolbar: {
58
- marginBottom: 15
58
+ pagination: {
59
+ showQuickJumper: true,
60
+ showSizeChanger: true,
61
+ hideOnSinglePage: false
59
62
  }
60
63
  };
61
- var DEFAULT_PAGE_SIZE_OPTIONS = [10, 20, 50, 100];
62
64
  var ProTable = (props) => {
63
65
  const {
64
- classNames = defaultClassNames,
65
- styles = defaultStyles,
66
+ classNames = DEFAULT_CONFIG.classNames,
67
+ styles = DEFAULT_CONFIG.styles,
66
68
  table,
67
69
  locale,
68
70
  dataKey = "data",
@@ -73,15 +75,12 @@ var ProTable = (props) => {
73
75
  form = {},
74
76
  alert,
75
77
  toolbar = null,
76
- pagination,
78
+ pagination = DEFAULT_CONFIG.pagination,
77
79
  scroll,
78
80
  ...prop
79
81
  } = props;
80
- pagination.showQuickJumper ?? (pagination.showQuickJumper = true);
81
- pagination.showSizeChanger ?? (pagination.showSizeChanger = true);
82
- pagination.hideOnSinglePage ?? (pagination.hideOnSinglePage = false);
83
- pagination.pageSizeOptions ?? (pagination.pageSizeOptions = ProTable.pageSizeOptions);
84
82
  pagination.showTotal ?? (pagination.showTotal = (total2) => `共 ${total2} 条记录`);
83
+ pagination.pageSizeOptions ?? (pagination.pageSizeOptions = ProTable.pageSizeOptions);
85
84
  const {
86
85
  title: formTitle,
87
86
  extra: formExtra,
@@ -129,13 +128,22 @@ var ProTable = (props) => {
129
128
  }
130
129
  });
131
130
  const { dataSource, total, column, renderAlert } = (0, import_react.useMemo)(() => {
131
+ const isFunctionColumns = typeof columns === "function";
132
+ let column2 = isFunctionColumns ? columns(data) : columns;
133
+ if (!isFunctionColumns) {
134
+ column2.map((col) => {
135
+ if (col.sorter) {
136
+ col.sortOrder = sorter && sorter.field === col.dataIndex ? sorter.order : null;
137
+ }
138
+ });
139
+ }
132
140
  return {
133
- column: typeof columns === "function" ? columns(data) : columns,
141
+ column: column2,
134
142
  dataSource: (0, import_table.getDataSource)(data, dataKey),
135
143
  renderAlert: typeof alert === "function" ? alert(data) : alert,
136
144
  total: (0, import_table.getTotal)(totalKey, data)
137
145
  };
138
- }, [columns, data, dataKey, totalKey]);
146
+ }, [columns, data, dataKey, totalKey, sorter]);
139
147
  const onSearch = () => {
140
148
  if (formItems) {
141
149
  table.form.submit();
@@ -178,7 +186,12 @@ var ProTable = (props) => {
178
186
  ready: true
179
187
  });
180
188
  }
181
- }, [table]);
189
+ }, []);
190
+ (0, import_react.useEffect)(() => {
191
+ return () => {
192
+ table.resetStore();
193
+ };
194
+ }, []);
182
195
  const onFinish = (values) => {
183
196
  if (formHandleValues) {
184
197
  values = formHandleValues(values);
@@ -224,13 +237,13 @@ var ProTable = (props) => {
224
237
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
225
238
  "div",
226
239
  {
227
- className: (classNames == null ? void 0 : classNames.root) ?? defaultClassNames.root,
240
+ className: (classNames == null ? void 0 : classNames.root) ?? DEFAULT_CONFIG.classNames.root,
228
241
  style: styles.root,
229
242
  children: [
230
243
  !!formItems && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
231
244
  "div",
232
245
  {
233
- className: (classNames == null ? void 0 : classNames.form) ?? defaultClassNames.form,
246
+ className: (classNames == null ? void 0 : classNames.form) ?? DEFAULT_CONFIG.classNames.form,
234
247
  style: styles.form,
235
248
  children: [
236
249
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
@@ -258,7 +271,7 @@ var ProTable = (props) => {
258
271
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
259
272
  "div",
260
273
  {
261
- className: (classNames == null ? void 0 : classNames.table) ?? defaultClassNames.table,
274
+ className: (classNames == null ? void 0 : classNames.table) ?? DEFAULT_CONFIG.classNames.table,
262
275
  style: styles.table,
263
276
  children: [
264
277
  toolbar && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: styles.toolbar, children: toolbar }),
@@ -25,7 +25,6 @@ export interface TableInstance<TData = any> {
25
25
  clear: () => void;
26
26
  refresh: () => void;
27
27
  reset: () => void;
28
- sortOrder: (key: string) => any;
29
28
  update: () => void;
30
29
  resetStore: () => void;
31
30
  form?: FormInstance;
@@ -86,7 +85,6 @@ export interface TableRef {
86
85
  clear: () => void;
87
86
  refresh: () => void;
88
87
  reset: () => void;
89
- sortOrder: (key: string) => "ascend" | "descend" | null;
90
88
  resetStore: () => void;
91
89
  update: () => void;
92
90
  }
@@ -62,25 +62,11 @@ var useTable = (options = {}) => {
62
62
  },
63
63
  reset: () => {
64
64
  },
65
- sortOrder(key) {
66
- const sorter = useStore.getState().sorter;
67
- if (sorter && sorter.field === key) {
68
- return sorter.order;
69
- }
70
- return null;
71
- },
72
65
  resetStore() {
73
66
  useStore.getState().setState(initState);
74
67
  },
75
68
  update: () => update((v) => v + 1)
76
69
  };
77
- useStore.subscribe((state, prevState) => {
78
- var _a, _b;
79
- if (state.sorter !== prevState.sorter && ((_a = state.sorter) == null ? void 0 : _a.order) !== ((_b = prevState.sorter) == null ? void 0 : _b.order)) {
80
- tableRef.current = { ...tableRef.current };
81
- update((v) => v + 1);
82
- }
83
- });
84
70
  }
85
71
  return [tableRef.current];
86
72
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "yuand",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "description": "hyu",
5
5
  "module": "./es/index",
6
6
  "main": "./lib/index",
@@ -10,11 +10,7 @@
10
10
  "dev": "father dev",
11
11
  "build": "sudo father build",
12
12
  "build:deps": "father prebundle",
13
- "prepublishOnly": "father doctor && npm run build",
14
- "publish": "npm publish --access public",
15
- "test": "vitest",
16
- "test:ui": "vitest --ui",
17
- "test:coverage": "vitest --coverage"
13
+ "prepublishOnly": "father doctor && npm run build"
18
14
  },
19
15
  "keywords": [],
20
16
  "authors": [
package/README.test.md DELETED
@@ -1,112 +0,0 @@
1
- # Table 组件测试说明
2
-
3
- ## 安装测试依赖
4
-
5
- ```bash
6
- npm install -D vitest @vitest/ui @vitejs/plugin-react jsdom
7
- npm install -D @testing-library/react @testing-library/user-event @testing-library/jest-dom
8
- npm install -D @types/testing-library__jest-dom
9
- ```
10
-
11
- ## 运行测试
12
-
13
- ```bash
14
- # 运行所有测试
15
- npm test
16
-
17
- # 监听模式
18
- npm test -- --watch
19
-
20
- # 生成覆盖率报告
21
- npm test -- --coverage
22
-
23
- # 运行 UI 界面
24
- npm test -- --ui
25
-
26
- # 运行特定测试文件
27
- npm test src/components/Table/__tests__/index.test.tsx
28
- ```
29
-
30
- ## 测试覆盖范围
31
-
32
- ### 1. 组件基础功能测试 (`index.test.tsx`)
33
- - ✅ 基础渲染
34
- - ✅ 加载状态
35
- - ✅ 自定义 classNames 和 styles
36
- - ✅ 自定义 dataKey 和 totalKey
37
- - ✅ 表单搜索功能
38
- - ✅ 表单提交和重置
39
- - ✅ handleValues 表单值处理
40
- - ✅ 分页器显示和切换
41
- - ✅ 每页大小变化
42
- - ✅ 列排序功能
43
- - ✅ Table 实例方法(run, reset, refresh, sortOrder)
44
- - ✅ 动态列配置(函数形式 columns)
45
- - ✅ Alert 和 Toolbar 渲染
46
- - ✅ 国际化支持
47
- - ✅ 静态方法(config, formatDate, removeEmpty)
48
-
49
- ### 2. useTable Hook 测试 (`useTable.test.ts`)
50
- - ✅ 返回正确的实例结构
51
- - ✅ 默认和自定义初始状态
52
- - ✅ 状态更新
53
- - ✅ sortOrder 方法
54
- - ✅ resetStore 方法
55
- - ✅ 实例稳定性(多次渲染)
56
- - ✅ subscribe 回调
57
- - ✅ sorter 变化触发更新
58
- - ✅ Form 实例
59
- - ✅ 多实例独立性
60
-
61
- ### 3. 集成测试 (`integration.test.tsx`)
62
- - ✅ 完整的搜索-分页-排序流程
63
- - ✅ 表单验证与条件搜索
64
- - ✅ 自定义 handleValues 转换
65
- - ✅ 动态列与数据联动
66
- - ✅ Alert 统计信息显示
67
- - ✅ 外部控制刷新与清空
68
-
69
- ## 测试配置文件
70
-
71
- ### vitest.config.ts
72
- 配置了测试环境、覆盖率报告、路径别名等。
73
-
74
- ### src/test/setup.ts
75
- 测试环境初始化,包括:
76
- - jest-dom 断言扩展
77
- - 自动清理
78
- - window.matchMedia mock
79
- - IntersectionObserver mock
80
- - ResizeObserver mock
81
-
82
- ## 覆盖率目标
83
-
84
- - **语句覆盖率**: > 80%
85
- - **分支覆盖率**: > 75%
86
- - **函数覆盖率**: > 80%
87
- - **行覆盖率**: > 80%
88
-
89
- ## 常见问题
90
-
91
- ### Q: 如何调试测试?
92
- A: 使用 `--ui` 参数打开 Vitest UI 界面进行可视化调试。
93
-
94
- ### Q: 测试运行很慢怎么办?
95
- A: 可以使用 `--run` 参数禁用监听模式,或使用 `--isolate=false` 提升性能。
96
-
97
- ### Q: 如何 mock API 请求?
98
- A: 在测试文件中使用 `vi.mock()` mock fetch 模块,参考测试文件中的示例。
99
-
100
- ## package.json 脚本配置
101
-
102
- 在 package.json 中添加以下脚本:
103
-
104
- ```json
105
- {
106
- "scripts": {
107
- "test": "vitest",
108
- "test:ui": "vitest --ui",
109
- "test:coverage": "vitest --coverage"
110
- }
111
- }
112
- ```