Element UI 【实战】纯前端对表格数据进行增删改查(内含弹窗表单、数据校验、时间日期格式)

简介: Element UI 【实战】纯前端对表格数据进行增删改查(内含弹窗表单、数据校验、时间日期格式)

<template>
    <div style="padding: 20px">
        <el-dialog
                :title="dialogTitle"
                :visible.sync="dialogVisible"
                v-if="dialogVisible"
                width="60%"
        >
            <el-form ref="refForm" :disabled="action === 'scan'" :model="formData"
                     :label-width="(config.labelWidth || '100')+'px'"
                     :size="config.size||'mini'">
                <el-row :gutter="config.gutter">
                    <el-col :key="index" :span="item.span?item.span:12"
                            v-for="(item,index) in config.itemList.filter(item=>!item.hideInForm)">
                        <el-form-item
                                style="height: 36px"
                                :label="item.label+ (config.labelPostfix || ':')"
                                :prop="item.prop"
                                :rules="[
                                            {required: item.require, message: '请输入'+item.label},
                                            {pattern:item.pattern, message: item.formatMsg || '格式不符合规范' }
                                        ]"
                        >
                            <!--单行文本 input-->
                            <el-input
                                    v-if="item.type=='input'|| item.type===undefined"
                                    show-word-limit
                                    :disabled="item.disabled"
                                    :maxlength="item.maxlength"
                                    :placeholder="item.placeholder"
                                    :prefix-icon="item.preIcon"
                                    :style="'width:'+item.width||'100%'"
                                    clearable
                                    type="text"
                                    v-model="formData[item.prop]">
                            </el-input>
                            <!--单选 radio-->
                            <el-radio-group v-if="item.type=='radio'" v-model="formData[item.prop]">
                                <el-radio :key="index" :label="items.value" v-for="(items,index) in item.list||[]">
                                    {{items.label}}
                                </el-radio>
                            </el-radio-group>
                        </el-form-item>
                    </el-col>
                </el-row>
            </el-form>
            <span v-if="action !== 'scan'" slot="footer">
                    <el-button size="small" @click="dialogVisible = false">取 消</el-button>
                    <el-button size="small" type="primary" @click="confirm">确 定</el-button>
            </span>
        </el-dialog>
        <el-row style="margin: 16px 0px">
            <el-button size="mini" type="primary" @click="add">新增</el-button>
        </el-row>
        <el-table ref="refTable" :data="tableData" border>
            <el-table-column
                    v-for="(item,index) in config.itemList.filter(item=>!item.hideInTable)"
                    :align="item.align?item.align:'center'"
                    :label=item.label
                    :prop=item.prop
                    :min-width="item.minWidth?item.minWidth:'120'"
                    :formatter="item.formatter"
                    :key="index"
                    show-overflow-tooltip
            >
                <template slot-scope="scope">
                    <span v-if="item.list && item.list.length>0">{{getLabel(item.list,scope.row[item.prop])}}</span>
                    <span v-else>{{scope.row[item.prop]}}</span>
                </template>
            </el-table-column>
            <el-table-column
                    label="操作"
                    align="center"
                    width="160">
                <template slot-scope="scope">
                    <el-button @click="scan(scope.row)" type="text" size="small">查看</el-button>
                    <el-button @click="edit(scope.$index)" type="text" size="small">编辑</el-button>
                    <el-button @click="del(scope.$index,scope.row.id)" type="text" size="small">删除</el-button>
                </template>
            </el-table-column>
        </el-table>
    </div>
