el-tree结合el-table,树形添加修改操作

本文介绍了如何在Vue.js应用中结合el-tree组件和el-table组件,实现树形数据的添加与修改操作。讨论了搜索功能的实现,以及在操作过程中遇到的表头样式塌陷问题,并提供了解决方案。

效果图

在这里插入图片描述

html

  <div class="container">
    <my-crumbs :crumbs="crumbs"></my-crumbs>
    <contentArea ref="contentBox">
      <div slot="btnCon">
        <el-button
          size="small"
          icon="el-icon-plus"
          type="primary"
          @click="addGroup"
          >新增事业群</el-button
        >
      </div>
      <!-- <div slot="searchCon">
        <el-button @click="searchBtn" icon="el-icon-search" type="primary" size="small"></el-button>
      </div> -->
      <!-- 搜索条件 -->
      <div slot="searchBox">资产类型管理</div>
      <!-- 表格部分 -->
      <div slot="tableCon">
        <el-row :gutter="24">
          <el-col :xs="24" :sm="24" :md="6">
            <div class="tree_box">
              <el-card>
                <div class="searchLeft">
                  <el-input
                    placeholder="输入关键字进行过滤"
                    v-model="filterText"
                  >
                  </el-input>
                </div>
                <el-tree
                  class="tree-line"
                  :data="treeData"
                  :props="defaultProps"
                  default-expand-all
                  :key="tree_key"
                  node-key="id"
                  :render-content="renderContent"
                  :expand-on-click-node="false"
                  :filter-node-method="filterNode"
                  @node-click="changeNodeTree"
                  ref="tree"
                >
                </el-tree>
              </el-card>
            </div>
          </el-col>
          <el-col :xs="24" :sm="24" :md="18">
            <div class="table_box">
              <el-card>
                <el-table
                  :data="tableData"
                  ref="multipleTable"
                  style="width: 100%"
                  height="600"
                  v-loading="loading"
                >
                  <el-table-column type="index" label="序号" width="120"
                    ><template slot-scope="scope">
                      <span>{
   
   {
   
    (page - 1) * limit + scope.$index + 1 }}</span>
                    </template>
                  </el-table-column>
                  <el-table-column prop="name" label="事业群名" width="260">
                  </el-table-column>
                  <el
Vue2中结合使用el-tableel-tree并使树形结构支持勾选可按以下步骤实现: ### 1. 基本组件结构 在Vue组件中引入`el-table`和`el-tree`,同时在`el-table`的列中使用`el-tree`来呈现树形结构,并为`el-tree`添加复选框。 ```vue <template> <el-table :data="tableData" border @selection-change="handleSelectionChange" > <el-table-column type="selection" width="55"></el-table-column> <el-table-column prop="name" label="Name"> <template slot-scope="scope"> <el-tree :data="[scope.row]" show-checkbox node-key="id" :default-checked-keys="checkedKeys" @check-change="handleTreeCheckChange" ></el-tree> </template> </el-table-column> </el-table> <el-button @click="toggleAllSelection">全选/反选</el-button> </template> <script> export default { data() { return { tableData: [ { id: 1, name: 'Parent 1', children: [ { id: 2, name: 'Child 1' }, { id: 3, name: 'Child 2' } ] } ], checkedKeys: [], multipleSelection: [] }; }, methods: { handleSelectionChange(val) { this.multipleSelection = val; }, handleTreeCheckChange(data, checked, indeterminate) { // 处理树节点勾选变化逻辑 if (checked) { this.checkedKeys.push(data.id); } else { const index = this.checkedKeys.indexOf(data.id); if (index > -1) { this.checkedKeys.splice(index, 1); } } }, toggleAllSelection() { if (this.multipleSelection.length === this.tableData.length) { this.$refs.multipleTable.clearSelection(); } else { this.tableData.forEach(row => { this.$refs.multipleTable.toggleRowSelection(row); }); } } } }; </script> ``` ### 2. 父子节点勾选联动 为了实现选中父节点同时勾选其所有子节点,需要在`handleTreeCheckChange`方法中添加额外逻辑来处理父子节点的勾选状态。 ```javascript handleTreeCheckChange(data, checked, indeterminate) { const checkChildren = (node, isChecked) => { if (node.children) { node.children.forEach(child => { this.$refs.tree.setChecked(child.id, isChecked); checkChildren(child, isChecked); }); } }; checkChildren(data, checked); if (checked) { this.checkedKeys.push(data.id); } else { const index = this.checkedKeys.indexOf(data.id); if (index > -1) { this.checkedKeys.splice(index, 1); } } } ``` ### 3. 全选/反选功能 在`toggleAllSelection`方法中实现全选和反选功能,同时要确保表格行和树形结构的勾选状态保持一致。 ```javascript toggleAllSelection() { const isAllSelected = this.multipleSelection.length === this.tableData.length; this.tableData.forEach(row => { this.$refs.multipleTable.toggleRowSelection(row, !isAllSelected); const checkTreeNodes = (node, isChecked) => { this.$refs.tree.setChecked(node.id, isChecked); if (node.children) { node.children.forEach(child => { checkTreeNodes(child, isChecked); }); } }; checkTreeNodes(row, !isAllSelected); }); } ``` ### 4. 动态数据与懒加载 如果需要支持动态接口数据传入或懒加载数据,可在获取数据后更新`tableData`,并使用`this.$nextTick`确保DOM更新后再进行相关操作。 ```javascript fetchData() { // 模拟接口请求 setTimeout(() => { this.tableData = [ { id: 1, name: 'Parent 1', children: [ { id: 2, name: 'Child 1' }, { id: 3, name: 'Child 2' } ] } ]; this.$nextTick(() => { // DOM更新后执行操作 }); }, 1000); } ``` ### 5. 表格分页 若要支持表格分页,可使用`el-pagination`组件,并在分页变化时重新加载数据。 ```vue <template> <div> <el-table :data="tableData" border @selection-change="handleSelectionChange" > <!-- 表格列定义 --> </el-table> <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="currentPage" :page-sizes="[10, 20, 30]" :page-size="pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total" ></el-pagination> </div> </template> <script> export default { data() { return { tableData: [], currentPage: 1, pageSize: 10, total: 0 }; }, methods: { handleSizeChange(newSize) { this.pageSize = newSize; this.fetchData(); }, handleCurrentChange(newPage) { this.currentPage = newPage; this.fetchData(); }, fetchData() { // 根据当前页码和每页数量请求数据 } } }; </script> ``` ### 注意事项 - 确保为`el-tree`绑定`node-key`属性,以便正确识别节点,如`node-key="id"` [^2]。 -修改数据后若需要操作更新后的DOM,可使用`this.$nextTick`方法 [^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值