Vue el-table tree-props selection(表格+展开行/多级+多选)

vue element-ui el-table 展开行/多级 多选框

实列

<template>
  <el-table
    ref="multipleTable"
    @select-all="selectAll"
    @select="selectTr"
    :data="tableData"
    style="width: 100%"
    row-key="id"
    border
    default-expand-all
    :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
  >
    <el-table-column type="selection" align="center" width="55">
    </el-table-column>
    <el-table-column prop="name" label="名称" align="center"> </el-table-column>
    <el-table-column prop="date" label="日期" align="center"> </el-table-column>
  </el-table>
</template>

<script>
export default {
  data() {
    return {
      tableData: [
        {
          id: 2,
          date: "2016-05-04",
          name: "1111111111",
          isChecked: false,
        },
        {
          id: 3,
          date: "2016-05-01",
          name: "22222222",
          isChecked: false,
          children: [
            {
              id: 5,
              date: "2016-05-01",
              name: "22221111",
              isChecked: false,
              children: [
                {
                  id: 6,
                  date: "2016-05-01",
                  name: "223344",
                  isChecked: false,
                },
                {
                  id: 7,
                  date: "2016-05-01",
                  name: "223344",
                  isChecked: false,
                },
              ],
            },
            {
              id: 4,
              date: "2016-05-01",
              name: "22224444",
              isChecked: false,
            },
          ],
        },
      ],
    };
  },
  methods: {
    selectAll() {
      this.isAllSelect = !this.isAllSelect;
      let data = this.tableData;
      this.toggleSelect(data, this.isAllSelect, "all");
    },
    //选择某行
    selectTr(selection, row) {
      this.$set(row, "isChecked", !row.isChecked);
      this.$nextTick(() => {
        this.isAllSelect = row.isChecked;
        this.toggleSelect(row, row.isChecked, "tr");
      });
    },
    //递归子级
    toggleSelect(data, flag, type) {
      if (type === "all") {
        if (data.length > 0) {
          data.forEach((item) => {
            this.toggleSelection(item, flag);
            if (item.children && item.children.length > 0) {
              this.toggleSelect(item.children, flag, type);
            }
          });
        }
      } else {
        if (data.children && data.children.length > 0) {
          data.children.forEach((item) => {
            item.isChecked = flag;
            this.$refs.multipleTable.toggleRowSelection(item, flag);
            this.toggleSelect(item, flag, type);
          });
        }
      }
    },
    //改变选中
    toggleSelection(row, flag) {
      this.$set(row, "isChecked", flag);
      this.$nextTick(() => {
        if (flag) {
          this.$refs.multipleTable.toggleRowSelection(row, flag);
        } else {
          this.$refs.multipleTable.clearSelection();
        }
      });
    },
  },
};
</script>

<style></style>

        
(XLSX)导出选中数据
  1. el-table复制一份
  2. 选中的数据赋值到新table
  3. 导出新table
  4. XLSX使用说明.
Vue.js结合Element UI中,实现el-table级别的级联多选功能通常需要以下几个步骤: 1. **安装依赖**: 首先确保已经安装了VueElement UI以及相关的库,如axios用于数据请求。 ```bash npm install vue element-ui axios ``` 2. **组件结构**: 设计一个Vue组件,包含一个`el-table`,并配置级联选择的数据源和事件处理函数。 ```html <template> <div> <el-form> <el-table :data="treeData" ref="table" v-loading="loading"> <!-- 表格列配置 --> <el-table-column type="selection" width="55"></el-table-column> <!-- ...其他列... --> <el-table-column label="操作"> <template slot-scope="{ row }"> <el-button @click="handleCascadeSelect(row)">选择</el-button> </template> </el-table-column> </el-table> </el-form> </div> </template> <script> export default { data() { return { treeData: [], // 级联数据数组 loading: false, selectedRows: [] // 保存当前被选中的 }; }, methods: { handleCascadeSelect(row) { if (this.selectedRows.includes(row)) { this.selectedRows.splice(this.selectedRows.indexOf(row), 1); } else { this.selectedRows.push(row); } // 更新表格状态,例如通过API同步到服务器 this.$axios.post('/api/cascade-select', { ids: this.selectedRows.map(r => r.id) }); }, // 加载数据(假设从后台获取) fetchData() { this.loading = true; this.$axios.get('/api/tree-data').then(response => { this.treeData = response.data; this.loading = false; }); } }, created() { this.fetchData(); } }; </script> ``` 3. **数据绑定**: `treeData`应该是一个嵌套的对象数组,每个元素表示一级菜单,包含标识符和下拉选项。 4. **生命周期钩子**: 使用`created`生命周期钩子加载初始数据,`fetchData`函数可以替换为你实际的数据获取方法。 **注意事项**: - 确保在表格渲染之前数据已准备就绪。 - 如果有层级关系,你可以添加递归或懒加载机制来处理复杂的树形结构。 - `handleCascadeSelect`方法可以根据需求调整,比如发送异步请求更新数据库等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值