业务场景:在table类别需要建立多层分类管理列表,一建快捷展开收齐,选择上级目录的时候需要用到Treeselect展示所以层级列表
示例如下:
代码如下:
<template>
<div class="app-container">
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:classify:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="info"
plain
icon="el-icon-sort"
size="mini"
@click="toggleExpandAll"
>展开/折叠</el-button>
</el-col>
</el-row>
<el-table
ref="classifyTable"
v-if="refreshTable"
v-loading="loading"
:data="categoryList"
row-key="id"
:default-expand-all="isExpandAll"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"
border
fit
>
<el-table-column prop="categoryName" label="分类名称" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="sort" label="排序" align="center"></el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:classify:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-plus"
@click="handleAdd(scope.row)"
v-hasPermi="['system:classify:add']"
v-if="scope.row.level < 3"
>新增</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:classify:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- 添加或修改分类对话框 -->
<el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-row>
<el-col :span="24">
<!-- 修改分类信息上级菜单不允许修改 新增可以 -->
<el-form-item label="上级菜单" prop="parentId">
<treeselect v-model="form.parentId" :options="categoryListLevel2" :normalizer="normalizer" @select="treeSelectChange" :placeholder="placeholderText" noOptionsText="暂无数据" noResultsText="未找到数据" :disabled="title ==='修改分类信息'? true : false"/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="分类名称" prop="name">
<el-input v-model="form.name" placeholder="请输入分类名称" maxlength="8" show-word-limit/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="排序" prop="sort">
<el-input-number v-model="form.sort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</el-dialog>
</div>
</template>
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
name: "classify",
components: { Treeselect},
data() {
return {
// 分类树数据
categoryList: [],
// 新增时候分类树数据-只展示2级目录
categoryListLevel2:[],
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
// 表单参数
form: {},
// 表单校验
rules: {
name: [
{ required: true, message: "分类名称不能为空", trigger: "blur" }
],
sort: [
{ required: true, message: "显示排序不能为空", trigger: "blur" }
],
},
placeholderText:'选择上级菜单',
addFlag:false,//是否可以增加分类 如果已经是3级就不允许新增了
// 是否展开,默认全部展开
isExpandAll: true,
// 重新渲染表格状态
refreshTable: true,
};
},
created() {
this.getCategoryList();
},
methods: {
/** 查询分类列表 */
async getCategoryList() {
this.loading = true;
let data = await getCategoryTree();//替换为后端接口
if (data.code === SUCCESSCODE) {
// 处理列表数据
this.categoryList = data.data;
this.loading = false;
}
},
async getCategoryListLevel2() {
this.loading = true;
let data = await getCategoryTree2(2);//替换为后端接口
if (data.code === SUCCESSCODE) {
// 处理列表数据
this.categoryListLevel2 = data.data;
this.loading = false;
}
},
/** 转换分类数据结构 */
normalizer(node) {
if (node.children && !node.children.length) {
delete node.children;
}
return {
id: node.id,
label: node.categoryName,
children: node.children,
};
},
// 每次选中树结构节点
treeSelectChange(node){
// console.log(node)
if(node.level >= 3){
this.addFlag = true;
}else{
this.addFlag = false;
}
},
// 取消按钮
cancel() {
this.open = false;
this.reset();
},
// 表单重置
reset() {
this.form = {
parentId: null,
name: '',
sort: 0,
};
this.resetForm("form");
},
/** 展开/折叠操作 */
toggleExpandAll() {
this.refreshTable = false;
this.isExpandAll = !this.isExpandAll;
this.$nextTick(() => {
this.refreshTable = true;
});
},
/** 新增按钮操作 */
handleAdd(row) {
this.reset();
if (row != undefined) {
// this.form.parentId = row.parentId;
this.form.parentId = row.id; //没有上级分类默认当前分类增加子类
//如果是3级则不允许增加子类
if(row.level >= 3){
this.addFlag = true;
}else{
this.addFlag = false;
}
}
this.title = "添加分类信息";
this.placeholderText = '选择上级菜单';
this.getCategoryListLevel2(); //只展示2级目录树结构
this.open = true;
},
/** 修改按钮操作 */
async handleUpdate(row) {
this.reset();
let data = await getCategoryDetail(row.id) //替换为后端接口
if (data.code === SUCCESSCODE) {
this.form = data.data;
if(!data.data.parentId){
this.placeholderText = '主分类';
}
this.getCategoryListLevel2(); //只展示2级目录树结构
this.open = true;
this.title = "修改分类信息";
}
},
/** 提交按钮 */
async submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != undefined) {
updateCategory(this.form).then(response => {
if(response.code === SUCCESSCODE){
this.msgSuccess("修改成功");
this.open = false;
this.getCategoryList();
}
});
} else {
if(this.addFlag){
this.msgError("最多只能新建三级分类不能更多了");
return
}else{
addCategory(this.form).then(response => {
if(response.code === SUCCESSCODE){
this.msgSuccess("新增成功");
this.open = false;
this.getCategoryList();
}
});
}
}
}
});
},
/** 删除按钮操作 */
async handleDelete(row) {
let res = await this.$confirm('是否确认删除分类名称为"' + row.categoryName + '"的数据项?', "警告", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).catch(() => {
this.msgSuccess('取消删除')
});
if (res === 'confirm') {
let delData = {
id:row.id
}
let data = await delCategory(delData) //替换为后端接口
if (data.code === SUCCESSCODE) {
this.msgSuccess('删除成功')
this.getCategoryList();//移除后再次获取列表
}
}
}
}
};
结语:以上就是所有代码了,希望对你有所帮助,拜拜~