基于Vue的动态通用table表格及dialog对话框处理技巧总结

2023-11-08

前言:采用vue并结合element-ui制作网页端管理系统中的表格是不难的,对应的form,table,dialog基本都有现成的样例,再结合vue基于数据的方式,很轻松就可以实现一个表格展示并进行动态添加,那么问题来了,如果一个管理系统中有很多表格,难道我们要一个一个去制作?就没有一个一劳永逸的解决办法么?只要制作一个table模板,给我要展示的数据,告诉要展示那些列,就能自动生成表格?答案是有的,下面我就如何用vue处理这种情况的方式技巧进行说明。源代码已经上传到gitee中,连接地址在文末给出。


1.效果图展示(都是动态生成的):

2.项目目录说明

由于本案例仅仅是一个demo,所以组件很少,其中components中common.js主要是对数据进行clone操作(因为js数据都是引用类型,不clone会一处动处处动),models中的数据主要负责table中展示那些列,和dialog中展示那些数据。models中数据原来也在APP根组件中,后来整合到models中。table组件就是展示表格的组件,myDialog组件就是展示对话框的组件。filter文件就是过滤器,负责对时间戳和男女性别等数据进行转换使用。下面进入正文。

3.针对table表格

其实动态表格的核心就是展示数据的传输控制列的展示,先看一下不是动态的情况下表格代码是什么样子的。

普通情况:

<el-table  stripe :data="mydata" 
                @select-all="selection=$event"
                @select='selection=$event'>
                    <el-table-column label='编号' type='selection' align='center' width='50'></el-table-column>
                     <el-table-column label='姓名' prop='name' align='center' width='120'></el-table-column>
                    <el-table-column label='年龄' prop='age' align='center'></el-table-column>
                    <el-table-column label='日期' align='center'>
                        <template slot-scope="scope">
                            <slot name="myDate" :myDateData="scope.row"></slot>
                        </template>
                    </el-table-column>
                    <el-table-column label='随便' align='center'>
                        <template slot-scope="scope">
                            {{scope.row.name}}+{{scope.row.age}}
                        </template>
                    </el-table-column>
 <el-table-column label='操作' align='center'>
                        <template slot-scope="scope">
                            <el-button-group>
                                <el-button type="primary" size="mini" @click="$emit('myEmit',scope.row)">编辑</el-button>
                                <el-button type="danger" size="mini" @click="$emit('myDelete',[scope.row])">删除</el-button>
                            </el-button-group> 
                        </template>
                    </el-table-column>
                </el-table>

调整为动态后:

 <el-table  stripe :data="mydata" 
                @select-all="selection=$event"
                @select='selection=$event'>
                    <el-table-column label='编号' type='selection' align='center' width='50'></el-table-column>
                    
                    <template v-for="item,index in myColsShow">
                        <!-- 非自定义内容且不是下拉框 -->
                        <el-table-column v-if="item.prop && item.type!=='select'" :label='item.label' :prop='item.prop' :align='item.align' :width='item.width'></el-table-column>
                        <!-- 非自定义内容但是是下拉框 -->
                        <el-table-column v-else-if="item.prop && item.type=='select'" :label='item.label' :prop='item.prop' :align='item.align' :width='item.width'>
                            <template slot-scope="scope">
                                <!-- 将性别男女进行转换 -->
                                {{scope.row.sex|transformSex}}
                            </template>
                        </el-table-column>
                        <!-- 自定义内容 -->
                        <el-table-column v-else :label='item.label'  :align='item.align' :width='item.width'>
                            <template slot-scope="scope">
                                <slot :name="item.slot" :myDateData="scope.row"></slot>
                            </template>
                        </el-table-column>
                    </template>
 <el-table-column label='操作' align='center'>
                        <template slot-scope="scope">
                            <el-button-group>
                                <el-button type="primary" size="mini" @click="$emit('myEmit',scope.row)">编辑</el-button>
                                <el-button type="danger" size="mini" @click="$emit('myDelete',[scope.row])">删除</el-button>
                            </el-button-group> 
                        </template>
                    </el-table-column>
                </el-table>

对应的列数据和表格内容数据:

//记录存放的元数据,即要展示的列,和对话框要展示的内容
let allDate=[
    {label:'姓名',prop:'name',align:'center',width:'120',type:'text',rule:[
        { required: true, message: '请输入姓名', trigger: 'blur'},
        { min: 2, max: 5, message: '名字长度在 2 到 5 个字符', trigger: 'blur',}
    ]},
    {label:'性别',prop:'sex',align:'center',type:'select'},
    {label:'密码',prop:'password',align:'center',type:'password',IsShow:false},
    {label:'文件',prop:'file',type:'file',IsShow:false},
    {label:'日期',slot:'myDate',align:'center',type:'text'},
]

export default allDate;

调整为动态代码中:data="mydata"是从父组件APP中传递进来的展示数据,myColsShow是对models中列数据(如上)是否展示进行的一个过滤(models中增加了IsShow属性)。代码如下

 //对数据展示的列进行一个过滤,有些敏感列不展示
      myColsShow(){
          //只展示isshow为true的,必须用强等于。因为没写这个isshow的属性的算是true,
          return this.myCols.filter(item=>item.IsShow!==false)
      }

在el-table中必须要给定data数据,同时在el-table-column中用prop属性绑定数据key值,就可以展示表格了。如果要自定义表格,就不用prop属性,通过prop是否存在判断是否为自定义列。然而在标签内设置插槽slot,其中是为了获取当前行的全部数据通过插槽作用域传递给父级,才是真正的插槽预留位,通过插槽作用域将数据传递到父级template中便于对日期等数据进行处理,最后再通过插槽将数据拿回来展示(具体的看源码)

核心思想通过v-for对要展示的列进行循环,通过v-if、v-else-if进行判断展示的是那种情况列(后期还可以动态补充)

插槽作用域看这篇文章:

https://www.jianshu.com/p/0c9516a3be80

4.针对dialog对话框

dialog对话框的情况也是类似于table表格,先绑定数据(和表格公用数据),之后通过循环确定要展示的列,根据v-if进行判断列的类型进行展示。代码如下:

<el-dialog width='30%' title="提示" :visible.sync="dialogVisible" 
        :before-close="handleClose" :destroy-on-close='true'>      
            <el-form ref="myForm" :model="myForm" label-width="60px">
                <!-- 动态组织表单内容 -->
                <el-form-item v-for="item,index in dialogItem" 
                :key='index' :label="item.label" :prop="item.prop" 
                :rules="item.rule">
                    <!-- 【1】如果是普通文本 -->
                    <el-input v-if="item.type=='text'" type='text' 
                    v-model="myForm[item.prop]"></el-input>
                    <!-- 【2】如果是密码 -->
                    <el-input v-else-if="item.type=='password'" type='password' 
                    v-model="myForm[item.prop]"></el-input>
                    <!-- 【3】如果是数字 -->
                    <el-input v-else-if="item.type=='number'" type='number' 
                    v-model="myForm[item.prop]"></el-input>
                    <!-- 【4】如果是上传文件 -->
                    <el-upload v-else-if="item.type=='file'" 
                     action="https://jsonplaceholder.typicode.com/posts/">
                        <el-button size="small" type="primary">点击上传</el-button>
                    </el-upload>   
                    <!-- 【5】如果是下拉框-->
                    <el-select v-else-if="item.type=='select'" v-model="myForm[item.prop]" placeholder="请选择">
                        <el-option  label="男" value='male'></el-option>
                        <el-option  label="女" value='female'></el-option>
                    </el-select>
                </el-form-item>
            </el-form>

            <template slot="footer" >
                <el-button @click="closeDialog()">取 消</el-button>
                <el-button type="primary" @click="myDate">确 定</el-button>
            </template>
        </el-dialog>

这里我只列举了五种情况,后续若有新的数据形式仍然可以动态添加。

效果如下:

5.动态页码

这里面在动态页码处理的时候出现了子组件更改父组件的情况,我用到了.sync的用法,代码如下:

<!-- 页码 -->
       <el-row type="flex" justify="space-between" :gutter="20">
           <el-col :span='6'></el-col>
           <el-col :span='12'>
               <!-- 显示页码条数 -->
               {{page}}
               <el-pagination :current-page.sync='curPage' :total='total' 
               :size='size'>
               </el-pagination>
           </el-col>
           <el-col :span='6'></el-col>
       </el-row>

