@scenetechnology/cj_iview_table 0.0.68 → 0.0.69

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/README.md CHANGED
@@ -61,12 +61,13 @@ cj_iview_table 是一个功能强大的表格组件,支持筛选、排序、
61
61
  | height | String | - | 表格高度 |
62
62
  | maxHeight | String | - | 最大高度 |
63
63
  | toolBar | Array/Boolean | true | 工具栏配置 |
64
- | defaultSize | Number | - | 默认分页大小 |
65
- | rowKey | String/Boolean | id | 开启跨分页保留选中时使用的唯一键,支持如 `id`、`user.id` |
66
- | reserveSelection | Boolean | false | 是否保留跨分页、跨筛选/搜索的多选结果 |
67
- | filterGridSpan | Number | 6 | 筛选栏栅格跨度 |
68
- | filterLabelWidth | Number | 80 | 筛选标签宽度 |
69
- | fields | Array | [] | 导出数据时需要包含的属性名 |
64
+ | defaultSize | Number | - | 默认分页大小 |
65
+ | rowKey | String/Boolean | id | 开启跨分页保留选中时使用的唯一键,支持如 `id`、`user.id` |
66
+ | selectedRowKeys | Array | [] | 外部传入的已选 rowKey 列表,可用于页面返回后恢复勾选 |
67
+ | reserveSelection | Boolean | false | 是否保留跨分页、跨筛选/搜索的多选结果 |
68
+ | filterGridSpan | Number | 6 | 筛选栏栅格跨度 |
69
+ | filterLabelWidth | Number | 80 | 筛选标签宽度 |
70
+ | fields | Array | [] | 导出数据时需要包含的属性名 |
70
71
 
71
72
  ### 列配置项
72
73
  每个column支持以下属性:
@@ -83,11 +84,12 @@ cj_iview_table 是一个功能强大的表格组件,支持筛选、排序、
83
84
  | slot | Boolean | 是否使用自定义插槽 |
84
85
 
85
86
  ## 事件
86
- | 事件名 | 说明 | 回调参数 |
87
- |--------|------|----------|
88
- | on-change | 分页、排序等变化时触发 | (pagination, filters, sorter) |
89
- | on-selection-change | 当前页选中项变化时触发 | (selection) |
90
- | on-reserve-selection-change | 开启 `reserveSelection` 后,所有已保留选中项变化时触发 | (selection) |
87
+ | 事件名 | 说明 | 回调参数 |
88
+ |--------|------|----------|
89
+ | on-change | 分页、排序等变化时触发 | (pagination, filters, sorter) |
90
+ | on-selection-change | 当前页选中项变化时触发 | (selection) |
91
+ | on-reserve-selection-change | 开启 `reserveSelection` 后,所有已保留选中项变化时触发 | (selection) |
92
+ | on-reserve-selection-keys-change | 开启 `reserveSelection` 后,所有已保留选中的 rowKey 列表变化时触发 | (selectedRowKeys) |
91
93
 
92
94
  ## 插槽
93
95
  | 插槽名 | 说明 |
@@ -109,28 +111,63 @@ cj_iview_table 是一个功能强大的表格组件,支持筛选、排序、
109
111
  - 列排序
110
112
  - 列固定
111
113
 
