基于Vue+ELement实现增删改查案例与表单验证

news2024/11/18 21:52:21

🎉🎉欢迎来到我的CSDN主页!🎉🎉

🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚

🌟推荐给大家我的专栏《ELement》。🎯🎯

👉点击这里,就可以查看我的主页啦!👇👇

Java方文山的个人主页

🎁如果感觉还不错的话请给我点赞吧!🎁🎁

💖期待你的加入,一起学习,一起进步!💖💖

请添加图片描述

目录

一、前言

二、增删改查案例

2.1.查询功能 

2.2.新增功能

2.3.修改功能

2.4.删除功能

三、表单验证 


一、前言

首先,Vue是一种流行的JavaScript框架,它提供了一种简洁易用的方式来构建用户界面。通过Vue的数据绑定和组件化思想,我们可以轻松地管理和更新用户界面的状态。

其次,Element UI是一套基于Vue.js的组件库,提供了丰富的UI组件,包括表单、按钮、弹窗等。我们可以利用Element UI的组件来快速搭建出整洁美观的用户界面。

在这个前端应用中,我们将使用Vue和Element UI来实现增加、删除、修改、查询等功能。通过Vue的双向数据绑定,我们可以实时更新用户输入的数据,并将其展示在界面上。同时,利用Element UI提供的表单验证功能,我们可以对用户的输入进行合法性验证,保证数据的正确性。

总之,通过结合Vue和Element UI,我们可以轻松地构建一个功能完善、易于使用的前端应用,实现增删改查和表单验证的需求。

二、增删改查案例

基于上一篇文章我们所编写的数据表格实现增删改查,看过上篇文章的都知道,结合Vue+ELement实现功能还是比较简单的,今天主要是围绕上篇内容进行增删改查操作,如果文中有不动的地方可以看看上一篇文章或是往期内容介绍,先看看我们目前的效果。

2.1.查询功能 

查询功能就不过多介绍了,在上一篇已经实现了,这里直接上源码

<template>
  <div>
    <!--搜索栏-->
    <el-form :inline="true" class="form-search" style="padding: 30px;">
      <el-form-item label="书籍名称">
        <el-input v-model="bookname" placeholder="请输入书籍名称"></el-input>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" icon="el-icon-search" @click="query()">查询</el-button>
      </el-form-item>
    </el-form>

    <!-- 数据表格-->
    <el-table :data="tableData" style="width: 100%" :row-class-name="tableRowClassName">
      <el-table-column prop="id" label="编号" width="180">
      </el-table-column>
      <el-table-column prop="bookname" label="书籍名称" width="180">
      </el-table-column>
      <el-table-column prop="price" label="书籍价格" width="180">
      </el-table-column>
      <el-table-column prop="booktype" label="书籍类别" >
      </el-table-column>
    </el-table>

    <!-- 分页栏-->
    <div class="block">
      <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="page"
        :page-sizes="[10, 20, 30, 40]" :page-size="rows" layout="total, sizes, prev, pager, next, jumper"
        :total="total">
      </el-pagination>
    </div>

  </div>
</template>




<script>
  export default {
    data() {
      return {
        bookname: "",
        tableData: [],
        rows: 10,
        page: 1,
        total: 0,

      }
    },
    methods: {
      //封装查询方法
      list(params) {
        let url = this.axios.urls.BOOK_LIST;
        this.axios.get(url, {
          params: params
        }).then(r => {
          console.log(r)
          this.tableData = r.data.rows
          this.total = r.data.total
        }).catch(e => {

        })
      },
      //模糊查询方法
      query() {
        let params = {
          bookname: this.bookname
        }
        this.list(params)
      },
      //当页发生变化会触发
      handleSizeChange(r) {
        let params = {
          bookname: this.bookname,
          rows: this.rows,
          rows: r
        }
        this.list(params)
      },
      //当前页数发生变化会触发
      handleCurrentChange(p) {
        let params = {
          bookname: this.bookname,
          rows: this.rows,
          page: p
        }
        this.list(params)
      }

    },
    created() {
      //加载页面先去后端拿数据
      let params = {
        bookname: this.bookname
      }
      this.list()

    }

  }
</script>



<style>
  .el-table .warning-row {
    background: oldlace;
  }

  .el-table .success-row {
    background: #f0f9eb;
  }
</style>

2.2.新增功能

1)在action.js配置我们的后端接口

'BOOK_ADD': '/book/addBook', //书籍新增