</template>
<script>
    export default {
        data() {
            return {
                index: null,
                action: '',
                dialogTitle: '',
                dialogVisible: false,
                config: {
                    itemList: [
                        {
                            label: '姓名',
                            prop: 'name',
                            type: 'input',
                            require: true
                        },
                        {
                            label: '性别',
                            prop: 'gender',
                            type: 'radio',
                            defaultValue: '1',
                            list: [
                                {
                                    label: '男',
                                    value: '1'
                                },
                                {
                                    label: '女',
                                    value: '2'
                                },
                            ]
                        },
                        {
                            label: '手机号码',
                            prop: 'phone',
                            type: 'input',
                            maxlength: 11,
                            pattern: this.GLOBAL.phoneRegExp,
                            hideInTable: true
                        },
                        {
                            label: '创建日期',
                            prop: 'date',
                            hideInForm: true
                        },
                    ]
                },
                formData: {},
                tableData: [],
            }
        },
        methods: {
            // 表单校验
            ifvalid() {
                let result = true
                this.$refs.refForm.validate(valid => {
                    if (!valid) {
                        result = false
                    }
                })
                return result
            },
            // 保存/修改确认
            confirm() {
                if (this.ifvalid()) {
                    if (this.action === 'add') {
                        this.$set(this.formData,'date',new Date().format("yyyy-MM-dd hh:mm:ss"))
                        this.tableData.push(this.formData)
                    }
                    if (this.action === 'edit') {
                        this.$set(this.tableData, this.index, this.formData)
                    }
                    this.dialogVisible = false
                }
            },
            add() {
                this.action = 'add'
                this.dialogTitle = '新增'
                this.formData = {}
                this.config.itemList.forEach(
                    item => {
                        if (item.defaultValue !== undefined) {
                            this.$set(this.formData, item.prop, item.defaultValue)
                        }
                    }
                )
                this.dialogVisible = true
            },
            edit(index) {
                this.index = index
                this.action = 'edit'
                this.dialogTitle = '修改'
                this.formData = JSON.parse(JSON.stringify(this.tableData[index]))
                this.dialogVisible = true
            },
            del(index, id) {
                this.$confirm('确定删除吗?', '温馨提示', {
                    confirmButtonText: '确定',
                    cancelButtonText: '取消',
                    type: 'warning'
                }).then(() => {
                    this.tableData.splice(index, 1);
                })
            },
            scan(row) {
                this.formData = row
                this.action = 'scan'
                this.dialogTitle = '详情'
                this.dialogVisible = true
            },
            // 表格中,显示表单中下拉数据的中文
            getLabel(list, value) {
                for (let item of list) {
                    if (item.value === value) {
                        return item.label
                        break
                    }
                }
            },
        }
    }
 
 
    // 为Date原型添加时间格式化方法
    Date.prototype.format = function(fmt) {
        var o = {
            "M+": this.getMonth() + 1, //月份
            "d+": this.getDate(), //日
            "h+": this.getHours(), //小时
            "m+": this.getMinutes(), //分
            "s+": this.getSeconds(), //秒
            "q+": Math.floor((this.getMonth() + 3) / 3), //季度
            S: this.getMilliseconds() //毫秒
        };
        if (/(y+)/.test(fmt)) {
            fmt = fmt.replace(
                RegExp.$1,
                (this.getFullYear() + "").substr(4 - RegExp.$1.length)
            );
        }
        for (var k in o) {
            if (new RegExp("(" + k + ")").test(fmt)) {
                fmt = fmt.replace(
                    RegExp.$1,
                    RegExp.$1.length == 1
                        ? o[k]
                        : ("00" + o[k]).substr(("" + o[k]).length)
                );
            }
        }
        return fmt;
    };
</script>
<style scoped>
</style>
目录
相关文章
|
2月前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
伪类:伪类这个叫法源自于它们跟类相似,但实际上并没有类会附加到标记中的标签上。 伪类分为两种(以及新增的伪类选择器): UI伪类:会在HTML元素处于某种状态时(例如:鼠标指针位于连接上),为该元素应用CSS样式。 :hover 结构化伪类:会在标记中存在某种结构上的关系时 例如: 某元素是一组元素中的第一个或最后一个,为该元素应用CSS样式。 :not和:target(CSS3新增的两个特殊的伪类选择器)
194 1
|
存储 前端开发 安全
前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
本文全面解析前端三种数据存储方式:Cookie、LocalStorage与SessionStorage。涵盖其定义、使用方法、生命周期、优缺点及典型应用场景,帮助开发者根据登录状态、用户偏好、会话控制等需求,选择合适的存储方案,提升Web应用的性能与安全性。(238字)
592 0
|
5月前
|
人工智能 JSON 前端开发
如何解决后端Agent和前端UI之间的交互问题?——解析AG-UI协议的神奇作用
三桥君指出AG-UI协议通过SSE技术实现智能体与前端UI的标准化交互,解决流式传输、实时进度显示、数据同步等开发痛点。其核心功能包括结构化事件流、多Agent任务交接和用户中断处理,具有"一次开发到处兼容"、"UI灵活可扩展"等优势。智能体专家三桥君认为协议将AI应用从聊天工具升级为实用软件,适用于代码生成、多步骤工作流等场景,显著提升开发效率和用户体验。
1321 0
|
9月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
10月前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
692 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
1087 14
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
368 0
|
SpringCloudAlibaba JavaScript 前端开发
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
分布式组件、nacos注册配置中心、openfegin远程调用、网关gateway、ES6脚本语言规范、vue、elementUI
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
502 6
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
676 1

热门文章

最新文章