112
- ### 3. 数据请求
113
- 支持两种数据加载方式:
114
- - 通过data属性直接传入数据
115
- - 通过request函数异步加载数据
116
-
117
- ### 4. 跨分页保留选中
118
- 当表格包含 `type: 'selection'` 列时,可通过 `reserveSelection` 开启跨分页、跨搜索/筛选保留勾选。
119
-
120
- ```vue
121
- <cj_iview_table
122
- :columns="columns"
123
- :request="loadData"
124
- row-key="id"
125
- :reserveSelection="true"
126
- @on-reserve-selection-change="handleSelectionChange"
127
- />
128
- ```
129
-
130
- 说明:
131
- - `rowKey` 必须能唯一标识一行数据,支持多级路径,例如 `user.id`
132
- - `on-selection-change` 返回的是当前页选中项
133
- - `on-reserve-selection-change` 返回的是所有分页/筛选范围内累计保留的选中项
114
+ ### 3. 数据请求
115
+ 支持两种数据加载方式:
116
+ - 通过data属性直接传入数据
117
+ - 通过request函数异步加载数据
118
+
119
+ ### 4. 跨分页保留选中
120
+ 当表格包含 `type: 'selection'` 列时,可通过 `reserveSelection` 开启跨分页、跨搜索/筛选保留勾选。
121
+
122
+ ```vue
123
+ <cj_iview_table
124
+ :columns="columns"
125
+ :request="loadData"
126
+ row-key="id"
127
+ :reserveSelection="true"
128
+ @on-reserve-selection-change="handleSelectionChange"
129
+ />
130
+ ```
131
+
132
+ 说明:
133
+ - `rowKey` 必须能唯一标识一行数据,支持多级路径,例如 `user.id`
134
+ - `on-selection-change` 返回的是当前页选中项
135
+ - `on-reserve-selection-change` 返回的是所有分页/筛选范围内累计保留的选中项
136
+
137
+ ### 5. 跨页面返回后恢复勾选
138
+ 如果你会在离开列表页后再回来,需要由父页面自己保存已选 rowKey 列表,并在重新进入时通过 `selectedRowKeys` 传回组件。
139
+
140
+ ```vue
141
+ <cj_iview_table
142
+ :columns="columns"
143
+ :request="loadData"
144
+ row-key="id"
145
+ :reserveSelection="true"
146
+ :selectedRowKeys="savedSelectedRowKeys"
147
+ @on-reserve-selection-keys-change="handleReserveSelectionKeysChange"
148
+ />
149
+ ```
150
+
151
+ ```js
152
+ export default {
153
+ data () {
154
+ return {
155
+ savedSelectedRowKeys: JSON.parse(sessionStorage.getItem('table-selected-row-keys') || '[]')
156
+ }
157
+ },
158
+ methods: {
159
+ handleReserveSelectionKeysChange (selectedRowKeys) {
160
+ this.savedSelectedRowKeys = selectedRowKeys
161
+ sessionStorage.setItem('table-selected-row-keys', JSON.stringify(selectedRowKeys))
162
+ }
163
+ }
164
+ }
165
+ ```
166
+
167
+ 说明:
168
+ - `selectedRowKeys` 传的是 rowKey 数组,不是整行数据
169
+ - 组件会在数据重新加载后自动按这些 key 回显勾选
170
+ - 如果某些 key 在当前数据集中不存在,会被自动忽略
134
171
 
135
172
  ## 使用示例
136
173
 