2)新增一个新增按钮

  <el-button type="primary" icon="el-icon-search" @click="add()">新增</el-button>

3)根据资料查找相应代码进行修改

 这个是我找的素材仅供大家参考

<el-dialog :title="title" :visible.sync="dialogFormVisible" @close="dialogClose">
    <!-- form表单 -->
    <el-form :label-position="labelPosition" :model="bookForm" :rules="rules" ref="bookForm">
    ...
    </el-form>
    <div slot="footer" class="dialog-footer">
		<el-button type="danger" @click="dialogFormVisible = false" icon="el-icon-close">取 消</el-button>
		<el-button type="primary" @click="doSubmit" icon="el-icon-edit-outline">保 存</el-button>
	</div>
</el-dialog>

<script>
	export default {
        name:"BookList",
        data:function(){
            return {
                dialogFormVisible:false,   //是否显现对话框
            }
        },
        methods:{
            //关闭对话框时触发的事件
            dialogClose(){
                
            }
        }
    }
</script>

 我们将上面的代码进行修改得到了下面的结果

 <el-dialog :title="title" :visible.sync="dialogFormVisible" @close="clear">
      <el-form :model="book">
        <el-form-item label="书籍ID" :label-width="formLabelWidth" v-show="hidden">
          <el-input v-model="book.id" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="书籍名称" :label-width="formLabelWidth">
          <el-input v-model="book.bookname" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="书籍价格" :label-width="formLabelWidth">
          <el-input v-model="book.price" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="书籍类型" :label-width="formLabelWidth">
          <el-select v-model="book.booktype" placeholder="请选择书籍类型">
            <el-option v-for="t in types" :label="t.name" :value="t.name" :key="t.id"></el-option>
          </el-select>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="dialogFormVisible = false">取 消</el-button>
        <el-button type="primary" @click="dosub">确 定</el-button>
      </div>
    </el-dialog>

data中定义变量

    data() {
      return {
        bookname: "",
        tableData: [],
        rows: 10,
        page: 1,
        total: 0,
        title: "新增窗口",//对话框标题
        dialogFormVisible: false,//对话框是否显示
        book: {
          id: null,
          bookname: null,
          price: '',
          booktype: null
        },//书籍字段
        formLabelWidth:'100px',
        types:[],//书籍类别
        hidden:false//id输入框是否隐藏
      }
    }

methods中定义方法

//提交新增/修改表单
      dosub(){
        let url = this.axios.urls.BOOK_ADD;
        if(this.title=="编辑窗口"){
          url=this.axios.urls.BOOK_EDIT;
        }
        let params = {
         id: this.book.id,
         bookname: this.book.bookname,
         price: this.book.price,
         booktype: this.book.booktype
        }
        this.axios.post(url,params).then(r => {
           if (r.data.success) {
             this.$message({
               message: r.data.msg,
               type: 'success'
             });
             this.clear()
             this.query()
           } else {
             this.$message.error(r.data.msg);
           }

        }).catch(e => {

        })
      },
      //关闭对话框
      clear(){
        this.title= "新增窗口",
        this.dialogFormVisible=false,
        this.book={
          id: null,
          bookname: null,
          price: '',
          booktype: null
        }
      },
      //打开对话框
      open(){
        this.dialogFormVisible=true;
      }

created中获取书本类型(这里我就做个假数据模拟一下)

    created() {
      this.list()
      this.types=[{
        id:1,
        name:"爽文"
      },{
        id:2,
        name:"爱情"
      },{
        id:3,
        name:"谍战"
      },{
        id:4,
        name:"古装"
      }]
    }

 效果演示:

2.3.修改功能

新增完成了修改功能还远吗?还是一样的套路先去定义后端接口再去ELement找模板修改编写需求

1)在action.js配置我们的后端接口

'BOOK_EDIT': '/book/editBook', //书籍修改

2)根据资料查找相应代码进行修改

 这个是我找的素材仅供大家参考

<el-table-column label="操作">
      <template slot-scope="scope">
        <el-button
          size="mini"
          @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
        <el-button
          size="mini"
          type="danger"
          @click="handleDelete(scope.$index, scope.row)">删除</el-button>
      </template>
    </el-table-column>

scope 是插槽的作用域对象,它包含了当前循环项的相关信息。通常情况下,scope 对象会包含以下属性:

  • scope.$index:当前循环项的索引值。
  • scope.row:当前循环项的数据对象。

