背景:点击el-table列表操作行的配置按钮出现一个弹窗列表,列表支持翻页,翻页后之前已经手动勾选的状态需要保留;点击提交按钮,进行数据提交。再次打开弹窗列表接口返回上次提交的选中数据,页面需要进行回显,已回显的选中数据支持取消勾选且翻页后继续保持取消勾选的状态。

手动勾选的回显操作前面有详细讲解,本篇不做过多赘述,这里主要写回显操作及取消回显数据的选中状态,以及翻页后继续保持取消勾选状态的操作。

思路:将接口返回的选中状态的数据进行储存,如果取消勾选的该项的id匹配到接口返回的数据,则从储存的数据中删除该条。

问题1:初始化时进行一次列表接口请求,翻页时也需要进行列表接口的请求,如果每次都将接口数据赋值给自定义变量,那数据永远删除的都是上次操作的最后一条数据,删除多个时会有问题。

解决问题1:请求列表接口时,只将初始化时拿到的数据进行保存,翻页时不保存

const initData = ref<Array<any>>([]); //初始化时存放接口返回的已经提交过的选中的数据
const currentData = ref<Array<any>>([]); //全选状态时,如果取消全选,需要得到此时的数据,并与接口返回的已提交的数据进行对比,该字段对此时哪些数据已经选中进行存放
const getTableData = (val: number) => {
  tableLoading.value = true;
  redeemRetainConfigList({ scenarioId: props.beanId, page: currentPage.value, pageSize: pageSize.value }).then((res) => {
    tableLoading.value = false;
    if (val != 0) {  //只保存初始化时的数据,翻页时请求到的数据不进行保存
      initData.value = res.portfolioIdAndNameVOS;
    }
    currentData.value = res.page.content;
    tableData.value.splice(0, tableData.value.length);
    res.page.content.forEach((item) => {
      tableData.value.push({ ...item });
    });
    initCheckedTableData();
  }).catch(() => {
    tableLoading.value = false;
  })
}
//初始化时处理回显上次选中的数据
const initCheckedTableData = function () {
  initData.value.forEach((item) => {
    const checkedRow = tableData.value.find((row: any) => row.portfolioId === item.portfolioId);
    if (checkedRow) {
      tableRef.value.toggleRowSelection(checkedRow, true);
    }
  });
};



//复选框选中事件 portfolioId为唯一标识
const cart = reactive([]);
const lastArr = ref([]); //将回显后选中状态的数据取消勾选,该字段对取消勾选后的数据进行保存
const handleSelect = (selection: any, row: any) => {
  let selectType = '';
  const filterList = selection.filter((item: any) => item.portfolioId === row.portfolioId);
  if (filterList.length > 0) selectType = 'add';
  else selectType = 'delete';
  if (selectType === 'add') {
    const cartFilterList = cart.filter((item) => item.portfolioId === row.portfolioId);
    if (cartFilterList.length === 0) {
      cart.push({ ...row });
    }
  } else {
    //处理回显后选中状态的数据取消勾选操作 start
    lastArr.value = initData.value.filter(item => item.portfolioId != row.portfolioId);
    initData.value.splice(0);
    lastArr.value.forEach((item) => {
      initData.value.push(item)
    })
   //处理回显后选中状态的数据取消勾选操作 end
    const cartFilterList = cart
      .filter((item) => item.portfolioId !== row.portfolioId)
      .map((item) => {
        return { ...item };
      });
    cart.length = 0;
    cart.push(...cartFilterList);
  }
}



const handleSelectAll = function (selection: any, row: any) {
//全选状态时,找到对应的取消选中状态的数据就行删除处理 start
  currentData.value.forEach((item) => {
    lastArr.value = initData.value.filter(itemB => itemB.portfolioId != item.portfolioId);
    initData.value.splice(0);
    lastArr.value.forEach((item) => {
      initData.value.push(item)
    })
  })
//全选状态时,找到对应的取消选中状态的数据就行删除处理 end
  if (selection.length === 0) {
    const cartFilterList = cart
      .filter((item) => {
        return tableData.value.findIndex((row: any) => row.portfolioId === item.portfolioId) === -1;
      })
      .map((item) => {
        return { ...item };
      });
    cart.length = 0;
    cart.push(...cartFilterList);
  } else {
    const selectionFilterList = selection
      .filter((row: any) => {
        return cart.findIndex((item) => item.portfolioId === row.portfolioId) === -1;
      })
      .map((item: any) => {
        return { ...item };
      });
    cart.push(...selectionFilterList);
  }
};


// 翻页时勾选状态保留 start
const setSelectedCheckBox = function () {
  //将回显的选中数据与手动选中的数据进行取并集操作
  let res2 = lastArr.value.concat(cart.filter(item => lastArr.value.findIndex(itemA => itemA.portfolioId == item.portfolioId) == -1));
  res2.forEach((item) => {
    const targetRow = tableData.value.find((row: any) => row.portfolioId === item.portfolioId);
    if (targetRow) {
      tableRef.value.toggleRowSelection(targetRow, true);
    }
  });
};
watch(tableData.value, async () => {
  await nextTick();
  setSelectedCheckBox();
});
// 翻页时勾选状态保留 end

// 重置清空勾选状态 start
const clearCheckBox = function () {
  cart.forEach((tableItem) => {
    const targetRow = tableData.value.find((row: any) => row.portfolioId === tableItem.portfolioId);
    tableRef.value.toggleRowSelection(targetRow, false);
    cart.splice(cart.findIndex((item) => item.portfolioId === tableItem.portfolioId));
  });
};
// 重置清空勾选状态 end


//将选中状态的数据进行提交
const handelSubmit = () => {
//将回显的选中数据与手动选中的数据进行取并集操作
  let res2 = initData.value.concat(cart.filter(item => initData.value.findIndex(itemA => itemA.portfolioId == item.portfolioId) == -1));
  const idArr = reactive([]);
  res2.forEach((item) => {
    idArr.push(item.portfolioId)
  })
  let query = {
    scenarioId: props.beanId,
    portfolioIds: idArr,
  }
  submitRedeemRetain(query).then(() => {
    flashFlag.value = true;
    closePopUp()
  }).catch(() => {
  })
};