返回顶部
首页 > 资讯 > 前端开发 > node.js >Vue中怎么实现一个无限级联树形表格
  • 718
分享到

Vue中怎么实现一个无限级联树形表格

2024-04-02 19:04:59 718人浏览 独家记忆
摘要

这篇文章给大家介绍Vue中怎么实现一个无限级联树形表格,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。资源javascript框架:vue.jsUI框架:Element UI源码这里需要

这篇文章给大家介绍Vue中怎么实现一个无限级联树形表格,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

资源

源码

这里需要重点说明的是,主要使用了递归算法以及给数据标识的重要性。详细说明可以在源码中查看注释,也可以通过删改代码融会贯通。

<template>     <div class="container">         <div class="btn-r">             <el-button                 type="primary"                 size="small"                 @click="addView = true"                 icon="el-icon-circle-plus-outline"                 class="add"                 >添加</el-button             >         </div>         <el-table             :data="tableData"             style="width: 100%; margin-bottom: 20px"             row-key="value"             border             default-expand-all             size="medium"             :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"         >             <el-table-column prop="label" label="名称" sortable>             </el-table-column>             <el-table-column label="操作" align="center" width="180">                 <template slot-scope="scope">                     <el-button                         type="text"                         size="small"                         @click="handleClick(scope.row, scope.$index)"                         >编辑</el-button                     >                     <el-button                         type="text"                         size="small"                         @click="deleteClick(scope.row, scope.$index)"                         >删除</el-button                     >                 </template>             </el-table-column>         </el-table>          <!-- 添加窗口 -->         <el-dialog             title="添加"             :visible.sync="addView"             :close-on-click-modal="false"             width="30%"             @close="closeView"         >             <el-fORM :model="form" ref="form" :rules="rules">                 <el-form-item                     label="位置"                     :label-width="formLabelWidth"                     prop="location"                 >                     <el-select                         v-model="form.location"                         placeholder="请选择位置"                         @change="locationChange"                         size="small"                     >                         <el-option                             v-for="item in locationData"                             :key="item.id"                             :label="item.name"                             :value="item.id"                         />                     </el-select>                 </el-form-item>                 <el-form-item                     v-if="sonStatus"                     label="子位置"                     :label-width="formLabelWidth"                     prop="childArr"                 >                     <el-cascader                         size="small"                         :key="isResouceShow"                         v-model="form.childArr"                         placeholder="请选择子位置"                         :label="'name'"                         :value="'id'"                         :options="tableData"                         :props="{ checkStrictly: true }"                         clearable                         @change="getCasVal"                     ></el-cascader>                 </el-form-item>                 <el-form-item                     label="名称"                     :label-width="formLabelWidth"                     prop="label"                 >                     <el-input                         v-model="form.label"                         size="small"                         autocomplete="off"                         placeholder="请输入名称"                     ></el-input>                 </el-form-item>             </el-form>             <span slot="footer" class="dialog-footer">                 <el-button @click="addView = false" size="small"                     >取 消</el-button                 >                 <el-button type="primary" @click="okAdd('form')" size="small"                     >确 定</el-button                 >             </span>         </el-dialog>          <!-- 编辑窗口 -->         <el-dialog             title="编辑"             :visible.sync="editView"             :close-on-click-modal="false"             width="30%"         >             <el-form :model="data" ref="data" :rules="rules">                 <el-form-item                     label="位置"                     :label-width="formLabelWidth"                     prop="location"                 >                     <el-select                         v-model="data.location"                         placeholder="请选择位置"                         size="small"                         @change="locationChange"                     >                         <el-option                             v-for="item in locationData"                             :key="item.id"                             :label="item.name"                             :value="item.id"                         />                     </el-select>                 </el-form-item>                 <el-form-item                     v-if="sonStatus"                     label="子位置"                     :label-width="formLabelWidth"                     prop="childArr"                 >                     <el-cascader                         :key="isResouceShow"                         v-model="data.childArr"                         placeholder="请选择子位置"                         size="small"                         :label="'name'"                         :value="'id'"                         :options="tableData"                         :props="{ checkStrictly: true }"                         clearable                         @change="getCasVal"                     ></el-cascader>                 </el-form-item>                 <el-form-item                     label="名称"                     :label-width="formLabelWidth"                     prop="label"                 >                     <el-input                         v-model="data.label"                         autocomplete="off"                         placeholder="请输入名称"                         size="small"                     ></el-input>                 </el-form-item>             </el-form>             <span slot="footer" class="dialog-footer">                 <el-button @click="editView = false" size="small"                     >取 消</el-button                 >                 <el-button type="primary" @click="okEdit('data')" size="small"                     >确 定</el-button                 >             </span>         </el-dialog>     </div> </template>  <script> export default {     name: 'Tag',     data() {         return {             location: '',             isResouceShow: 1,             addView: false,             sonStatus: false,             editView: false,             casArr: [],             childArr: [],             form: {},             data: {},             idx: '',             childkey: [],             formLabelWidth: '80px',             rules: {                 label: [                     { required: true, message: '请输入名称', trigger: 'blur' }                 ]             },             locationData: [                 {                     id: 1,                     name: '顶'                 },                 {                     id: 2,                     name: '子'                 }             ],             tableData: []         };     },     methods: {         // 监听关闭窗口         closeView() {             this.$refs['form'].resetFields(); // 关闭窗口,清空填写的内容         },         // 打开编辑         handleClick(item, index) {             item.value.length != 1                 ? (this.sonStatus = true)                 : (this.sonStatus = false);             this.editView = true;             const obj = Object.assign({}, item);             this.childkey = item.childkey;             this.casArr = item.childArr;             this.idx = index;             this.data = obj;         },         // 递归表格数据(编辑)         findSd(arr, i, casArr) {             if (i == casArr.length - 1) {                 let index = casArr[i].substr(casArr[i].length - 1, 1);                 return arr.splice(index, 1, this.data);             } else {                 return this.findSd(                     arr[casArr[i].substr(casArr[i].length - 1, 1)].children,                     (i += 1),                     casArr                 );             }         },         // 确定编辑         okEdit(data) {             this.$refs[data].validate(valid => {                 if (valid) {                     if (this.data.value.length == 1) {                         this.tableData.splice(this.idx, 1, this.data);                         this.$message({                             type: 'success',                             message: '编辑成功'                         });                         this.editView = false;                     } else {                         this.findSd(this.tableData, 0, this.childkey);                         this.$message({                             type: 'success',                             message: '编辑成功'                         });                         this.editView = false;                     }                 } else {                     return false;                 }             });         },         // 递归表格数据(删除)         findDel(arr, i, item) {             let casArr = item.childkey;             if (i == casArr.length - 1) {                 let index = casArr[i].substr(casArr[i].length - 1, 1);                 return arr.splice(index, 1);             } else {                 return this.findDel(                     arr[casArr[i].substr(casArr[i].length - 1, 1)].children,                     (i += 1),                     item                 );             }         },         // 删除         deleteClick(item) {             this.$confirm(`此操作将删除该项, 是否继续?`, '提示', {                 confirmButtonText: '确定',                 cancelButtonText: '取消',                 type: 'warning'             })                 .then(() => {                     if (item.children.length != 0) {                         this.$message.warning({                             message: '请删除子节点',                             duration: 1000                         });                     } else {                         this.casArr = item.childArr;                         ++this.isResouceShow; // 给级联控件绑定一个key,防止报错。                         if (item.value.length == 1) { // 删除的是顶节点                             console.log(1);                             this.tableData.splice(item.value, 1);                             this.$message({                                 type: 'success',                                 message: '删除成功'                             });                         } else { // 删除的是子节点                             console.log(2);                             this.findDel(this.tableData, 0, item);                             this.$message({                                 type: 'success',                                 message: '删除成功'                             });                         }                     }                 })                 .catch(err => {                     console.log(err);                     this.$message({                         type: 'info',                         message: '已取消删除'                     });                 });         },         // 是否显示次位置         locationChange(v) {             if (v == 2) {                 this.sonStatus = true;             } else {                 this.sonStatus = false;             }         },         // 获取次位置         getCasVal(v) {             this.casArr = v;             this.form.childArr = v;         },         // 递归表格数据(添加)         find(arr, i) {             if (i == this.casArr.length - 1) {                 return arr[this.casArr[i].substr(this.casArr[i].length - 1, 1)]                     .children;             } else {                 return this.find(                     arr[this.casArr[i].substr(this.casArr[i].length - 1, 1)]                         .children,                     (i += 1)                 );             }         },         // 确定添加         okAdd(form) {             this.$refs[form].validate(valid => {                 if (valid) {                     if (this.sonStatus == false) {                         this.form.value = String(this.tableData.length);                         const obj = Object.assign({}, this.form);                         obj.children = [];                         obj.childArr = [];                         this.tableData.push(obj);                         this.$message({                             type: 'success',                             message: '添加成功'                         });                         this.addView = false;                     } else {                         let arr = this.find(this.tableData, 0);                         this.childArr = [...this.casArr, String(arr.length)];                         this.form.value =                             String(this.casArr[this.casArr.length - 1]) +                             String(arr.length);                         delete this.form.children;                         const obj = Object.assign({}, this.form);                         obj.children = [];                         obj.childkey = [...this.casArr, String(arr.length)];                         arr.push(obj);                         this.$message({                             type: 'success',                             message: '添加成功'                         });                         this.addView = false;                     }                 } else {                     return false;                 }             });         }     } }; </script>  <style lang="sCSS" scoped> ::v-deep .el-form-item__content {     width: 203px; } </style>

