vue2-client 1.19.41 → 1.19.42

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vue2-client",
3
- "version": "1.19.41",
3
+ "version": "1.19.42",
4
4
  "private": false,
5
5
  "scripts": {
6
6
  "serve": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve --no-eslint",
@@ -590,7 +590,17 @@ export default {
590
590
  }
591
591
  },
592
592
  ...mapState('account', { currUser: 'user', curRoles: 'roles', curPermissions: 'permissions' }),
593
- ...mapState('setting', ['compatible'])
593
+ ...mapState('setting', ['compatible']),
594
+
595
+ /**
596
+ * 是否启用跨页选中模式
597
+ * 条件:selectRowMode 为 listView 且不在查询后清空选中 且有主键
598
+ */
599
+ isMultiPageSelectionEnabled () {
600
+ return this.selectRowMode === 'listView'
601
+ && !this.clearSelectRowAfterQuery
602
+ && (this.primaryKey || this.rowKey)
603
+ }
594
604
  },
595
605
  watch: {
596
606
  pageMaxSize: {
@@ -1041,42 +1051,9 @@ export default {
1041
1051
  result.then(res => {
1042
1052
  this.totalCount = res.totalCount || 0
1043
1053
 
1044
- // 查询后保留跨页选中行的相关逻辑
1054
+ // 数据加载完成后,恢复选中状态
1045
1055
  if (this.selectRowMode !== 'disabled' && !this.clearSelectRowAfterQuery) {
1046
- const primaryKeyName = this.primaryKey || this.rowKey
1047
- // 获取当前页所有行的key
1048
- const currentPageKeys = res.data.map(row => row[primaryKeyName])
1049
- // 找出当前页中应该被选中的行
1050
- const currentPageSelectedRows = res.data.filter(row =>
1051
- this.selectedRowKeys.includes(row[primaryKeyName])
1052
- )
1053
-
1054
- this.$nextTick(() => {
1055
- // 更新当前页选中状态
1056
- this.innerSelectedRowKeys = currentPageSelectedRows.map(row => row[primaryKeyName])
1057
- this.innerSelectedRows = currentPageSelectedRows
1058
-
1059
- if (this.$refs.table) {
1060
- this.$refs.table.updateSelect(this.innerSelectedRowKeys, this.innerSelectedRows)
1061
-
1062
- // 合并跨页选中数据:保留其他页 + 当前页最新数据
1063
- const rowsMap = new Map()
1064
- // 先保留其他页的选中行
1065
- this.selectedRows.forEach(row => {
1066
- if (!currentPageKeys.includes(row[primaryKeyName])) {
1067
- rowsMap.set(row[primaryKeyName], row)
1068
- }
1069
- })
1070
- // 再添加当前页的选中行(覆盖重复项,确保数据最新)
1071
- currentPageSelectedRows.forEach(row => {
1072
- rowsMap.set(row[primaryKeyName], row)
1073
- })
1074
- this.selectedRows = Array.from(rowsMap.values())
1075
-
1076
- // 触发选择事件
1077
- this.$emit('selectRow', this.selectedRowKeys, this.selectedRows)
1078
- }
1079
- })
1056
+ this.restoreSelectionAfterQuery(res.data)
1080
1057
  }
1081
1058
  }).catch(() => {
1082
1059
  this.$message.error('查询超时!')
@@ -1108,7 +1085,6 @@ export default {
1108
1085
  * @param nativeEvent 原生事件
1109
1086
  */
1110
1087
  onSelect (record, selected, selectedRows, nativeEvent) {
1111
- console.log('onSelect', record, selected, selectedRows)
1112
1088
  if (this.selectRowMode === 'listView') {
1113
1089
  const primaryKeyName = this.primaryKey || this.rowKey
1114
1090
  // 获取主键数据
@@ -1127,7 +1103,6 @@ export default {
1127
1103
  * @param changeRows 改变的行集合
1128
1104
  */
1129
1105
  onSelectAll (selected, selectedRows, changeRows) {
1130
- console.log('onSelectAll', selected, selectedRows, changeRows)
1131
1106
  if (this.selectRowMode === 'listView') {
1132
1107
  if (!selected) {
1133
1108
  const primaryKeyName = this.primaryKey || this.rowKey
@@ -1138,41 +1113,51 @@ export default {
1138
1113
  }
1139
1114
  }
1140
1115
  },
1116
+
1141
1117
  /**
1142
- * 选择列数据改变事件
1143
- * @param currentPageSelectedKeys 被选择的列Key集合
1144
- * @param currentPageSelectedRows 被选择的列集合
1118
+ * 【用户交互】选择列数据改变事件(用户手动勾选复选框时触发)
1119
+ *
1120
+ * 功能:处理用户勾选/取消勾选复选框的操作
1121
+ *
1122
+ * 逻辑:
1123
+ * - 跨页模式(listView):合并多页选中数据,保留其他页的选中状态
1124
+ * - 单页模式:直接使用当前页选中数据,切换页面会清空选中
1125
+ *
1126
+ * @param {Array} currentPageSelectedKeys - 当前页被选中的行keys
1127
+ * @param {Array} currentPageSelectedRows - 当前页被选中的行数据
1145
1128
  */
1146
1129
  onSelectChange (currentPageSelectedKeys, currentPageSelectedRows) {
1147
1130
  // 跨页选中模式:需要合并多页数据
1148
- if (this.selectRowMode === 'listView' && !this.clearSelectRowAfterQuery && (this.primaryKey || this.rowKey)) {
1149
- this.mergeMultiPageSelection(currentPageSelectedKeys, currentPageSelectedRows)
1131
+ if (this.isMultiPageSelectionEnabled) {
1132
+ this.mergeMultiPageSelection(currentPageSelectedRows)
1150
1133
  } else {
1151
1134
  // 单页选中模式:直接使用当前页数据
1152
1135
  this.selectedRowKeys = currentPageSelectedKeys
1153
1136
  this.selectedRows = currentPageSelectedRows
1154
1137
  }
1155
1138
 
1156
- // 更新当前页选中状态
1157
- this.innerSelectedRowKeys = currentPageSelectedKeys
1158
- this.innerSelectedRows = currentPageSelectedRows
1159
-
1160
- // 更新表格显示
1161
- this.$nextTick(() => {
1162
- this.$refs.table?.updateSelect(this.innerSelectedRowKeys, this.innerSelectedRows)
1163
- })
1164
-
1165
- // 更新按钮状态
1166
- this.updateButtonState()
1167
-
1168
- // 触发选择事件
1169
- this.$emit('selectRow', this.selectedRowKeys, this.selectedRows)
1139
+ // 同步内部状态并更新UI
1140
+ this.syncSelectionState(currentPageSelectedKeys, currentPageSelectedRows)
1170
1141
  },
1171
1142
 
1172
1143
  /**
1173
- * 合并多页选中数据
1144
+ * 【跨页选中】合并多页选中数据(核心合并逻辑)
1145
+ *
1146
+ * 功能:在跨页选中模式下,合并当前页和其他页的选中数据
1147
+ *
1148
+ * 逻辑:
1149
+ * 1. 获取当前页所有行的keys
1150
+ * 2. 保留不在当前页的已选中行(其他页的选中数据)
1151
+ * 3. 添加当前页的选中行(覆盖重复项,确保数据最新)
1152
+ * 4. 使用 Map 去重,key为主键,value为行数据
1153
+ *
1154
+ * 结果:
1155
+ * - selectedRowKeys: 所有页面选中的keys
1156
+ * - selectedRows: 所有页面选中的行数据
1157
+ *
1158
+ * @param {Array} currentPageSelectedRows - 当前页被选中的行数据
1174
1159
  */
1175
- mergeMultiPageSelection (currentPageSelectedKeys, currentPageSelectedRows) {
1160
+ mergeMultiPageSelection (currentPageSelectedRows) {
1176
1161
  const primaryKeyName = this.primaryKey || this.rowKey
1177
1162
  const currentPageAllKeys = this.$refs.table.localDataSource.map(row => row[primaryKeyName])
1178
1163
 
@@ -1197,15 +1182,112 @@ export default {
1197
1182
  },
1198
1183
 
1199
1184
  /**
1200
- * 更新按钮状态
1185
+ * 【UI同步】同步选中状态到UI(内部公共方法)
1186
+ *
1187
+ * 功能:统一处理选中状态的UI更新逻辑
1188
+ *
1189
+ * 执行步骤:
1190
+ * 1. 更新当前页选中状态(innerSelectedRowKeys/innerSelectedRows)
1191
+ * 2. 更新表格复选框显示
1192
+ * 3. 更新按钮状态(修改/删除/选择按钮的启用/禁用)
1193
+ * 4. 触发选择事件,通知父组件
1194
+ *
1195
+ * 调用场景:
1196
+ * - onSelectChange: 用户勾选复选框后
1197
+ * - restoreSelectionAfterQuery: 数据加载后恢复选中状态
1198
+ * - doUpdateTableSelection: 外部传入keys更新选中状态
1199
+ *
1200
+ * @param {Array} currentPageSelectedKeys - 当前页被选中的行keys
1201
+ * @param {Array} currentPageSelectedRows - 当前页被选中的行数据
1202
+ */
1203
+ syncSelectionState (currentPageSelectedKeys, currentPageSelectedRows) {
1204
+ // 更新当前页选中状态
1205
+ this.innerSelectedRowKeys = currentPageSelectedKeys
1206
+ this.innerSelectedRows = currentPageSelectedRows
1207
+
1208
+ // 更新表格显示
1209
+ this.$nextTick(() => {
1210
+ this.$refs.table?.updateSelect(this.innerSelectedRowKeys, this.innerSelectedRows)
1211
+ })
1212
+
1213
+ // 更新按钮状态
1214
+ this.updateButtonState()
1215
+
1216
+ // 触发选择事件
1217
+ this.$emit('selectRow', this.selectedRowKeys, this.selectedRows)
1218
+ },
1219
+
1220
+ /**
1221
+ * 【数据加载】数据加载后恢复选中状态
1222
+ *
1223
+ * 功能:在表格数据重新加载后,恢复之前的选中状态
1224
+ *
1225
+ * 使用场景:
1226
+ * - 翻页后,恢复当前页应该被选中的行
1227
+ * - 刷新数据后,保持选中状态不丢失
1228
+ *
1229
+ * 逻辑:
1230
+ * 1. 从新加载的数据中,筛选出应该被选中的行(根据 selectedRowKeys)
1231
+ * 2. 合并跨页选中数据(复用 mergeMultiPageSelection)
1232
+ * 3. 同步UI状态
1233
+ *
1234
+ * @param {Array} currentPageData - 当前页加载的数据
1235
+ */
1236
+ restoreSelectionAfterQuery (currentPageData) {
1237
+ const primaryKeyName = this.primaryKey || this.rowKey
1238
+
1239
+ // 找出当前页中应该被选中的行
1240
+ const currentPageSelectedRows = currentPageData.filter(row =>
1241
+ this.selectedRowKeys.includes(row[primaryKeyName])
1242
+ )
1243
+ const currentPageSelectedKeys = currentPageSelectedRows.map(row => row[primaryKeyName])
1244
+
1245
+ this.$nextTick(() => {
1246
+ if (!this.$refs.table) return
1247
+
1248
+ // 合并跨页选中数据(复用合并逻辑)
1249
+ this.mergeMultiPageSelection(currentPageSelectedRows)
1250
+
1251
+ // 同步UI状态
1252
+ this.syncSelectionState(currentPageSelectedKeys, currentPageSelectedRows)
1253
+ })
1254
+ },
1255
+
1256
+ /**
1257
+ * 【按钮状态】更新按钮状态
1258
+ *
1259
+ * 功能:根据选中数量,更新操作按钮的启用/禁用状态
1260
+ *
1261
+ * 按钮规则:
1262
+ * - isModify: 修改按钮,仅选中1条时启用
1263
+ * - isDelete: 删除按钮,选中至少1条时启用
1264
+ * - isChoose: 选择按钮,根据 allowSelectRowNum 配置判断
1265
+ * - allowSelectRowNum = 0: 选中任意数量即可
1266
+ * - allowSelectRowNum > 0: 必须选中指定数量
1201
1267
  */
1202
1268
  updateButtonState () {
1203
1269
  this.isModify = this.selectedRowKeys.length === 1
1204
1270
  this.isDelete = this.selectedRowKeys.length > 0
1205
- this.isChoose = this.allowSelectRowNum === 0
1206
- ? this.selectedRowKeys.length > 0
1271
+ this.isChoose = this.allowSelectRowNum === 0
1272
+ ? this.selectedRowKeys.length > 0
1207
1273
  : this.selectedRowKeys.length === this.allowSelectRowNum
1208
1274
  },
1275
+
1276
+ /**
1277
+ * 【清空选中】清空所有选中状态
1278
+ *
1279
+ * 功能:清空全局和当前页的选中状态
1280
+ *
1281
+ * 使用场景:
1282
+ * - 删除操作成功后
1283
+ * - 需要重置选中状态时
1284
+ */
1285
+ clearSelection () {
1286
+ this.selectedRowKeys = []
1287
+ this.selectedRows = []
1288
+ this.innerSelectedRowKeys = []
1289
+ this.innerSelectedRows = []
1290
+ },
1209
1291
  /**
1210
1292
  * 清除表格选中项
1211
1293
  */
@@ -1439,10 +1521,7 @@ export default {
1439
1521
  resolve(200)
1440
1522
  this.$message.success('删除成功!')
1441
1523
  // 清空选中状态
1442
- this.selectedRowKeys = []
1443
- this.selectedRows = []
1444
- this.innerSelectedRowKeys = []
1445
- this.innerSelectedRows = []
1524
+ this.clearSelection()
1446
1525
  this.refresh(true)
1447
1526
  // afterDelete
1448
1527
  this.$emit('afterDelete', requestParameters)
@@ -1453,10 +1532,7 @@ export default {
1453
1532
  resolve(res)
1454
1533
  this.$message.success('删除成功!')
1455
1534
  // 清空选中状态
1456
- this.selectedRowKeys = []
1457
- this.selectedRows = []
1458
- this.innerSelectedRowKeys = []
1459
- this.innerSelectedRows = []
1535
+ this.clearSelection()
1460
1536
  this.refresh(true)
1461
1537
  // afterDelete
1462
1538
  this.$emit('afterDelete', requestParameters)
@@ -1621,13 +1697,11 @@ export default {
1621
1697
  onExpand (expanded, record) {
1622
1698
  this.$emit('expand', expanded, record)
1623
1699
  },
1624
- // 添加新方法处理表格选中状态
1700
+ // 添加新方法处理表格选中状态(外部调用)
1625
1701
  updateTableSelection (selectedKeys) {
1626
- console.log('selectedKeys', selectedKeys)
1627
1702
  if (!this.$refs.table) {
1628
1703
  return
1629
1704
  }
1630
-
1631
1705
  // 检查数据是否已加载
1632
1706
  if (!this.$refs.table.localDataSource || this.$refs.table.localDataSource.length === 0) {
1633
1707
  // 等待数据加载完成后再处理
@@ -1649,30 +1723,18 @@ export default {
1649
1723
  doUpdateTableSelection (selectedKeys) {
1650
1724
  const primaryKeyName = this.primaryKey || this.rowKey
1651
1725
 
1652
- // 更新内部选中状态
1653
- this.selectedRowKeys = [...selectedKeys]
1654
- this.innerSelectedRowKeys = this.$refs.table.localDataSource
1655
- .filter(row => selectedKeys.includes(row[primaryKeyName]))
1656
- .map(row => row[primaryKeyName])
1657
-
1658
- // 更新选中行数据
1659
- this.selectedRows = this.$refs.table.localDataSource.filter(row =>
1726
+ // 从当前页数据中筛选出应该被选中的行
1727
+ const currentPageSelectedRows = this.$refs.table.localDataSource.filter(row =>
1660
1728
  selectedKeys.includes(row[primaryKeyName])
1661
1729
  )
1662
- this.innerSelectedRows = this.selectedRows
1663
-
1664
- // 更新表格选中状态
1665
- if (this.selectRowMode !== 'disabled' && !this.clearSelectRowAfterQuery) {
1666
- this.$refs.table.updateSelect(this.innerSelectedRowKeys, this.innerSelectedRows)
1667
- }
1730
+ const currentPageSelectedKeys = currentPageSelectedRows.map(row => row[primaryKeyName])
1668
1731
 
1669
- // 更新按钮状态
1670
- this.isModify = this.selectedRowKeys.length === 1
1671
- this.isDelete = this.selectedRowKeys.length > 0
1672
- this.isChoose = this.allowSelectRowNum === 0 ? this.selectedRowKeys.length > 0 : this.selectedRowKeys.length === this.allowSelectRowNum
1732
+ // 更新总选中状态(外部传入的keys)
1733
+ this.selectedRowKeys = [...selectedKeys]
1734
+ this.selectedRows = currentPageSelectedRows
1673
1735
 
1674
- // 触发选择事件
1675
- this.$emit('selectRow', this.selectedRowKeys, this.selectedRows)
1736
+ // 同步内部状态并更新UI(复用方法)
1737
+ this.syncSelectionState(currentPageSelectedKeys, currentPageSelectedRows)
1676
1738
  },
1677
1739
  /**
1678
1740
  * 处理进度更新事件