本文转载自微信公众号「 前端历劫之路」,作者maomin9761。转载本文请联系 前端历劫之路公众号。
前言
平时我们可能在做项目时,会遇到一个业务逻辑。实现一个无限级联树形表格,什么叫做无限级联树形表格呢?就是下图所展示的内容,有一个祖元素,然后下面可能有很多子孙元素,你可以实现添加、编辑、删除这样几个功能。
资源
- JavaScript框架:vue.js
- UI框架:Element UI
源码
这里需要重点说明的是,主要使用了递归的算法以及给数据标识的重要性。详细说明可以在源码中查看注释,也可以通过删改代码融会贯通。
-
- "container">
- "btn-r">
-
- type="primary"
- size="small"
- @click="addView = true"
- icon="el-icon-circle-plus-outline"
- class="add"
- >添加
- >
-
-
table - :data="tableData"
- style="width: 100%; margin-bottom: 20px"
- row-key="value"
- border
- default-expand-all
- size="medium"
- :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
- >
-
table -column prop="label" label="名称" sortable> - table-column>
-
table -column label="操作" align="center" width="180"> - "scope">
-
- type="text"
- size="small"
- @click="handleClick(scope.row, scope.$index)"
- >编辑
- >
-
- type="text"
- size="small"
- @click="deleteClick(scope.row, scope.$index)"
- >删除
- >
-
- table-column>
- table>
-
- -- 添加窗口 -->
-
- title="添加"
- :visible.sync="addView"
- :close-on-click-modal="false"
- width="30%"
- @close="closeView"
- >
-
"form" ref="form" :rules="rules"> -
- label="位置"
- :label-width="formLabelWidth"
- prop="location"
- >
-
select - v-model="form.location"
- placeholder="请选择位置"
- @change="locationChange"
- size="small"
- >
-
option - v-for="item in locationData"
- :key="item.id"
- :label="item.name"
- :value="item.id"
- />
- select>
-
-
- v-if="sonStatus"
- label="子位置"
- :label-width="formLabelWidth"
- prop="childArr"
- >
-
- size="small"
- :key="isResouceShow"
- v-model="form.childArr"
- placeholder="请选择子位置"
- :label="'name'"
- :value="'id'"
- :options="tableData"
- :props="{ checkStrictly: true }"
- clearable
- @change="getCasVal"
- >
-
-
- label="名称"
- :label-width="formLabelWidth"
- prop="label"
- >
-
- v-model="form.label"
- size="small"
- autocomplete="off"
- placeholder="请输入名称"
- >
-
-
- "footer" class="dialog-footer">
-
"addView = false" size="small" - >取 消
- >
-
"primary" @click="okAdd('form')" size="small" - >确 定
- >
-
-
-
- -- 编辑窗口 -->
-
- title="编辑"
- :visible.sync="editView"
- :close-on-click-modal="false"
- width="30%"
- >
-
"data" ref="data" :rules="rules"> -
- label="位置"
- :label-width="formLabelWidth"
- prop="location"
- >
-
select - v-model="data.location"
- placeholder="请选择位置"
- size="small"
- @change="locationChange"
- >
-
option - v-for="item in locationData"
- :key="item.id"
- :label="item.name"
- :value="item.id"
- />
- select>
-
-
- v-if="sonStatus"
- label="子位置"
- :label-width="formLabelWidth"
- prop="childArr"
- >
-
- :key="isResouceShow"
- v-model="data.childArr"
- placeholder="请选择子位置"
- size="small"
- :label="'name'"
- :value="'id'"
- :options="tableData"
- :props="{ checkStrictly: true }"
- clearable
- @change="getCasVal"
- >
-
-
- label="名称"
- :label-width="formLabelWidth"
- prop="label"
- >
-
- v-model="data.label"
- autocomplete="off"
- placeholder="请输入名称"
- size="small"
- >
-
-
- "footer" class="dialog-footer">
-
"editView = false" size="small" - >取 消
- >
-
"primary" @click="okEdit('data')" size="small" - >确 定
- >
-
-
-
-
-
-
-
-