el-table翻页记录已选状态

一、问题描述

  1. 记录一个弹窗点击确定按钮后,el-table列表保存已勾选的数据信息
  2. 再次打开弹窗,回显勾选所有保存的数据信息
  3. 切换分页,重新请求接口,新的数据也要回显勾选的数据

二、效果图 

@selection-change="selectionTableDtaChange"是勾选会触发的事件
:row-key="projectId"是跨页多选row-key";row-key作为勾选的标识   一般为id  根据table中对应的id命名,
type="selection"设置为:reserve-selection="true"

<el-table ref="table" :data="listData" style="width:100%" v-loading="loading"   @selection-change="selectData"  row-key="projectId">
        <el-table-column type="selection" align="center" width="40" :reserve-selection="true"></el-table-column>
 </el-table>
 methods: {
    // 封装回显
    showSeclectRow() {
        // 已经勾选的id(selectionProjectId)
      this.selectionProjectId.forEach((projectId) => {
        this.listData.forEach((row) => {
          if (row.projectId == projectId) {
            this.$refs.table.toggleRowSelection(row, true); //自动回显勾选
          }
        });
      });
    },
  
 }

 三、全部代码

父组件代码

  <el-form-item label="项目范围" prop="projectNames">
              <el-tooltip
                effect="dark"
                :content="form.projectNames||'请选择项目'"
                placement="top-start"
              >
                <el-input
                  style="width: 100%"
                  readonly
                  v-model="form.projectNames"
                  placeholder="请选择项目"
                >
                  <el-button slot="append" @click="choseProjectScope">请选择</el-button>
                </el-input>
              </el-tooltip>
        </el-form-item>

//引入组件表格弹窗 selectionProjectId,已经选择的id
     <projectScope
      :showDialog.sync="projectOpen"
      @chooseProject="submitProject"
      :selectionProjectId.sync="form.projectIds"
    ></projectScope>


<script>
     methods: {
       submitProject(data){
    
       this.$set(
        this.form,
        "projectNames",
        data.map((item) => item.projectName).join(",")
      );
      this.$set(
        this.form,
        "projectIds",
        data.map((item) => item.projectId)
      );
     
  },
        }
</script>

 子组件代码

<template>
  <el-dialog
    :visible="showDialog"
    title="选择项目"
    append-to-body
    @close="closeFn"
    width="60%"
  >
    <el-row>
      <!-- 搜索框 -->
      <el-col :span="24">
        <el-form
          :model="queryParams"
          inline
          size="small"
          @submit.native.prevent="search"
        >
          <el-form-item label="项目名称:" prop="chargeCode">
            <el-input
              v-model="queryParams.projectName"
              placeholder="请输入项目名称"
              clearable
              @keyup.native.enter="search"
            >
              >
            </el-input>
          </el-form-item>
          <el-form-item>
            <el-button type="primary" clearable @click="search">查询</el-button>
            <el-button clearable @click="reset">重置</el-button>
          </el-form-item>
        </el-form>
      </el-col>
    </el-row>
    <el-table
      v-loading="loading"
      :data="listData"
      @selection-change="selectData"
      row-key="projectId"
      height="calc(100vh - 362px)"
      ref="table"
    >
      <el-table-column
        type="selection"
        show-overflow-tooltip
        width="50"
        align="center"
        :reserve-selection="true"
      />
      <el-table-column label="项目编码" align="center" prop="projectCode" />
      <el-table-column label="项目名称" align="center" prop="projectName">
      </el-table-column>
      <el-table-column
        label="项目类型"
        show-overflow-tooltip
        align="center"
        prop="clientName"
      >
        <template slot-scope="scope">
          <span>{{ scope.row.dictData.dictLabel }}</span>
        </template>
      </el-table-column>

      <el-table-column
        label="项目负责人"
        align="center"
        prop="manager"
        show-overflow-tooltip
      >
      </el-table-column>
      <el-table-column
        label="管理面积(㎡)"
        align="center"
        prop="landArea"
        show-overflow-tooltip
      >
      </el-table-column>
    </el-table>
    <el-row type="flex" justify="end" style="margin-top: 5px">
      <el-pagination
        @size-change="handleSizeChange"
        @current-change="currentChange"
        :current-page.sync="page.pageNum"
        :page-size="page.pageSize"
        background
        layout="total, sizes, prev, pager, next, jumper"
        :total="total"
      >
      </el-pagination>
    </el-row>
    <span slot="footer">
      <el-row type="flex" justify="end">
        <el-button @click="submit" type="primary">确定</el-button>
        <el-button @click="closeFn">取消</el-button>
      </el-row>
    </span>
  </el-dialog>
</template>
<script>
import { listproject } from "@/api/system/project.js";

export default {
  props: {
    showDialog: {
      type: Boolean,
      default: false,
    },
    // 已经勾选的项目ID
    selectionProjectId: {
      type: Array,
      default: () => [],
    },
  },
  data() {
    return {
      listData: [],
      loading: false,
      total: 0,
      page: {
        pageNum: 1,
        pageSize: 10,
      },
      queryParams: {
        searchValue: null,
      },
      checkedData: null,
    };
  },
  created() {},
  watch: {
    showDialog: {
      async handler(val) {
        if (val) {
          await this.getList();
          this.showSeclectRow();
        }
      },
      immediate: true,
      deep: true,
    },
  },
  methods: {
    // 封装回显
    showSeclectRow() {
        // 已经勾选的id(selectionProjectId)
      this.selectionProjectId.forEach((projectId) => {
        this.listData.forEach((row) => {
          if (row.projectId == projectId) {
            this.$refs.table.toggleRowSelection(row, true); //自动回显勾选
          }
        });
      });
    },
    search() {
      this.page.pageNum = 1;
      this.getList();
    },
    async getList() {
      this.loading = true;
      await listproject({
        ...this.queryParams,
        ...this.page,
        status: 0, // 启用状态
      }).then((data) => {
        this.listData = data.rows;
        this.total = data.total;
        this.loading = false;
      });
    },
    // 关闭弹窗
    closeFn() {
      this.$emit("update:showDialog", false);
      this.checkedData = "";
      this.page.pageNum = 1;
      this.$refs.table.clearSelection(); //清空回显的勾选状态
    },
    // 分页 展示数量改变触发时也要重新勾选
    async currentChange(page) {
      this.page.pageNum = page;
      await this.getList();
      this.showSeclectRow();
    },
    // 分页 展示数量改变触发时也要重新勾选
    async handleSizeChange(pageSize) {
      this.page.pageSize = pageSize;
      await this.getList();
      this.showSeclectRow();
    },
    selectData(arr, val) {
      this.checkedData = arr;
    },
    submit() {
      if (!this.checkedData) {
        return this.$message.warning("请选择项目!");
      }
      this.$emit("chooseProject", this.checkedData);
      this.closeFn();
    },
    // 重置
    reset() {
      this.page.pageNum = 1;
      this.queryParams = {};
      this.getList();
    },
  },
};
</script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值