@@ -25799,7 +25799,7 @@ if (typeof window !== 'undefined') {
25799
25799
  // Indicate to webpack that this file can be concatenated
25800
25800
  /* harmony default export */ var setPublicPath = (null);
25801
25801
 
25802
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/babel-loader/lib/index.js!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./packages/components/index.vue?vue&type=template&id=514a3b03&scoped=true
25802
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/babel-loader/lib/index.js!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./packages/components/index.vue?vue&type=template&id=6e06842e&scoped=true
25803
25803
  var render = function render() {
25804
25804
  var _vm = this,
25805
25805
  _c = _vm._self._c;
@@ -36510,6 +36510,10 @@ var vue_treeselect_cjs_default = /*#__PURE__*/__webpack_require__.n(vue_treesele
36510
36510
  type: [String, Boolean],
36511
36511
  default: 'id'
36512
36512
  },
36513
+ selectedRowKeys: {
36514
+ type: Array,
36515
+ default: () => []
36516
+ },
36513
36517
  reserveSelection: {
36514
36518
  type: Boolean,
36515
36519
  default: false
@@ -36551,6 +36555,7 @@ var vue_treeselect_cjs_default = /*#__PURE__*/__webpack_require__.n(vue_treesele
36551
36555
  // 选中的数据
36552
36556
  selectionItems: [],
36553
36557
  reserveSelectionMap: {},
36558
+ reserveSelectionKeys: [],
36554
36559
  isRestoringSelection: false,
36555
36560
  defToolBar: [{
36556
36561
  text: '新增',
@@ -36991,11 +36996,23 @@ var vue_treeselect_cjs_default = /*#__PURE__*/__webpack_require__.n(vue_treesele
36991
36996
  this.queueRestoreSelection();
36992
36997
  }
36993
36998
  },
36999
+ selectedRowKeys: {
37000
+ immediate: true,
37001
+ deep: true,
37002
+ handler(newVal) {
37003
+ if (this.shouldReserveSelection()) {
37004
+ this.applySelectedRowKeys(newVal);
37005
+ }
37006
+ }
37007
+ },
36994
37008
  requestParams() {
36995
37009
  this.reload();
36996
37010
  }
36997
37011
  },
36998
37012
  methods: {
37013
+ normalizeRowKeyValue(value) {
37014
+ return this.hasValidRowKey(value) ? String(value) : '';
37015
+ },
36999
37016
  hasValidRowKey(value) {
37000
37017
  return value !== undefined && value !== null && value !== '';
37001
37018
  },
@@ -37010,9 +37027,47 @@ var vue_treeselect_cjs_default = /*#__PURE__*/__webpack_require__.n(vue_treesele
37010
37027
  shouldReserveSelection() {
37011
37028
  return this.reserveSelection && this.columns.some(item => item.type === 'selection') && typeof this.rowKey === 'string' && this.rowKey !== '';
37012
37029
  },
37013
- setReserveSelectionMap(nextMap) {
37014
- this.reserveSelectionMap = nextMap;
37015
- this.selectionItems = Object.values(nextMap);
37030
+ normalizeSelectedRowKeys(selectedRowKeys = []) {
37031
+ if (!Array.isArray(selectedRowKeys)) {
37032
+ return [];
37033
+ }
37034
+ return Array.from(new Set(selectedRowKeys.map(item => this.normalizeRowKeyValue(item)).filter(Boolean)));
37035
+ },
37036
+ setReserveSelectionState(nextMap = {}, nextKeys = []) {
37037
+ const normalizedKeys = this.normalizeSelectedRowKeys(nextKeys);
37038
+ const normalizedMap = normalizedKeys.reduce((result, key) => {
37039
+ if (nextMap[key]) {
37040
+ result[key] = nextMap[key];
37041
+ }
37042
+ return result;
37043
+ }, {});
37044
+ this.reserveSelectionMap = normalizedMap;
37045
+ this.reserveSelectionKeys = normalizedKeys;
37046
+ this.selectionItems = normalizedKeys.map(key => normalizedMap[key]).filter(Boolean);
37047
+ },
37048
+ applySelectedRowKeys(selectedRowKeys = []) {
37049
+ if (!this.shouldReserveSelection()) {
37050
+ return;
37051
+ }
37052
+ const normalizedKeys = this.normalizeSelectedRowKeys(selectedRowKeys);
37053
+ const selectedKeySet = new Set(normalizedKeys);
37054
+ const nextMap = normalizedKeys.reduce((result, key) => {
37055
+ if (this.reserveSelectionMap[key]) {
37056
+ result[key] = this.reserveSelectionMap[key];
37057
+ }
37058
+ return result;
37059
+ }, {});
37060
+ this.dataSource.forEach(row => {
37061
+ const rowKey = this.normalizeRowKeyValue(this.getRowIdentity(row));
37062
+ if (rowKey && selectedKeySet.has(rowKey)) {
37063
+ nextMap[rowKey] = row;
37064
+ }
37065
+ });
37066
+ this.setReserveSelectionState(nextMap, normalizedKeys);
37067
+ this.queueRestoreSelection();
37068
+ },
37069
+ getReserveSelectionKeys() {
37070
+ return [...this.reserveSelectionKeys];
37016
37071
  },
37017
37072
  syncReserveSelection(selectionItems = []) {
37018
37073
  if (!this.shouldReserveSelection()) {
@@ -37022,23 +37077,26 @@ var vue_treeselect_cjs_default = /*#__PURE__*/__webpack_require__.n(vue_treesele
37022
37077
  const nextMap = {
37023
37078
  ...this.reserveSelectionMap
37024
37079
  };
37080
+ const nextKeys = new Set(this.reserveSelectionKeys);
37025
37081
  const pageKeys = [];
37026
37082
  this.dataSource.forEach(row => {
37027
- const rowKey = this.getRowIdentity(row);
37028
- if (this.hasValidRowKey(rowKey)) {
37029
- pageKeys.push(String(rowKey));
37083
+ const rowKey = this.normalizeRowKeyValue(this.getRowIdentity(row));
37084
+ if (rowKey) {
37085
+ pageKeys.push(rowKey);
37030
37086
  }
37031
37087
  });
37032
37088
  pageKeys.forEach(key => {
37033
37089
  delete nextMap[key];
37090
+ nextKeys.delete(key);
37034
37091
  });
37035
37092
  selectionItems.forEach(row => {
37036
- const rowKey = this.getRowIdentity(row);
37037
- if (this.hasValidRowKey(rowKey)) {
37038
- nextMap[String(rowKey)] = row;
37093
+ const rowKey = this.normalizeRowKeyValue(this.getRowIdentity(row));
37094
+ if (rowKey) {
37095
+ nextMap[rowKey] = row;
37096
+ nextKeys.add(rowKey);
37039
37097
  }
37040
37098
  });
37041
- this.setReserveSelectionMap(nextMap);
37099
+ this.setReserveSelectionState(nextMap, Array.from(nextKeys));
37042
37100
  },
37043
37101
  getCurrentTableSelection() {
37044
37102
  const tableRef = this.$refs.selection;
@@ -37060,19 +37118,16 @@ var vue_treeselect_cjs_default = /*#__PURE__*/__webpack_require__.n(vue_treesele
37060
37118
  if (!tableRef || typeof tableRef.toggleSelect !== 'function') {
37061
37119
  return;
37062
37120
  }
37063
- const selectedKeys = new Set(Object.keys(this.reserveSelectionMap));
37064
- if (selectedKeys.size === 0) {
37065
- return;
37066
- }
37121
+ const selectedKeys = new Set(this.reserveSelectionKeys);
37067
37122
  const currentSelection = this.getCurrentTableSelection();
37068
- const currentSelectionKeys = new Set(currentSelection.map(row => this.getRowIdentity(row)).filter(rowKey => this.hasValidRowKey(rowKey)).map(rowKey => String(rowKey)));
37123
+ const currentSelectionKeys = new Set(currentSelection.map(row => this.getRowIdentity(row)).map(rowKey => this.normalizeRowKeyValue(rowKey)).filter(Boolean));
37069
37124
  this.isRestoringSelection = true;
37070
37125
  this.dataSource.forEach((row, index) => {
37071
37126
  const rowKey = this.getRowIdentity(row);
37072
- if (!this.hasValidRowKey(rowKey)) {
37127
+ const normalizedKey = this.normalizeRowKeyValue(rowKey);
37128
+ if (!normalizedKey) {
37073
37129
  return;
37074
37130
  }
37075
- const normalizedKey = String(rowKey);
37076
37131
  const shouldBeSelected = selectedKeys.has(normalizedKey);
37077
37132
  const isSelected = currentSelectionKeys.has(normalizedKey);
37078
37133
  if (shouldBeSelected !== isSelected) {
@@ -37084,14 +37139,17 @@ var vue_treeselect_cjs_default = /*#__PURE__*/__webpack_require__.n(vue_treesele
37084
37139
  });
37085
37140
  },
37086
37141
  clearReserveSelection() {
37087
- this.setReserveSelectionMap({});
37088
- const selectedRowKeys = new Set(this.getCurrentTableSelection().map(row => this.getRowIdentity(row)).filter(rowKey => this.hasValidRowKey(rowKey)).map(rowKey => String(rowKey)));
37142
+ this.setReserveSelectionState({}, []);
37143
+ const selectedRowKeys = new Set(this.getCurrentTableSelection().map(row => this.getRowIdentity(row)).map(rowKey => this.normalizeRowKeyValue(rowKey)).filter(Boolean));
37089
37144
  this.dataSource.forEach((row, index) => {
37090
37145
  const rowKey = this.getRowIdentity(row);
37091
- if (this.hasValidRowKey(rowKey) && selectedRowKeys.has(String(rowKey)) && this.$refs.selection && typeof this.$refs.selection.toggleSelect === 'function') {
37146
+ const normalizedKey = this.normalizeRowKeyValue(rowKey);
37147
+ if (normalizedKey && selectedRowKeys.has(normalizedKey) && this.$refs.selection && typeof this.$refs.selection.toggleSelect === 'function') {
37092
37148
  this.$refs.selection.toggleSelect(index, rowKey);
37093
37149
  }
37094
37150
  });
37151
+ this.$emit('on-reserve-selection-change', []);
37152
+ this.$emit('on-reserve-selection-keys-change', []);
37095
37153
  },
37096
37154
  isJsonString(str) {
37097
37155
  if (typeof str !== 'string') return false;
@@ -37425,6 +37483,7 @@ var vue_treeselect_cjs_default = /*#__PURE__*/__webpack_require__.n(vue_treesele
37425
37483
  return;
37426
37484
  }
37427
37485
  this.$emit('on-reserve-selection-change', this.selectionItems);
37486
+ this.$emit('on-reserve-selection-keys-change', this.getReserveSelectionKeys());
37428
37487
  } else {
37429
37488
  this.selectionItems = selectionItems;
37430
37489
  }
@@ -38097,15 +38156,15 @@ var vue_treeselect_cjs_default = /*#__PURE__*/__webpack_require__.n(vue_treesele
38097
38156
  });
38098
38157
  ;// ./packages/components/index.vue?vue&type=script&lang=js
38099
38158
  /* harmony default export */ var packages_componentsvue_type_script_lang_js = (componentsvue_type_script_lang_js);
38100
- ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-32.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-32.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-32.use[2]!./node_modules/less-loader/dist/cjs.js??clonedRuleSet-32.use[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./packages/components/index.vue?vue&type=style&index=0&id=514a3b03&prod&scoped=true&lang=less
38159
+ ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-32.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-32.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-32.use[2]!./node_modules/less-loader/dist/cjs.js??clonedRuleSet-32.use[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./packages/components/index.vue?vue&type=style&index=0&id=6e06842e&prod&scoped=true&lang=less
38101
38160
  // extracted by mini-css-extract-plugin
38102
38161
 
38103
- ;// ./packages/components/index.vue?vue&type=style&index=0&id=514a3b03&prod&scoped=true&lang=less
38162
+ ;// ./packages/components/index.vue?vue&type=style&index=0&id=6e06842e&prod&scoped=true&lang=less
38104
38163
 
38105
- ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-12.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./packages/components/index.vue?vue&type=style&index=1&id=514a3b03&prod&lang=css
38164
+ ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-12.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./packages/components/index.vue?vue&type=style&index=1&id=6e06842e&prod&lang=css
38106
38165
  // extracted by mini-css-extract-plugin
38107
38166
 
38108
- ;// ./packages/components/index.vue?vue&type=style&index=1&id=514a3b03&prod&lang=css
38167
+ ;// ./packages/components/index.vue?vue&type=style&index=1&id=6e06842e&prod&lang=css
38109
38168
 
38110
38169
  ;// ./packages/components/index.vue
38111
38170
 
@@ -38123,7 +38182,7 @@ var components_component = normalizeComponent(
38123
38182
  staticRenderFns,
38124
38183
  false,
38125
38184
  null,
38126
- "514a3b03",
38185
+ "6e06842e",
38127
38186
  null
38128
38187
 
38129
38188
  )