Просмотр исходного кода

fix(web): 商品选择器跨页保留已选(reserve-selection + 持久化map)

Xiaogang Liao 1 неделя назад
Родитель
Сommit
9e66465a8d
1 измененных файлов с 20 добавлено и 6 удалено
  1. 20 6
      cfc-web/src/views/admin/components/ProductPicker.vue

+ 20 - 6
cfc-web/src/views/admin/components/ProductPicker.vue

@@ -19,7 +19,7 @@
       @current-change="onSelect"
       @selection-change="onSelectionChange"
     >
-      <el-table-column v-if="multiple" type="selection" width="42" />
+      <el-table-column v-if="multiple" type="selection" width="42" :reserve-selection="true" />
       <el-table-column v-else width="50">
         <template slot-scope="{ row }">
           <el-radio :value="selectedId" :label="row.id" @change="onSelect(row)">&nbsp;</el-radio>
@@ -105,7 +105,8 @@ export default {
       pageSize: 20,
       query: { keyword: '', page: 1 },
       selectedProduct: null,
-      picked: []
+      picked: [],
+      _pickedMap: {}
     }
   },
   computed: {
@@ -121,6 +122,7 @@ export default {
       this.query.page = 1
       this.selectedProduct = this.multiple ? null : (this.selected || null)
       // 多选:用 selected 预填 picked,load() 后对已选行回勾
+      if (this.multiple) this._pickedMap = {}
       this.picked = this.multiple ? ((this.selected || []).slice()) : []
       this.search()
     },
@@ -155,10 +157,13 @@ export default {
     },
     restoreSelection() {
       if (!this.multiple || !this.$refs.table) return
-      const preset = this.picked.slice()
-      this.picked = []
+      if (!Object.keys(this._pickedMap || {}).length && this.picked.length) {
+        const map = {}
+        this.picked.forEach(p => { map[p.childProductId || p.id] = p })
+        this._pickedMap = map
+      }
       this.list.forEach(row => {
-        const p = preset.find(x => (x.childProductId || x.id) === row.id)
+        const p = this._pickedMap && this._pickedMap[row.id]
         if (p) {
           this.$set(row, '_childSkuId', p.childSkuId || null)
           this.$set(row, '_quantity', p.quantity || 1)
@@ -167,7 +172,15 @@ export default {
       })
     },
     onSelectionChange(rows) {
-      this.picked = rows || []
+      const pageIds = new Set((this.list || []).map(r => r.id))
+      const map = {}
+      // 保留非当前页的选中(翻页时 selection-change 只回报当前页)
+      Object.entries(this._pickedMap || {}).forEach(([id, r]) => {
+        if (!pageIds.has(Number(id))) map[id] = r
+      })
+      ;(rows || []).forEach(r => { map[r.id] = r })
+      this._pickedMap = map
+      this.picked = Object.values(map)
     },
     onSelect(row) {
       if (row && !this.multiple) this.selectedProduct = row
@@ -203,6 +216,7 @@ export default {
     handleClose() {
       this.selectedProduct = null
       this.picked = []
+      this._pickedMap = {}
     }
   }
 }