针对.sync具体用法看如下连接:

官网:https://cn.vuejs.org/v2/guide/components-custom-events.html#sync-%E4%BF%AE%E9%A5%B0%E7%AC%A6

其他:https://www.jianshu.com/p/6b062af8cf01

6.总结:

本文对动态表格和对话框的思路进行简单说明,核心就是写了个框架,其他地方只要给数据,要展示的列就可生成对应表格,并且可以和对话框关联。因为这里面涉及较多的组件间通信,所以通过叙述很难描述的清楚。

为此我把全部项目demo放到了gitee中,想要研究的同学可以自行下载。

gitee连接:

https://gitee.com/fan-shuchang/The-dynamic-form

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于Vue的动态通用table表格及dialog对话框处理技巧总结 的相关文章

  • 前端实现导出excel表格(合并表头)

    需求 勾选行导出为excel表格 合并表头 一 安装插件 npm install save file saver xlsx 运行项目报如下警告的话 运行npm install xlsx 0 16 0 save 来降低版本号 最初我安装的版本
  • 解决vxe-table复选框翻页选中问题

    解决vxe table复选框翻页选中问题 根据vxe table官方文档 想要保留勾选中的数据 我们的代码中需要设置 row id 和 checkbox config中的 reserve 属性 vxe table官方文档 简单写下html部
  • 前端vue项目部署到tomcat,一刷新报错404解决方法

    原文链接 https my oschina net u 1471354 blog 4277008 VUE项目部署到Tomcat之后 刷新页面会出现404 此问题主要是使用了VUE router的History模式 一 解决方案 1 编辑se
  • Element Plus 配置自动按需引入后,手动引入组件,组件样式丢失

    起因 最近在尝试使用 Element Plus 写一些简单的页面 跟着官方文档走配置了自动按需引入 npm install D unplugin vue components unplugin auto import vite config
  • Vue (三) 生命周期--钩子函数

    生命周期 Vue官网生命周期的描述 钩子函数 1 beforeCreate 创建Vue实例化之前所调用的函数 div h1 message h1 div
  • Vue学习(五)登陆页面之重置和发起登陆请求及弹窗提示

    Vue学习 五 登陆页面之重置和发起登陆请求及弹窗提示 表单重置 根据预验证结果决定是否发出登陆请求 编写代码 启动api服务器 弹窗提示 表单重置 直接调用element ui给我们写好的函数就可以了 获取当前表单的实例对象 通过这个实例
  • Vue js引用警告 “export ‘default‘ (imported as ‘xxx‘) was not found

    问题原因 ES6 编译器识别问题 如果在public js这样写会有警告export default imported as xxx was not found export const myMixin 解决办法 修改组件中引用js的地方
  • 包管理工具那么多,怎么选?npm、yarn 和 pnpm 三者比较及使用详解!

    1 简介 在 Vue 项目中 我们需要使用许多第三方依赖库 如 Vue Router Vuex Axios Element UI 等等 这些依赖库通常以 NPM 包的形式提供 而且在使用时需要进行版本管理 因此 我们需要使用一个包管理工具来
  • ip正则表达式

    var Sip rule value callback gt if 2 5 0 5 0 4 d 0 1 d 1 2 2 5 0 5 0 4 d 0 1 d 1 2 3 test value false callback new Error
  • Vue中的import from

    Vue中的import from 大家都知道 import from 是用来引入一些文件的 在vue中 可能有 js文件 json文件 vue文件 在JS和JSON文件引入的时候 往往需要写入一些 例如数组 export const a 例
  • vue-lazyload基础实例(基于vue2.0和vue-router2.0)

    首先引入依赖 import Vue from vue import Router from vue router import VueLazyload from vue lazyload 配置vue lazyload Vue use Vue
  • Vue3中的pinia使用(收藏版)

    1 pinia介绍 个人网站 紫陌 笔记分享网 想寻找共同学习交流 共同成长的伙伴 请点击 前端学习交流群 pinia 是 Vue 的存储库 它允许您跨组件 页面共享状态 就是和vuex一样的实现数据共享 依据Pinia官方文档 Pinia
  • vue实现拍照人脸识别功能带人脸选中框

    前言 实现打开摄像头 并识别人脸 实现效果 实现步骤 一 安装 1 官网下载 tracking js 的代码包官网入口 2 npm下载 执行命令 cnpm install tracking save 二 demo案例代码
  • Vue项目的部署(服务器)

    Vue项目的部署 服务器 前几天帮朋友写了一个可以动态查看地点温度的前端项目 目前已经部署上线了 访问链接点这里 服务器是朋友的 倒时候打不开会很正常 说不定又使用服务器玩大数据项目去了 效果图 图一 图二 当然 温度也都是实时跟新的 而且
  • vue element select下拉框树形多选

    components 文件下新建 SelectTree文件 index vue SelectTree index vue
  • 前端将List列表转化为树型结构(reduce函数)

    主要用到了reduce 函数 for循环可以做到的事情reduce 都可以做到 甚至操作起来更加简单方便和高雅 reduce 为数组中的每一个元素依次执行回调函数 不包括数组中被删除或从未被赋值的元素 reduce语法 array redu
  • 滚动条样式

    一 在div中的滚动条样式 div webkit scrollbar width 5px 滚动条宽度 div webkit scrollbar thumb border radius 10px 滚动条圆角 webkit box shadow
  • vue_table导出excel

    vue直接导出对应table const exportClick gt const wb XLSX utils table to book document querySelector newTables 关联dom节点 get binar
  • vue_域名部署无法访问后端

    前言 目前部署的比较另类 因为服务器为 windows 目前还不是很会 nginx 所以现在就只能在服务器上安装 nodejs 然后直接使用 npm run dev 命令行的方式运行项目 遇到的坑 使用ip访问前端的时候 就可以访问 但是通
  • 【vue】$bus 跨组件调用方法

    1 新建bus js import Vue from vue 使用 Event Bus const bus new Vue export default bus 2 main js引用 import bus from libs bus Vu