通过使用 scope.$index,我们可以获取当前循环项在数组中的索引位置,以便进行相应的操作。而 scope.row 则代表当前循环项的具体数据对象,可以用于显示或修改数据。

 我们将上面的代码进行修改得到了下面的结果

<el-table-column label="操作">
        <template slot-scope="scope">
          <el-button size="mini" @click="open(scope.$index, scope.row)">编辑</el-button>
          <el-button size="mini" type="danger" @click="handleDelete(scope.$index, scope.row)">删除</el-button>
        </template>
      </el-table-column>

methods中迭代定义open方法

open(idx,row) {
        this.dialogFormVisible = true;
        //只有编辑row才不为空
        if(row!=null){
          this.title="编辑窗口";
          this.book.id=row.id;
          this.book.bookname=row.bookname;
          this.book.price=row.price;
          this.book.booktype=row.booktype;
        }
      }

 效果演示:

2.4.删除功能

轻车熟路,我们删除肯定需要有一个确认的操作所以需要找一个确认消息框

1)在action.js配置我们的后端接口

'BOOK_DEL': '/book/delBook', //书籍删除

2)根据资料查找相应代码进行修改

 这个是我找的素材仅供大家参考

 open() {
        this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          this.$message({
            type: 'success',
            message: '删除成功!'
          });
        }).catch(() => {
          this.$message({
            type: 'info',
            message: '已取消删除'
          });          
        });
      }

 我们只需要将原本我们表格内的删除方法换成以上的代码加以修改即可

methods中定义方法

  //删除数据
      del(idx, row) {
        this.$confirm('此操作将删除书籍为《'+row.bookname+'》的数据, 是否继续?', '提示', {
            confirmButtonText: '确定',
            cancelButtonText: '取消',
            type: 'warning'
          }).then(() => {
            let url = this.axios.urls.BOOK_DEL;
          this.axios.post(url, {id:row.id}).then(r => {
            if (r.data.success) {
              this.$message({
                message: r.data.msg,
                type: 'success'
              });
              this.clear()
              this.query()
            } else {
              this.$message.error(r.data.msg);
            }

          }).catch(e => {

          })
        }).catch(() => {
          this.$message({
            type: 'info',
            message: '已取消删除'
          });
        });
      }

效果演示:

看到这里我们的增删改查都已完成了是不是非常的丝滑呢?看完先别走,还有后续,我们增删改查看似没错,但是我们如果提交的是空的数据会有什么印象呢?我们的后端会报空指针异常,所以针对这个问题,我们还要进一步优化——>表单验证 

三、表单验证 

首先给大家把错误演示出来

其实ELement也早就想到了这个问题,我们直接“套娃”即可。

查看完官方文档后,我们得知只需要做以下几件事:

①指定表单规则:rules="rules"

②指定验证表单对象ref="book"(必须和:model="book"一致)

③为字段设置prop进行校验

④定义表单验证规则

⑤使用规则

添加表单验证后的代码

    <el-dialog :title="title" :visible.sync="dialogFormVisible" @close="clear">
      <el-form :model="book" :rules="rules" ref="book">
        <el-form-item label="书籍ID" :label-width="formLabelWidth" v-show="hidden">
          <el-input v-model="book.id" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="书籍名称" :label-width="formLabelWidth" prop="bookname">
          <el-input v-model="book.bookname" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="书籍价格" :label-width="formLabelWidth" prop="price">
          <el-input v-model="book.price" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="书籍类型" :label-width="formLabelWidth" prop="booktype">
          <el-select v-model="book.booktype" placeholder="请选择书籍类型">
            <el-option v-for="t in types" :label="t.name" :value="t.name" :key="t.id"></el-option>
          </el-select>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="dialogFormVisible = false">取 消</el-button>
        <el-button type="primary" @click="dosub">确 定</el-button>
      </div>
    </el-dialog>

表单规则: 

        rules:{
          bookname: [{
              required: true,
              message: '请输入书籍名称',
              trigger: 'blur'
            },
            {
              min: 1,
              max: 10,
              message: '长度在 1 到 10 个字符',
              trigger: 'blur'
            }
          ],
          price: [{
            required: true,
            message: '请输入价格',
            trigger: 'blur'
          }],
          booktype: [{
            required: true,
            message: '请输入书籍类别',
            trigger: 'blur'
          }]
        }

在提交表单之前使用规则 

