解决 el-table 多选框,前端分页,选中失效问题;多选改为单选

文章详细介绍了如何在Vue.js应用中使用ElementUI库的el-table组件实现行键设置、分页、保留选择状态以及从多选切换到单选的表格功能。涉及到的数据属性包括currentPage、PageSize、tableData和totalCount,以及对应的事件处理函数如handleSizeChange和handleCurrentChange。

一、1. 在 el-table 中增加 row-key=“id”

<el-table
        ref="multipleTableRef"
        :data="
          state.tableData.slice(
            (state.currentPage - 1) * state.PageSize,
            state.currentPage * state.PageSize
          )
        "
        style="width: 100%"
        @selection-change="handleSelectionChange"
        row-key="id"
>
  1. 在多选框列中增加 reserve-selection,如下:
 <el-table-column type="selection" reserve-selection/>
  1. el-table el-paginaton 前端分页
    (1)添加 el-paginaton
 <el-pagination
        background
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
          :current-page="state.currentPage"
          :page-sizes="state.pageSizes"
          :page-size="state.PageSize"
          layout="total, sizes, prev, pager, next, jumper"
          :total="state.totalCount"
        >
</el-pagination>Ï

(2) js中

const state = reactive({
  //分页 总数据
  tableData: [],
  // 默认显示第几页
  currentPage: 1,
  // 总条数,根据接口获取数据长度(注意:这里不能为空)
  totalCount: 0,
  // 个数选择器(可修改)
  pageSizes: [10, 20, 30, 40, 50],
  // 默认每页显示的条数(可修改)
  PageSize: 10,
});
// 每页每条显示的条数
const handleSizeChange = (val: any) => {
  // 改变每页显示的条数
  state.PageSize = val;
  // 注意:在改变每页显示的条数时,要将页码显示到第一页
  state.currentPage = 1;
};
const handleCurrentChange = (val: any) => {
  state.currentPage = val;
};

二、表格多选改为单选的实现

	<el-table
      :data="state.tableData"
      style="width: 100%"
      ref="multipleTableRef"
      :header-cell-style="{ textAlign: 'center' }"
      :cell-style="{ textAlign: 'center' }"
      @select="handleSelectionChange"
      row-key="id"
    >
      <el-table-column type="selection" reserve-selection />
      <el-table-column prop="number" label="编号" width="80" />
   </el-table>
const state = reactive({
  tableData: [
    {
      id: "1",
      number: "1",
    },
    ],
  selectId: "",
});
const handleSelectionChange = (selection: any, row: any) => {
  state.selectId = row.id;
  // 清除 所有勾选项
  multipleTableRef.value.clearSelection();
  // 当表格数据都没有被勾选的时候 就返回
  // 主要用于将当前勾选的表格状态清除
  if (selection.length == 0) return;
  multipleTableRef.value.toggleRowSelection(row, true);
  console.log("表格事件 ",JSON.parse(JSON.stringify(row)));
};

以上。