关于Vue中怎么实现一个无限级联树形表格就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: Vue中怎么实现一个无限级联树形表格

本文链接: https://lsjlt.com/news/74612.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Vue中怎么实现一个无限级联树形表格
    这篇文章给大家介绍Vue中怎么实现一个无限级联树形表格,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。资源JavaScript框架:vue.jsUI框架:Element UI源码这里需要...
    99+
    2024-04-02
  • Vue实现无限级树形选择器
    目录简单实现下样式递归渲染定义参数实现点击事件完整代码前言: 想要在 Vue 中实现一个这样的无限级树形选择器其实并不难,关键点在于利用 递归组件 和 ...
    99+
    2024-04-02
  • vue中Element-ui表格怎么实现树形结构表格
    这篇文章主要为大家展示了“vue中Element-ui表格怎么实现树形结构表格”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue中Element-ui表格怎么实现树形结构表格”这篇文章吧。本文...
    99+
    2023-06-15
  • Vue中怎么实现一个树形组件
    Vue中怎么实现一个树形组件,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。具体如下:使用SemanticUI和vue做一个me...
    99+
    2024-04-02
  • VUE无限层级树形数据结构显示怎么实现
    这篇文章主要讲解了“VUE无限层级树形数据结构显示怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“VUE无限层级树形数据结构显示怎么实现”吧!文章中用...
    99+
    2024-04-02
  • Vue.js中怎么利用ElementUI搭建一个无限级联层级表格组件
    本篇文章给大家分享的是有关Vue.js中怎么利用ElementUI搭建一个无限级联层级表格组件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。源...
    99+
    2024-04-02
  • Echarts中怎么实现一个树形图表
    Echarts中怎么实现一个树形图表,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。树图主要用来可视化树形数据结构,是一种特殊的层次类型。实现方法,将series->t...
    99+
    2023-06-20
  • SqlServer中怎么利用公用表表达式实现无限级树形构建
    SqlServer中怎么利用公用表表达式实现无限级树形构建,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。SQL Server 2005开始...
    99+
    2024-04-02
  • VUE递归树形怎么实现多级列表
    今天小编给大家分享一下VUE递归树形怎么实现多级列表的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。什么是递归简单来说就是在组...
    99+
    2023-07-02
  • php无限级树怎么实现
    要实现PHP无限级树,可以通过以下几个步骤来实现:1. 创建一个多维数组来存储树的节点。每个节点需要包括一个唯一的ID、父节点ID、...
    99+
    2023-09-29
    php
  • VUE 无限层级树形数据结构显示的实现
    目录组件递归调用使用render方法在做项目中,会遇到一些树形的数据结构,常用在左侧菜单导航,或者评论引用等地方,这种数据结构有个特点是不知道它会嵌套多少层,所以用template去...
    99+
    2024-04-02
  • 利用java怎么构造一个无限层级的树形菜单
    这期内容当中小编将会给大家带来有关利用java怎么构造一个无限层级的树形菜单,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。构造一个实体类,用来存储节点,所以我们构造的需要四个对象(id,pid,name,...
    99+
    2023-05-31
    java ava
  • Android 开发中怎么利用TreeView实现一个多级树形列表
    今天就跟大家聊聊有关Android 开发中怎么利用TreeView实现一个多级树形列表,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。具体的实现思路参考下面的项目结构和具体代码:Ele...
    99+
    2023-05-31
    android treeview 多级树形列表
  • Vue2中怎么实现一个无限级分类
    这篇文章给大家介绍Vue2中怎么实现一个无限级分类,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。<!DOCTYPE html> <html lan...
    99+
    2024-04-02
  • vue实现一个懒加载的树状表格实例
    目录一个懒加载的树状表格实例安装模板js代码 使用el-table懒加载树形表格时的注意点1、版本问题2、数据显示3、滚动条4、数据结构5、el-table的fixed导致...
    99+
    2024-04-02
  • vue中怎么实现一个无限轮播插件
    这篇文章给大家介绍vue中怎么实现一个无限轮播插件,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。思路:要实现无限轮播,需要在轮播图前后各加一张图片,加在前面的是轮播图的最后一张图片(重...
    99+
    2024-04-02
  • vue如何实现一个懒加载的树状表格
    这篇文章主要介绍“vue如何实现一个懒加载的树状表格”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue如何实现一个懒加载的树状表格”文章能帮助大家解决问题。一个懒加载的树状表格实例实现一个树状表格...
    99+
    2023-06-30
  • 怎么在Vue中使用Element实现一个树列表组件
    怎么在Vue中使用Element实现一个树列表组件?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、常规树列表控件的使用众所周知,一般界面很多情况涉及到树列表的处理,如类型...
    99+
    2023-06-15
  • 怎么在vue项目中实现一个竖向表格
    怎么在vue项目中实现一个竖向表格?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。为什么要使用VueVue是一款友好的、多用途且高性能的JavaScript框架,...
    99+
    2023-06-14
  • thinkphp中怎么实现一个无限分类
    今天就跟大家聊聊有关thinkphp中怎么实现一个无限分类,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。function getSonLi...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作