dosub() {
              this.$refs['book'].validate((valid) => {
                  if (valid) {
                    let url = this.axios.urls.BOOK_ADD;
                    if (this.title == "编辑窗口") {
                      url = this.axios.urls.BOOK_EDIT;
                    }
                    let params = {
                      id: this.book.id,
                      bookname: this.book.bookname,
                      price: this.book.price,
                      booktype: this.book.booktype
                    }
                    this.axios.post(url, params).then(r => {
                      if (r.data.success) {
                        this.$message({
                          message: r.data.msg,
                          type: 'success'
                        });
                        this.clear()
                        this.query()
                      } else {
                        this.$message.error(r.data.msg);
                      }

                    }).catch(e => {

                    })
                  } else {
                    console.log('error submit!!');
                    return false;
                  }
                });
      }

效果演示 :

如果一个字段中有多个规则,不满其中一个都会拦截提交!!

请添加图片描述

到这里我的分享就结束了,欢迎到评论区探讨交流!!

💖如果觉得有用的话还请点个赞吧 💖

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1046848.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

航天与航空的区别,今天终于弄清楚啦!

航天与航空的区别 一&#xff1a;什么是航天&#xff1f; 航天的由来 航天(Spaceflight)&#xff0c;又称空间飞行、太空飞行、宇宙航行或航天飞行&#xff0c;是指进入、探索、开发和利用太空(即地球大气层以外的宇宙空间&#xff0c;又称外层空间)以及地球以外天体各种活动…

Java高级应用——异常处理

文章目录 异常处理概念Java异常体系Error 和 Exception编译时异常和运行时异常Java异常处理的方式 异常处理 概念 异常处理是在程序执行过程中遇到错误或异常情况时的一种机制&#xff0c;它允许程序在错误发生时进行适当的处理&#xff0c;而不会导致程序崩溃或产生不可预测…

pdf怎么调整大小kb?pdf文件过大这样压缩

在日常的工作和生活中&#xff0c;我们常常会遇到需要调整PDF文件大小的问题。有时候&#xff0c;我们需要将大型的PDF文件上传到某些平台&#xff0c;但平台的限制让我们不得不压缩文件的大小。那么&#xff0c;如何有效地调整PDF文件的大小呢&#xff1f; 一、使用嗨格式压缩…

第三方开源测试框架 pytest

本篇文章是聊聊 Python 的单元测试框架&#xff0c;在Python 世界中最火的第三方单元测试框架&#xff1a;pytest。 它有如下主要特性&#xff1a; assert 断言失败时输出详细信息&#xff08;再也不用去记忆 self.assert* 名称了&#xff09;自动发现 测试模块和函数模块化夹…

ai智能写作软件,免费自动写作软件

无论你是一名热衷于撰写博客的博主&#xff0c;还是一位为企业撰写广告宣传的创意写手&#xff0c;都会面临一个共同的问题&#xff1a;时间和创意的压力。随着信息爆炸式增长&#xff0c;写作任务不仅变得更加频繁&#xff0c;还需要不断提供新的、有吸引力的内容&#xff0c;…

软考-计算机网络与系统安全

七层模型 网络技术标准与协议 TCP三次握手 DHCP协议&#xff1a;固定分配、动态分配和自动分配 DNS协议&#xff1a;递归查询&#xff0c;迭代查询 计算机网络分类 按分布范围&#xff1a; 局域网城域网广域网因特网 按拓扑结构分 总线型星型环型树型分布式 网络规划与设…

window.print()打印及出现的问题

<template><transition name"el-zoom-in-center"><div class"JNPF-preview-main"><div class"JNPF-common-page-header"><el-page-header back"goBack" :content"打印通知书" /><div clas…

护眼灯显色度越高越好吗?选儿童护眼台灯应该这样选

显色指数当然是越高越好了。LED灯作为一种新型的照明产品&#xff0c;具有节能、环保、寿命长等优点&#xff0c;受到越来越多的人们的青睐。但是&#xff0c;市面上的LED灯品牌琳琅满目&#xff0c;让人眼花缭乱。那么&#xff0c;LED灯什么牌子好呢&#xff1f;下面我们来推荐…

我们应该用什么酒袋来安全地运输葡萄酒?

无论是在朋友家、在公园还是在海滩&#xff0c;葡萄酒都会让每次聚会变得更美好。这时候运输葡萄酒就变得很有挑战性&#xff0c;你不仅有打破它们的危险&#xff0c;而且还可能因为暴露在高温或阳光下而伤害它们。来自来自云仓酒庄品牌雷盛红酒分享为了确保葡萄酒的安全到达&a…

