基于Vue+ELement实现增删改查案例与表单验证(附源码)

news2024/12/26 10:46:06

🎉🎉欢迎来到我的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/1050099.html

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

相关文章

I2C外设

I2C的总结 I2C优点&#xff1a; 接口线少只有两根线&#xff0c;控制方式简单&#xff0c;通信速率较高&#xff1b; I2C 是飞利浦公司开发的两线式串行总线&#xff1b; I2C缺点&#xff1a; 硬件比较复杂&#xff0c;稳定性不太好&#xff0c;程序移植有点麻烦&#xff…

自定义v-resize指令并发布到NPM

自定义Vite库并发布到NPM 封装useResize 用于监听绑定元素的宽高变化&#xff0c;当元素宽高发生变化时触发回调并获取最新的宽高 新建项目 结合上面学到的 Hook 和 自定义指令封装一个监听元素宽高变化的指令&#xff0c;并发布到 npm 项目结构 useResize ├…

jQuery核心卷

目录 一.jQuery引用 二.jQuery语法 三.元素的属性 1.attr()方法 2.使用removeAttr()方法删除HTML元素的属性 3.使用text()方法设置HTML元素的文本内容 四.CSS元素控制 1.使用css()方法获取和设置css属性 2.与CSS类别有关的方法 3.获取和设置HTML元素的尺寸 4.获取和…

html 边缘融合加载

html 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>边缘融合加载</title><style>* {margin: 0;padding: 0;box-sizing: border-box;}body {height: 100vh;padding-bottom: 80px;b…

No141.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

【STM32】IAP升级00 预备知识

IAP&#xff08;In Application Programming&#xff09;简介 Flash够大的情况下&#xff0c;上电后的程序通过修改 MSP 的方式&#xff0c;可以在一块Flash上存在多个功能差异的程序。 IAP是为了在执行正常功能前&#xff0c;为了升级功能&#xff0c;提前运行的一段程序。这…

26608-2011 工业用回收一氯甲烷 学习笔记

声明 本文是学习GB-T 26608-2011 工业用回收一氯甲烷. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了工业用回收一氯甲烷的要求、试验方法、检验规则及标志、包装、运输、贮存及安全。 本标准适用于副产回收生产的工业用一氯甲…

一些杂题(9.23)

八月赛 A. Extra Large Knapsack 我的思路 是否可行只要看所有异或在一起是否为0就可以了 可行的方案只要有一个在第一个包里&#xff0c;剩下的都在第二个包里就可以了 注意&#xff1a;n1的时候不可行&#xff0c;要特判 代码 #include<bits/stdc.h> using name…

手写Hystrix基本原理

本文已收录于专栏 《中间件合集》 目录 概念说明什么是HystrixHystrix解决的问题 提供服务工作流程代码实现HystrixSDKMyHystrixCommand注解MyHystrixProperty注解MyAspect注解解释器 发送请求端引入Hystrix的依赖调用代码 接收请求端执行效果发送请求端 总结提升 概念说明 什…

树莓集团又一力作,打造天府蜂巢成都直播产业园样板工程

树莓集团再次推出惊艳之作&#xff0c;以打造成都天府蜂巢直播产业园为目标。该基地将充分展现成都直播产业园的巨大潜力与无限魅力&#xff0c;成为一个真正的产业园样板工程。 强强联手 打造未来 成都天府蜂巢直播产业园位于成都科学城兴隆湖高新技术服务产业园内&#xff0…

毕业设计选题之Java+springboot线上蔬菜销售与配送系统(源码+调试+开题+lw)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

基于Java的药品管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

国庆节难忘回家路:趣事、风景、反思

文章目录 前言趣事游记旅途风光在人气爆棚的小七孔古桥大七孔在喯珠泻玉的拉雅瀑布奇异罕见的水上森林在云雾缭绕的鸳鸯湖在天然地宫——天钟洞飞瀑流泉 反思人们在死亡之前自己会有预感吗&#xff1f;求索生死大问 中秋国庆的规划后记 前言 中秋国庆&#xff0c;双节汇在一起…

8、绩效看板与日清计划

6、片花关联长视频 7、脏话检测 内容仓的办公区挂着几台电视&#xff0c;显示每个人目前完成的工作量&#xff0c;这就是绩效看板&#xff08;如下图&#xff09;&#xff0c;每位来参观的领导&#xff0c;都觉得这个绩效看板的想法很有意思。绩效看板是制造业常用的管理方法&…

【数据结构初阶】六、线性表中的队列(链式结构实现队列)

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 【数据结构初阶】五、线性表中的栈&#xff08;顺序表实现栈&#xff09;_高高的胖子的博客-CSDN博客 1 . 队列&#xff08;Queue&#xff09; 队列的概念和结构&#xff1a; 队列…

基于Java的食堂管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统功能具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域…

【设计模式】备忘录模式

文章目录 1.备忘录模式定义2.备忘录模式的角色3.备忘录模式实现3.1.场景说明3.2.结构类图3.3.代码实现 4.备忘录模式优缺点5.备忘录模式适用场景6.备忘录模式总结 主页传送门&#xff1a;&#x1f481; 传送 1.备忘录模式定义 备忘录&#xff08;Memento Pattern&#xff09;模…

图像处理: 马赛克艺术

马赛克 第一章 马赛克的历史渊源 1.1 马赛克 艺术中的一种表面装饰&#xff0c;由紧密排列的、通常颜色各异的小块材料&#xff08;如石头、矿物、玻璃、瓷砖或贝壳&#xff09;组成。与镶嵌不同的是&#xff0c;镶嵌是将要应用的部件放置在已挖空以容纳设计的表面中&#xff0…

ubuntu20安装nvidia驱动

1. 查看显卡型号 lspci | grep -i nvidia 我的输出&#xff1a; 01:00.0 VGA compatible controller: NVIDIA Corporation GP104 [GeForce GTX 1080] (rev a1) 01:00.1 Audio device: NVIDIA Corporation GP104 High Definition Audio Controller (rev a1) 07:00.0 VGA comp…

国庆周《Linux学习第三课》

国庆周《Linux学习第三课》 国庆周《Linux学习第二课》_IHOPEDREAM的博客-CSDN博客 总结 用户的管理 增加一个用户 删除一个用户 修改一个用户 查看一个用户 用户组的管理 增加一个组 删除一个组 修改一个组 查看一个组 将用户成员增加到该组中去 移除组的成员 1 用户