<template> <div class="wjgl-container"> <!-- 索引筛--> <div class="filter-bar" style="margin-bottom: 15px;"> <el-select v-model="statusFilter" placeholder="状态筛" clearable style="width: 150px; margin-right: 15px;" @change="handleFilterChange" > <el-option label="草稿" value="draft"></el-option> <el-option label="发布" value="published"></el-option> <el-option label="结束" value="closed"></el-option> </el-select> <el-date-picker v-model="dateRange" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" style="width: 300px; margin-right: 20px;" @change="handleFilterChange" ></el-date-picker> <el-input v-model="searchKeyword" placeholder="搜索问卷名称" style="width: 300px;" clearable @keyup.enter.native="handleSearch" > <el-button slot="append" icon="el-icon-search" @click="handleSearch" ></el-button> </el-input> </div> <!-- 列表操作栏 --> <div class="list-operation-bar" style="margin-bottom: 15px; display: flex; justify-content: space-between;"> <div> <el-button type="primary" icon="el-icon-plus" @click="handleCreate" > 新建问卷 </el-button> <el-button type="danger" icon="el-icon-delete" @click="handleBatchDelete" :disabled="selectedIds.length === 0" style="margin-left: 10px;" > 批量删除 </el-button> </div> </div> <!-- 问卷列表 --> <el-table :data="questionnaireList" border style="width: 100%;" v-loading="loading" @selection-change="handleSelectionChange" ref="table" > <!--按钮列 --> <el-table-column width="80" align="center" > <template slot="header"> <el-button type="text" @click="handleSelectAll" :style="{color: isAllSelected ? '#409EFF' : ''}" > {{ isAllSelected ? '取消全' : '全' }} </el-button> </template> <template slot-scope="scope"> <el-checkbox v-model="scope.row.selected" @change="(val) => handleRowSelect(scope.row, val)" ></el-checkbox> </template> </el-table-column> <el-table-column prop="id" label="ID" width="80" align="center" ></el-table-column> <el-table-column prop="title" label="问卷名称" min-width="200" ></el-table-column> <el-table-column prop="status" label="状态" width="120" align="center" > <template slot-scope="scope"> <el-tag :type="getStatusType(scope.row.status)" > {{ getStatusText(scope.row.status) }} </el-tag> </template> </el-table-column> <el-table-column prop="createTime" label="创建时间" width="180" align="center" ></el-table-column> <el-table-column prop="effectiveTime" label="生效时间" width="220" align="center" ></el-table-column> <el-table-column prop="submitCount" label="提交量" width="100" align="center" ></el-table-column> <el-table-column label="操作" width="350" align="center" > <template slot-scope="scope"> <el-button size="mini" @click="handleEdit(scope.row)" :disabled="scope.row.status === 'closed'" > 编辑 </el-button> <!-- 状态下拉单选--> <el-select size="mini" v-model="scope.row.status" @change="(val) => handleStatusChange(scope.row, val)" style="width: 100px; margin: 0 5px;" > <el-option label="草稿" value="draft"></el-option> <el-option label="发布" value="published"></el-option> <el-option label="结束" value="closed"></el-option> </el-select> <el-button size="mini" type="warning" @click="handleCopy(scope.row)" > 复制 </el-button> <el-button size="mini" type="danger" @click="handleDelete(scope.row)" > 删除 </el-button> </template> </el-table-column> </el-table> <!-- 分页 --> <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="currentPage" :page-sizes="[10, 20, 50]" :page-size="pageSize" :total="total" layout="total, sizes, prev, pager, next, jumper" style="margin-top: 20px; text-align: right;" ></el-pagination> </div> </template> <script> import request from '@/utils/request'; import { getToken } from '@/utils/auth'; import axios from 'axios'; export default { name: 'WjglIndex', data() { return { questionnaireList: [], // 问卷列表数据 searchKeyword: '', // 搜索关键词 currentPage: 1, // 当前页码 pageSize: 10, // 每页条数 total: 0, // 总条数 loading: false, // 加载状态 statusFilter: '', // 状态筛 dateRange: [], // 日期范围筛 selectedIds: [], // 选中的问卷ID数组,用于批量删除 isAllSelected: false, // 是否全状态 } }, created() { // 页面加载时获取问卷列表 this.getList() }, methods: { // 根据状态值获取显示文本 getStatusText(status) { const statusMap = { 'draft': '草稿', 'published': '发布', 'closed': '结束' } return statusMap[status] || '未知' }, // 根据状态值获取标签类型 getStatusType(status) { const typeMap = { 'draft': 'info', // 草稿 - 蓝色 'published': 'success', // 发布 - 绿色 'closed': 'danger' // 结束 - 红色 } return typeMap[status] || 'warning' }, // 日期格式化( formatDate(date) { if (!date) return ''; const d = new Date(date); return `${d.getFullYear()}-${(d.getMonth() + 1).toString().padStart(2, '0')}-${d.getDate().toString().padStart(2, '0')}`; }, // 获取问卷列表(模拟接口请求) async getList() { this.loading = true; try { // 1. 构建请求参数 const params = { pageNum: this.currentPage, pageSize: this.pageSize, keyword: this.searchKeyword.trim(), // 搜索关键词 status: this.statusFilter || undefined, // 状态筛(空值不传递) // 日期范围转换为yyyy-MM-dd格式(根据后端要求调整) startTime: this.dateRange[0] ? this.formatDate(this.dateRange[0]) : undefined, endTime: this.dateRange[1] ? this.formatDate(this.dateRange[1]) : undefined }; // 2. 调用接口(GET方法,携带token) const response = await request.get( '/qiya-wjdc/questionnaires/list', { params, headers: { 'Authorization': `Bearer ${getToken()}` // 传递token } } ); // 3. 解析响应(根据后端实际返回结构调整) if (response.code === 200) { const { total, rows } = response; // 为列表项添加selected属性(用于勾功能) this.questionnaireList = rows.map(item => ({ ...item, id: item.questionnaireId,// 统一ID字段 selected: false })); this.total = total; // 更新总条数 } else { this.$message.error(`获取失败:${response.msg || '未知错误'}`); this.questionnaireList = []; this.total = 0; } // 更新全状态 this.updateAllSelectedStatus(); } catch (err) { console.error('获取问卷列表失败:', err); this.$message.error('网络错误,获取问卷列表失败'); this.questionnaireList = []; this.total = 0; } finally { this.loading = false; } }, // 更新全状态 updateAllSelectedStatus() { if (this.questionnaireList.length === 0) { this.isAllSelected = false return } this.isAllSelected = this.questionnaireList.every(item => item.selected) }, // 全/取消全 handleSelectAll() { const newStatus = !this.isAllSelected this.questionnaireList.forEach(item => { item.selected = newStatus }) // 更新选中的ID列表 this.selectedIds = newStatus ? this.questionnaireList.map(item => item.id) : [] this.isAllSelected = newStatus }, // 行择变化 handleRowSelect(row, isSelected) { row.selected = isSelected if (isSelected) { // 选中时添加ID if (!this.selectedIds.includes(row.id)) { this.selectedIds.push(row.id) } } else { // 取消选中时移除ID this.selectedIds = this.selectedIds.filter(id => id !== row.id) } // 更新全状态 this.updateAllSelectedStatus() }, // 搜索 handleSearch() { this.currentPage = 1 // 重置页码 this.getList() }, // 筛条件变化 handleFilterChange() { this.currentPage = 1 // 重置页码 this.getList() }, // 分页大小变化 handleSizeChange(val) { this.pageSize = val this.getList() }, // 页码变化 handleCurrentChange(val) { this.currentPage = val this.getList() }, // 状态变化处理(下拉单选框变更事件) async handleStatusChange(row, newStatus) { console.log('触发状态更新方法'); console.log('当前行数据:', row); console.log('目标状态:', newStatus); console.log('row.status:', row.status, '类型:', typeof row.status); console.log('row.id:', row.id, '类型:', typeof row.id); //状态未变化则不操作 if(row.status === newStatus) return; this.loading = true; try{ const response = await request.put( `/qiya-wjdc/questionnaires/editStatus/${row.id}/${newStatus}`, {}, { headers: { 'Authorization': `Bearer ${getToken()}`, 'Content-Type': 'application/json', // 显式指定 'repeatSubmit': false // 强制跳过防重复检查 } } ); if(response.code === 200){ this.$message.success(`状态已更新为${this.getStatusText(newStatus)}`); this.getList(); // 刷新列表 } else { this.$message.error(`状态更新失败:${response.msg || '未知错误'}`); } } catch(err){ console.error('更新状态失败:', err); this.$message.error('网络错误,更新状态失败'); } finally { this.loading = false; } }, // 新建问卷 handleCreate() { this.$router.push('/wjgl/wjsc') this.$message.info('跳转到新建问卷页面') }, // 编辑问卷 handleEdit(row) { this.$router.push(`/wjgl/wjsc/${row.id}?type=edit`) this.$message.info(`跳转到编辑问卷页面,问卷ID:${row.id}`) }, // 复制问卷 async handleCopy(row) { this.loading = true; try { // 调用真实复制接口(根据后端实际接口调整) const response = await request.post( '/qiya-wjdc/questionnaires/copy', { questionnaireId: row.id }, { headers: { 'Authorization': `Bearer ${getToken()}` } } ); if (response.code === 200) { this.$message.success('复制成功'); this.getList(); } else { this.$message.error(`复制失败:${response.msg || '未知错误'}`); } } catch (err) { console.error('复制失败:', err); this.$message.error('网络错误,复制失败'); } finally { this.loading = false; } }, // 单个删除问卷 async handleDelete(row) { this.$confirm('确定要删除该问卷吗?', '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(async () => { this.loading = true; try { // 调用真实删除接口 const response = await request.post( '/qiya-wjdc/questionnaires/delete', { questionnaireId: row.id }, { headers: { 'Authorization': `Bearer ${getToken()}` } } ); if (response.code === 200) { this.$message.success('删除成功'); this.selectedIds = this.selectedIds.filter(id => id !== row.id); this.getList(); } else { this.$message.error(`删除失败:${response.msg || '未知错误'}`); } } catch (err) { console.error('删除失败:', err); this.$message.error('网络错误,删除失败'); } finally { this.loading = false; } }).catch(() => { this.$message.info('已取消删除'); }); }, // 处理择变化(用于保持选中状态同步) handleSelectionChange(selection) { this.selectedIds = selection.map(item => item.id) this.updateAllSelectedStatus() }, // 批量删除问卷 async handleBatchDelete() { if (this.selectedIds.length === 0) { this.$message.warning('请先择要删除的问卷'); return; } this.$confirm(`确定要删除选中的${this.selectedIds.length}个问卷吗?`, '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(async () => { this.loading = true; try { // 调用真实批量删除接口 const response = await request.post( '/qiya-wjdc/questionnaires/batchDelete', { questionnaireIds: this.selectedIds }, { headers: { 'Authorization': `Bearer ${getToken()}` } } ); if (response.code === 200) { this.$message.success(`成功删除${this.selectedIds.length}个问卷`); this.selectedIds = []; this.getList(); } else { this.$message.error(`批量删除失败:${response.msg || '未知错误'}`); } } catch (err) { console.error('批量删除失败:', err); this.$message.error('网络错误,批量删除失败'); } finally { this.loading = false; } }).catch(() => { this.$message.info('已取消批量删除'); }); }, } } </script> <style scoped> .wjgl-container { padding: 20px; background-color: #fff; max-height: calc(100vh - 140px); overflow-x: auto; /* 防止表格列过导致横向溢出 */ } .filter-bar { display: flex; align-items: center; margin-top: 0; } .list-operation-bar { display: flex; justify-content: space-between; align-items: center; } /* 全按钮样式优化 */ ::v-deep .el-button--text { padding: 5px 10px; font-size: 14px; } </style> 帮我检查一下,为什么我都能拿到问卷的列表数据,但是修改对应问卷的状态有能促发handleStatusChange(row, newStatus)这个方法,并且网络上有该接口请求
最新发布
10-21
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值