uniapp实现表格的多选功能

avatar
作者
筋斗云
阅读量:0

记录一下最近在做一个的表格数据多选功能。需求大致为支持多选、支持跨分页的连续选择、支持通过查询框后手动选择数据(我是后端选手,前端不太熟悉单纯记录~)。

主要思路为:

  • 将table中的唯一id,存入数组tableIds中进行记录。
  • 在选中事件中,若当前为新增则存id,若为移除则remove该id。
  • 在分页事件触发时(同时会触发表格的选中事件,在这里我检查如果当前为分页事件标志则不进行表格的选中事件),首先清除表格的所有选中项 table.value.clearSelection() ,然后查询当前页的数据是否存在已经选中的数据,若存在则选中 table.value.toggleRowSelection(index) 
  • 在search事件触发时(同时会触发表格的选中事件,在这里我不进行表格的选中事件逻辑),和上面一样重新构造选中数据。

templete

<template>   <view>     <uni-section>       <uni-search-bar @confirm="search" :focus="true" v-model="queryParam.name" @blur="blur" @input="input"                       @cancel="cancel" @clear="clear">       </uni-search-bar>     </uni-section>     <view class='table-container'>       <uni-table           style='margin: 0;padding: 0'           ref="table"           :loading="loading"           border           stripe           type="selection"           emptyText="暂无更多数据"           @selection-change="selectionChange">         <uni-tr>           <uni-th :style="{ width: '100px', textAlign: 'center',height: '50px' }">姓名</uni-th>           <uni-th :style="{ width: '100px', textAlign: 'center' ,height: '50px'}">工号</uni-th>           <uni-th :style="{ width: '200px', textAlign: 'center' ,height: '50px'}">直属部门</uni-th>         </uni-tr>         <uni-tr style='height: 40px ;flex: 1 ' v-for="(item, index) in tableData" :key="index">           <uni-td>{{ item.name }}</uni-td>           <uni-td>{{ item.employeeNo }}</uni-td>           <uni-td>{{ item.department }}</uni-td>         </uni-tr>       </uni-table>       <view>         <uni-pagination             how-icon             :page-size="pageSize"             :current="pageCurrent"             :total="total"             @change="change"/>       </view>     </view>     <button         :disabled='isSubmitButtonDisabled'         class='btn-submit'         type='primary'         @click='submit'>提交     </button>   </view> </template>

ts相关代码

 <script lang='ts' setup> import {watch, onMounted, reactive, ref} from 'vue'; import {getHttp} from '@/services'; import {qcStore} from "@/store/qcStore"; import {onShow} from "@dcloudio/uni-app";  let tableData = ref([]); let pageSize = ref(10); let pageCurrent = ref(1); let total = ref(0); let loading = ref(false); let disableSelectionChangeFlag = ref(false); let isSubmitButtonDisabled = ref(true); const table = ref(); const queryParam = reactive({   name: '' }) let qc = qcStore(); onMounted(() => {   getData(pageSize.value, pageCurrent.value); }); onShow(() => {   qc.clearPersonIdsList();   qc.clearPersonNamesList(); }) let tableIds = ref([]); let tableNames = ref([]); let preItems = ref([]); let currentItems = ref([]);  async function search(res) {   pageCurrent.value = 1;   await getData(pageSize.value, pageCurrent.value);   clearAndreSelect(); }  function input(res) {   queryParam.name = res; }  async function clear(res) {   queryParam.name = '';   pageCurrent.value = 1;   await getData(pageSize.value, pageCurrent.value);   clearAndreSelect(); }  function blur(res) { }  async function cancel(res) {   queryParam.name = '';   pageCurrent.value = 1;   await getData(pageSize.value, pageCurrent.value);   clearAndreSelect(); }  // 多选 function selectionChange(e) {   if (!disableSelectionChangeFlag.value) {     currentItems.value = e.detail.index;     //新增项     let addItem = currentItems.value.filter(item => !preItems.value.includes(item));     //删除项     let removeItem = preItems.value.filter(item => !currentItems.value.includes(item));     preItems.value = [...currentItems.value];     if (addItem.length > 0) {       addItem.forEach(i => {         let personId = tableData.value[i].id;         if (!tableIds.value.includes(personId)) {           tableIds.value.push(personId);           tableNames.value.push(tableData.value[i].name);         }       })     }     if (removeItem.length > 0) {       removeItem.forEach(i => {         let personId = tableData.value[i].id;         if (tableIds.value.includes(personId)) {           tableIds.value = tableIds.value.filter(a => personId != a);           tableNames.value = tableNames.value.filter(a => a != tableData.value[i].name)         }       })     }   }  }  async function change(e) {   disableSelectionChangeFlag.value = true;   await getData(pageSize.value, e.current);   clearAndreSelect();   disableSelectionChangeFlag.value = false   pageCurrent.value = e.current; }  function clearAndreSelect() {   disableSelectionChangeFlag.value = true;   table.value.clearSelection()   preItems.value.length = 0;   currentItems.value.length = 0;   tableData.value.forEach(data => {     if (tableIds.value.includes(data.id)) {       let index = tableData.value.indexOf(data);       console.log(index)       table.value.toggleRowSelection(index)       preItems.value.push(index);       currentItems.value.push(index);     }   })   disableSelectionChangeFlag.value = false; }  function getData(pageSize: number, currentPage: number) {   return new Promise((resolve, reject) => {     getHttp('kengic-boot/qctask/qcTask/getQcReviewPerson', {       params: {         pageSize: pageSize,         pageCurrent: currentPage,         name: queryParam.name       }     }).then((data) => {       tableData.value = data.records;       total.value = data.total;       pageCurrent.value = data.current;       resolve();     })   })  }  watch(() => tableIds, (newValue) => {   if (Object.keys(newValue.value).length > 0) {     isSubmitButtonDisabled.value = false;   } else {     isSubmitButtonDisabled.value = true;   } }, {deep: true, immediate: true})  /**  * 提交.  */ function submit() {   //跳转到异常填写界面   qc.setPersonIdsList(tableIds.value);   qc.setPersonNamesList(tableNames.value);   console.log(qc.getPersonIdsList)   uni.navigateBack({     url: '/pages-manage/equipment-patrol/patrol-task/patrol-task-report'   }) } </script>

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!