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>
目录
打赏
0
5
6
0
63
分享
相关文章
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
222 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
6月前
|
深入探索 Element UI:自定义滚动条与弹出层管理的技巧
在这篇博客中,我们将深入探讨 Element UI 中的自定义滚动条及弹出层管理技巧。文章详细介绍了 el-scrollbar 组件的使用和参数设置,以及 PopupManager 如何有效管理弹出层的 z-index。我们还将探讨如何实现灵活的全屏组件,利用 vue-popper 创建自定义弹出层,最后介绍 ClickOutside 指令的用法。这些高级技巧将帮助你提升 Element UI 应用程序的用户体验与交互灵活性。
650 1
深入探索 Element UI:自定义滚动条与弹出层管理的技巧
前端只是切图仔?来学学给开发人看的UI设计
该文章针对前端开发者介绍了UI设计的基本原则与实践技巧,覆盖了布局、色彩理论、字体选择等方面的知识,并提供了设计工具和资源推荐,帮助开发者提升产品的视觉与交互体验。
Vue开发中Element UI/Plus使用指南:常见问题(如Missing required prop: “value“)及中文全局组件配置解决方案
Vue开发中Element UI/Plus使用指南:常见问题(如Missing required prop: “value“)及中文全局组件配置解决方案
498 0
明白吗?Xamarin与Native的终极对决:究竟哪种开发方式更适合您的项目需求,让我们一探究竟!
【8月更文挑战第31天】随着移动应用开发的普及,开发者面临多种技术选择。本文对比了跨平台解决方案Xamarin与原生开发方式的优势与劣势。Xamarin使用C#进行跨平台开发,代码复用率高,可大幅降低开发成本;但因基于抽象层,可能影响性能。原生开发则充分利用平台特性,提供最佳用户体验,但需维护多套代码库,增加工作量。开发者应根据项目需求、团队技能和预算综合考量,选择最适合的开发方式。
174 0
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡
48 11
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡
基于Flink CDC 开发,支持Web-UI的实时KingBase 连接器,三大模式无缝切换,效率翻倍!
TIS 是一款基于Web-UI的开源大数据集成工具,通过与人大金仓Kingbase的深度整合,提供高效、灵活的实时数据集成方案。它支持增量数据监听和实时写入,兼容MySQL、PostgreSQL和Oracle模式,无需编写复杂脚本,操作简单直观,特别适合非专业开发人员使用。TIS率先实现了Kingbase CDC连接器的整合,成为业界首个开箱即用的Kingbase CDC数据同步解决方案,助力企业数字化转型。
227 5
基于Flink CDC 开发,支持Web-UI的实时KingBase 连接器,三大模式无缝切换,效率翻倍!
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
85 10
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
Vue Amazing UI 组件库(Vue3+TypeScript+Vite 等最新技术栈开发)
Vue Amazing UI 是一个基于 Vue 3、TypeScript、Vite 等最新技术栈开发构建的现代化组件库,包含丰富的 UI 组件和常用工具函数,并且持续不断维护更新中。另外,组件库全量使用 TypeScript,支持自动按需引入和 Tree Shaking 等,能够显著提升开发效率,降低开发成本。
163 5
Vue Amazing UI 组件库(Vue3+TypeScript+Vite 等最新技术栈开发)

热门文章

最新文章

下一篇
oss创建bucket
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等