随机推荐

  • 自我管理的重要模型

    文章目录 前言 一 精力管理 自我管理的新旧理念 二 人类精力金字塔 精力管理四个层次 体能 情绪 思维 精神 三 运动 人类为什么喜欢躺平 每天怎么简单高效的完成20分钟的运动量 四 钟摆运动 钟摆运动对工作最大的指导意义 刻意休息 在这
  • Java 到 Go 过渡:基于 Go 开发分布式配置中心的实践

    目录 一 简介 二 Java 实现 三 Go 实现 四 从 Java 过渡到 Go 五 总结 在今天的技术世界中 从一种编程语言转向另一种是很常见的 特别是对于在企业级应用中具有广泛应用的语言如 Java 转向轻量级 效率更高的 Go 语言
  • 【因果学习】贝叶斯网络结构学习方法

    随机对照试验是发现因果关系的黄金准则 然而现实世界中很多问题往往由于道德伦理的原因不允许我们设置干预进行试验 这就引发了在观测数据上学习因果关系的需求 贝叶斯网络是概率论与图论相结合的产物 它用图论的方式直观地表达各变量之间的因果关系 为多
  • 面向对象编程(OOP):理解类、封装性的关键概念

    文章目录 对象 Object 什么是对象 面向对象 OOP 面向过程的编程语言 面向对象的编程语言 类 class 使用类创建对象的流程 类的定义 代码演示 初始化方法和实例属性 类属性和类方法 继承和多态 魔术方法 小结 类的封装性 属性
  • JSR303使用说明文档

    1 引言 参数校验是我们程序开发中必不可少的过程 用户在前端页面上填写表单时 前端js程序会校验参数的合法性 当数据到了后端 为了防止恶意操作 保持程序的健壮性 后端同样需要对数据进行校验 后端参数校验最简单的做法是直接在业务方法里面进行判
  • 大数据单机学习环境搭建(1)Hadoop本地单节点安装

    专题 大数据单机学习环境搭建和使用 1 资源获取 免费下载 2 Hadoop 本地模式 安装及文件配置 2 1安装java 2 2Hadoop安装与配置 2 3设置ssh免密登录 2 4开启hadoop 2 6访问应用 大数据单机学习环境搭
  • mysql 中使用 update 同时更新多个字段

    update 表名 set 字段1 新值1 字段2 新值2 字段3 新值3 where 条件 mysql gt select from tb person id name phone age sex description create t
  • 多机docker部署fisco-bcos区块链

    0 首先每台机器安装docker sudo yum install docker 展示一下机器环境 一共5台机器 111 203 104 97 111 203 104 113 111 203 104 114 111 203 104 116
  • 随想012:断言

    C 标准库提供了名为 assert 的断言宏 C 语言提供了名为 Debug Assert 的断言方法 Java 语言提供名为 assert 的断言关键字 主流编程语言不约而同的在语言层面上提供了 断言 机制 David R Jamson
  • linux-0.12内核之内存管理(1)

    1 内存分页管理机制 内存分页管理是通过页目录表和内存页表所组成的二级表组成的 其中页目录表和页表的结构是一样的 表项结构也相同 页目录表中的每个表项 4B 来寻址一个页表 而每个页表项 4B 来指定一页物理内存页 因此 当指定了一个页目录
  • ansys时间步长怎么设置_ANSYS瞬态动力学分析中的时间步长的选择

    对于瞬态动力学分析问题 如何选取合适的时间步长 才能保证得到正确的计算结果呢 这是我们在瞬态动力学分析中需要关注的一个问题 积分时间步长的选取决定了瞬态动力学问题的求解精度 时间步长越小 则计算精度越高 太大的时间步长会导致高阶模态的响应出
  • centos7下rpm方式安装mysql

    一 CentOS下通过rpm方式安装MySQL CentOS版本 CentOS 7 MySQL版本 MySQL 5 6 22 在网上搜了一下 Linux下安装MYSQL有三种方式 1 通过yum命令在线下载安装 2 下载离线rpm安装包安装
  • Qt应用程序的语言切换

    Qt实现软件界面显示不同的语言 是通过加载字库文件实现的 因此有三个对应的问题需要解决 如何制作字库文件 创建Qt应用程序后 在 pro文件中添加一行代码 TRANSLATIONS qmain zh ts 2 使用QtCreator菜单中的
  • Python工程或Flask项目整体加密——so加密

    python代码加密的方法有很多种 可以先进行混淆再加密 我们一般会对Flask项目或python项目的核心代码进行加密 加密方式采用so 编写一个工程加密的工具类 过程如下 1 安装依赖库 pip3 default timeout 100
  • C语言——水仙花数

    今日笔者突然有了兴致 便写一个很简单的适合于C语言初学者的程序 水仙花数定义 一个三位数i它的百位十位个位分别为a b c 若是i a 3 b 3 c 3那么该数称为水仙花数 输出100 999以内的水仙花数 代码如下 include
  • 通信OFDM相关知识总结

    子载波长度 一个OFDM symbol的时域长度 一个OFDM symbol共有64个子载波 如果按照20M的发射带宽计算的话 那么64个子载波的时域长度为64 20 3 2us 再加上保护间隔 GI guard interval 的长度为
  • Finetune方式总结

    方式一 使用Pretrain模型做约束 具体包括 直接使用Pretrain模型作为约束 使用Pretrain模型的中间层作为约束 使用Pretrain模型对不同特征注意力强度作为约束 Explicit inductive bias for
  • Leetcode 环形链表 -- 快慢指针

    0 题目描述 leetcode原题链接 环形链表 最容易想到的是哈希表解法 遍历所有节点 每次遍历到一个节点时 判断该节点此前是否被访问过 但是空间复杂度为 O n O n O n 有以下更优的解法实现空间复杂度为
  • vue 在自定义指令的时候警告[Vue warn]: Property or method "v" is not defined on the instance but referenced...

    话不多说 看警告 好 渲染也都没问题 这警告看着很不舒服 我是用的pug模板引擎 先看一下pug 好 再看看解释后的HTML 注意那个v focus 因为在将一个空属性传给pug时在纯HTML中会解释成attribute attribute
  • 基于Vue的动态通用table表格及dialog对话框处理技巧总结

    前言 采用vue并结合element ui制作网页端管理系统中的表格是不难的 对应的form table dialog基本都有现成的样例 再结合vue基于数据的方式 很轻松就可以实现一个表格展示并进行动态添加 那么问题来了 如果一个管理系统