leetCode 343.整数拆分 动态规划

给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: n 10 输出: 36 解释: 10 3 …

Python实现IP的自动切换

一、安装所需库 在开始之前&#xff0c;我们首先需要确保已经安装了以下库&#xff1a; - requests&#xff1a;用于发送HTTP请求和获取网页内容。 - winreg&#xff1a;用于在Windows下访问和编辑注册表信息。 可以使用pip命令进行安装&#xff0c;例如&#xff1a; pip i…

PayPal面经

文章目录 初战AI Infra团队广泛收集信息&#xff0c;增加对面试相关团队的了解Paypal的AI infra Engineer 极客时间演讲视频&#xff1a;AI在金融应用HR面试首面 zhang chao首先让我介绍自己和项目基础知识出题 lettcode 1and0s 二面 luwen没有让我重复介绍自己那好&#xff0c…

linux操作系统--常用命令篇(网络安全、运维和测试人员必备技能)

前言&#xff1a;linux 命令是对 Linux 系统进行管理的命令。对于 Linux 系统来说&#xff0c;无论是中央处理器、内存、磁盘驱动器、键盘、鼠标&#xff0c;还是用户等都是文件&#xff0c; Linux 系统管理的命令是它正常运行的核心&#xff0c;与之前的 DOS 命令类似。linux …

设计模式 - 策略模式

目录 一. 前言 二. 实现 一. 前言 策略模式 (Strategy Pattern) 是指对一系列的算法定义&#xff0c;并将每一个算法封装起来&#xff0c;而且使它们还可以相互替换。此模式让算法的变化独立于使用算法的客户。 与状态模式的比较 状态模式的类图和策略模式类似&#xff0c;并…

sentinel 以及 sentinel-golang 让你的服务坚如磐石

首先要说 Sentinel&#xff0c;这是阿里巴巴内部使用多年并演化出来的流控软件&#xff0c;经受住了多年的双十一考验&#xff0c;最早是服务于Java语言的&#xff0c;在2020年推出了 Sentinel-golang 版本。 官方文档&#xff1a;https://sentinelguard.io/zh-cn/docs/introd…

GreatSQL一个关于主从复制的限制描述与规避

一、背景 分享一个在项目运维中遇到的一个主从复制限制的一个坑&#xff0c;项目的架构为主集群灾备集群&#xff0c;每个集群为一主两从模式。主集群到灾备集群的同步为主从复制的方式&#xff0c;根据业务需求灾备集群需要忽略系统库跟某些配置表&#xff0c;所以才会触发此…

24v转12v转9v转5v转4.2v降压电源芯片AH8788

AH8788A是一款集成同步开关的降压转换器&#xff0c;提供***解决方案适用于车载充电器、快充适配器和智能排插。AH8788A内置功率MOS&#xff0c;输入电压范围为9.6V到32V&#xff0c;输出电压范围为3V到12V&#xff0c;***-大可提供18W的输出功率。它能够根据识别到的快充协议自…

手把手教你用 Milvus 和 Towhee 搭建一个 AI 聊天机器人!

作为向量数据库的佼佼者&#xff0c;Milvus 适用于各种需要借助高效和可扩展向量搜索功能的 AI 应用。 举个例子&#xff0c;如果想要搭建一个负责聊天机器人数据管理流程&#xff0c;Milvus 必然是首选向量数据库。那么如何让这个应用程序开发变得易于管理及更好理解&#xff…

速看!美国站新增1个禁售品类,加拿大站3大品类开启售前审核

亚马逊新合规 美国&加拿大◀ 一品类禁售&#xff0c;三品类售前审核 近日&#xff0c;亚马逊发布了合规政策的新要求&#xff0c;其中美国站“呼吸贴”被归类为禁售的产品&#xff0c;加拿大站“儿童床垫”、“夜灯”、“儿童折叠式和非折叠式椅子和凳子”品类均有合规要…

家政服务小程序,家政系统开发

家政服务小程序&#xff0c;家政系统开发&#xff0c;打造一线家政系统&#xff0c;提效增收 家政服务小程序 互联网&#xff0b;家政系统&#xff0c;打造互联网&#xff0b;家政公司app开发&#xff0c;支持个性化定制&#xff0c;直接搭建&#xff0c;上手即用&#xff0e;实…