Vue实现表格数据的增删改查

news2024/9/25 15:26:27

整体效果图:

一、创建表格数据

效果图:

el-table组件:表格组件

    <el-table
      :data="dataList"
      border
      v-loading="dataListLoading"
      @selection-change="selectionChangeHandle"
      style="width: 100%;">
      <!-- el-table-column表示表格列  
       type对应列的类型 selection表示设置了多选框 
       header-alige表头对其方式center
       align设置该列单元格内容的对齐方式center
       width设置列的宽度
      -->
      <el-table-column
        type="selection"
        header-align="center"
        align="center"
        width="50">
      </el-table-column>
      <!-- prop对应后端实体对象内容的字段名
       label显示在表格上的标题
      -->
      <el-table-column
        prop="id"
        header-align="center"
        align="center"
        width="80"
        label="ID">
      </el-table-column>
      <el-table-column
        prop="paramKey"
        header-align="center"
        align="center"
        label="参数名">
      </el-table-column>
      <el-table-column
        prop="paramValue"
        header-align="center"
        align="center"
        label="参数值">
      </el-table-column>
      <el-table-column
        prop="remark"
        header-align="center"
        align="center"
        label="备注">
      </el-table-column>
      <!-- fixed="right"表格列固定在右侧 width="150"列宽 -->
      <el-table-column
        fixed="right"                                     
        header-align="center"
        align="center"
        width="150"
        label="操作">
      </el-table-column>
    </el-table>

二、查询功能

效果图:

el-from组件:提供表单验证功能

el-from-item组件:用来展示表单项标签,和el-from组件搭配使用

el-button组件:不同颜色的操作按钮

   
  // el-from表单组件:提供表单验证功能
  //:是v-bind的缩写
  //inline 行内表单模式 垂直方向上空间受限且表单简单,可以一行内放置表单
  // model:绑定的数据对象
  // @keyup.enter.native="search()"监听组件 触发按键修饰符
   
<el-form :inline="true" :model="dataForm" @keyup.enter.native="search()">
      <el-form-item>
  //el-from-item表单项 el-input为输入框 placeholder显示占位文本 可以在输入框内容未输入时显示           提示信息
 //clearable清空功能 显示一个清空按钮
//v-model双向绑定 根据paramKey
  
        <el-input v-model="dataForm.paramKey" placeholder="参数名" clearable></el-input>
      </el-form-item>
      <el-form-item>
        <el-button @click="search()">查询</el-button>
      </el-form-item>
    </el-form>

1.查询search()方法:

      //查询
      search() {
        this.pageIndex = 1
        //获取数据列表
        this.getDataList()
      }

2.分页插件el-pagination:

<el-pagination
      @size-change="sizeChangeHandle"
      @current-change="currentChangeHandle"
      :current-page="pageIndex"
      :page-sizes="[10, 20, 50, 100]"
      :page-size="pageSize"
      :total="totalPage"
      layout="total, sizes, prev, pager, next, jumper">
</el-pagination>

效果图:

3.获取每页条数sizeChangeHandle ()方法:

sizeChangeHandle (val) {
        this.pageSize = val
        this.pageIndex = 1
        this.getDataList()
      }

4.获取当前页码currentChangeHandle ()方法:

 currentChangeHandle (val) {
        this.pageIndex = val
        this.getDataList()
      }

5.获取数据列表getDataList()方法:

进入后端的接口,发送请求以及数据响应

     // 获取数据列表
      getDataList () { 
        //设置加载状态
        this.dataListLoading = true
        //http请求 通过axios发送get请求来获取数据列表,并在请求成功时处理响应
        this.$http({
          //this.$http.adornUrl()和this.$http.adornParams()是axios拦截器中拦截的函数,可以对url和params进行处理
          url: this.$http.adornUrl('/sys/config/list'),
          method: 'get',
          //get请求 请求头
          params: this.$http.adornParams({
            'page': this.pageIndex,
            'limit': this.pageSize,
            'paramKey': this.dataForm.paramKey
          })
          //请求的响应 data是响应体
        }).then(({data}) => {
          //code属性为0 通常表示请求成功 打印整个响应体
          if (data && data.code === 0) {
            console.log(data);
          } else {
            console.log(data);
          }
        })
      }

三、删除功能

1.在操作表格列组件里再添加一个作用域插槽,通过id删除某一行的数据

效果图:

      <template slot-scope="scope">
          <el-button type="text" size="small" @click="deleteHandle(scope.row.id)">删除</el-button>
        </template>
      

2.在表单项里添加批量删除按钮

效果图:

<el-form-item>
        <el-button type="danger" @click="deleteHandle()" :disabled="dataListSelections.length <= 0">批量删除</el-button>
</el-form-item>

3.选取多选框selectionChangeHandle ()方法:

 selectionChangeHandle (val) {
        this.dataListSelections = val
      }

4.删除deleteHandle()方法:

进入后端接口,发送请求以及数据响应

   // 删除
      deleteHandle (id) {
        var ids = id ? [id] : this.dataListSelections.map(item => {
          return item.id
        })

       //$confirm方法显示一个确认对话框 对话框的内容通过模板字符串构建
        //join()方法将数组转换成字符串
        //根据用户的选择发送删除请求到服务器,并处理响应结果
        this.$confirm(`确定对[id=${ids.join(',')}]进行[${id ? '删除' : '批量删除'}]操作?`, '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          this.$http({
            url: this.$http.adornUrl('/sys/config/delete'),
            method: 'post',
            data: this.$http.adornData(ids, false)
          }).then(({data}) => {
            if (data && data.code === 0) {
              this.$message({
                message: '操作成功',
                type: 'success',
                duration: 1500,
                onClose: () => {
                  this.getDataList()
                }
              })
            } else {
              this.$message.error(data.msg)
            }
          })
        }).catch(() => {})
      }

四、新增和修改功能

 1.在操作表格列组件里再添加一个作用域插槽,通过id修改某一行的数据

效果图:

<template slot-scope="scope">
          <el-button type="text" size="small" @click="addOrUpdateHandle(scope.row.id)">修改</el-button>
</template>

 2.在表单项里添加新增按钮

效果图:

<el-form-item>
        <el-button v-if="isAuth('sys:config:save')" type="primary" @click="addOrUpdateHandle()">新增</el-button>
 </el-form-item>

3.自定义组件add-or-update,点击新增和修改按钮,出现对话框弹窗


 //自定义的vue组件add-or-update 
 //ref用于给元素或子组件注册引用信息,引用信息将会注册在父组件的$refs对象上
 //@refreshDataList="getDataList" 从一个父页面点击新增实现跳转到子页面 子页面完成数据提交之后 跳转回父页面并且完成父页面的刷新方法   再去执行查询操作
 //小驼峰命名法 ref="addOrUpdate"子组件的引用
 //addOrUpdateVisible是否显示弹窗 true显示
 <add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList"></add-or-update>

4.在config-add-or-update.vue中设置对话框

el-dialog组件:对话框组件

<el-dialog
    :title="!dataForm.id ? '新增' : '修改'"
    :close-on-click-modal="false"
    :visible.sync="visible">
    <el-form :model="dataForm" :rules="dataRule" ref="dataForm" @keyup.enter.native="dataFormSubmit()" label-width="80px">

 //el-form-item 用于创建表单项 label标签文字 prop 表单域model中的字段
 //el-from-item的prop属性必须与el-input中需要校验的表单属性一致
      <el-form-item label="参数名" prop="paramKey">
        <el-input v-model="dataForm.paramKey" placeholder="参数名"></el-input>
      </el-form-item>
      <el-form-item label="参数值" prop="paramValue">
        <el-input v-model="dataForm.paramValue" placeholder="参数值"></el-input>
      </el-form-item>
      <el-form-item label="备注" prop="remark">
        <el-input v-model="dataForm.remark" placeholder="备注"></el-input>
      </el-form-item>
    </el-form>
  //span标签相当于容器  slot="footer"作为diglog的底部插槽 则被放置在dialog的底部区域
    <span slot="footer" class="dialog-footer">
  //el-button 按钮 visible = false控制对话框的显示与隐藏
      <el-button @click="visible = false">取消</el-button>
      <el-button type="primary" @click="dataFormSubmit()">确定</el-button>
    </span>
  </el-dialog>

效果图:

5.在script标签中,导入组件AddOrUpdate

import AddOrUpdate from './config-add-or-update'
//用于注册可复用的vue组件AddOrUpdate
 components: {
      AddOrUpdate
    }

6.新增和修改 addOrUpdateHandle ()方法:

  addOrUpdateHandle (id) {
        this.addOrUpdateVisible = true
 //$nextTick()是vue的方法 在下一次DOM更新循环结束后执行其回调函数
 //$nextTick()方法首先更新显示状态 在DOM更新完成后正确初始化弹窗的数据
        this.$nextTick(() => {
  //$refs允许访问DOM元素或子组件 
  //ref被用来给元素或子组件注册引用信息,引用信息将会注册在父组件的$refs对象上
  //在模板中为某个元素或组件设置ref属性时,可以在this.$refs中访问到它
  //使用this.$refs.组件名.组件方法(参数) 组件名称是在设定的时候通过ref="addOrUpdate"设定组件的名称 变成refs的直接引用
          //init()方法 根据传入的id初始化弹窗的内容
          this.$refs.addOrUpdate.init(id)
        })
      }

7.在config-add-or-update.vue中定义init()方法:

重置对话框数据

      init (id) {
        this.dataForm.id = id || 0
        this.visible = true
        this.$nextTick(() => {
         //重置表单
         //通过$refs访问名为dataFrom,调用resetFields方法,重置表单到初始值 清除表单中的所有输入值
          this.$refs['dataForm'].resetFields()
          if (this.dataForm.id) {
            this.$http({
           //使用$http发送get请求,通过adornUrl方法构建URL,并传递id作为路径参数
              url: this.$http.adornUrl(`/sys/config/info/${this.dataForm.id}`),
              method: 'get',
              params: this.$http.adornParams()
            }).then(({data}) => {
              if (data && data.code === 0) {
                this.dataForm.paramKey = data.config.paramKey
                this.dataForm.paramValue = data.config.paramValue
                this.dataForm.remark = data.config.remark
              }
            })
          }
        })
      }

8.在config-add-or-update.vue中定义dataRule验证规则:

    //required: true:该字段是否必填 true必填
    //message:当字段验证不通过,显示错误的提示信息
    //trigger: 'blur':表示触发验证的方式 blur(失去焦点时触发) change(值改变时触发)
    //失去焦点触发:用户点击其他地方或按下Tab键
dataRule: {
          paramKey: [
            { required: true, message: '参数名不能为空', trigger: 'blur' }
          ],
          paramValue: [
            { required: true, message: '参数值不能为空', trigger: 'blur' }
          ]
        }

9.在config-add-or-update.vue中定义表单提交dataFormSubmit ()方法:

   dataFormSubmit () {
         //使用validate方法验证表单
        this.$refs['dataForm'].validate((valid) => {
          if (valid) {
            this.$http({
         //使用$http发送POST请求 根据dataFrom.id是否存在 选择是保存还是更新操作
              url: this.$http.adornUrl(`/sys/config/${!this.dataForm.id ? 'save' : 'update'}`),
              method: 'post',
              data: this.$http.adornData({
                'id': this.dataForm.id || undefined,
                'paramKey': this.dataForm.paramKey,
                'paramValue': this.dataForm.paramValue,
                'remark': this.dataForm.remark
              })
            }).then(({data}) => {
              if (data && data.code === 0) {
                this.$message({
                  message: '操作成功',
                  type: 'success',
                  duration: 1500,
                  onClose: () => {
                    this.visible = false
                    //$emit用于在子组件中触发事件 并在父组件中监听事件
                    //子组件需要在对话框中执行表单的提交按钮之后,通知父组件刷新表格中的数据
                    this.$emit('refreshDataList')
                  }
                })
              } else {
                this.$message.error(data.msg)
              }
            })
          }
        })
      }

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

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

相关文章

KISS(Keep It Sample,Stupid)[完整代码]

根据KISS原文它的伪随机数产生器的Period about 2^123&#xff0c;周期很长&#xff0c;并且来自于多个产生器的共同作用之下而得&#xff0c; 原文的这这句话很有意思&#xff0c;&#xff08;车轱辘压我脸上了&#xff09;一个人不好的时候&#xff0c;试一试两个人&#xff…

线段树的原理

1.如果知道两个子范围上的最值&#xff0c;通过比较就可以知道整个范围上的最值 2.如果知道两个子范围上分别出现的次数最多的数&#xff0c;但无法知道整个范围上出现最多的数 范围修改logn的前提&#xff1a;如果维护的是区域和&#xff0c;要把区域上的每个数字加上a&#…

【蓝桥杯集训100题】scratch绘制扇子 蓝桥杯scratch比赛专项预测编程题 集训模拟练习题第28题

scratch绘制扇子 蓝桥杯集训100题第28题模拟练习解析 此题曾经作为第十届省赛的真题考过 一、题目要求 以坐标&#xff08;0,0&#xff09;点为中心绘制一把扇子&#xff1b;扇面和扇把都是三分之一圆&#xff0c;扇面的半径 为 100 左右&#xff0c;扇把的半径为 20 左右。…

HTML实现2048小游戏

游戏概述 实现一个基本的2048游戏涉及综合运用HTML、CSS和JavaScript这三种关键技术。 HTML用于构建游戏的结构框架&#xff0c;包括游戏容器、网格布局以及可能的用户交互元素&#xff08;如按钮或得分显示&#xff09;。 CSS则负责美化游戏界面&#xff0c;通过样式表定义网格…

培训班和科班出生有什么区别

IT业的萌新来啦 每到毕业季 总有大量萌新走进职场 IT圈子的程序员 有的是科班出生 比如 计算机科学与技术、软件工程、大数据技术 有的是相关专业出生的 比如 信息安全、网络工程、物联网工程等等 除此之外 还有各种其他专业转行过来的 文理不限、专业不限 科班出生…

mydump 文件拆分 mysqldumpsplitter

mydump 文件拆分 如何将mysqldump的输出拆分为较小的文件&#xff1f; 要将mysqldump的输出拆分为较小的文件&#xff0c;可以使用–max-allowed-packet和–single-transaction选项。 使用–max-allowed-packet选项设置每个查询允许的最大数据包大小。这将确保mysqldump在执行…

精通 Stable Diffusion 调优秘籍

一、Stable Diffusion 调优概览 Stable Diffusion 作为一款强大的 AI 绘画工具&#xff0c;其调优具有至关重要的意义。通过合理的调优&#xff0c;可以显著提升图像生成的质量、速度和准确性&#xff0c;满足用户更加多样化和精细化的需求。 调优主要涵盖了多个方面。首先是模…

鸿蒙(API 12 Beta3版)【使用Image完成图片解码】图片开发指导依赖JS对象

图片解码指将所支持格式的存档图片解码成统一的[PixelMap]&#xff0c;以便在应用或系统中进行图片显示或[图片处理]。当前支持的存档图片格式包括JPEG、PNG、GIF、WebP、BMP、SVG、ICO、DNG。 开发步骤 添加依赖 在进行应用开发之前&#xff0c;开发者需要打开native工程的…

YOLOv5改进 | 融合改进 | C3 融合Efficient Multi-Scale Conv提升检测效果

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录&#xff1a; 《YOLOv5入门 改…

博立的个人代表作品集锦

1. 比赛同创 国一_2023年全国大学生电子设计竞赛 【信号分离装置】 国二_2023年全国大学生集成电路创新创业大赛半决赛作品&#xff08;robei赛道&#xff09; 【基于robei EDA的可重构无线控制小车设计】 省一_2022年重庆市大学生电子设计竞赛 【混沌信号发生装置】 国…

Oracle RAC 集群启动顺序

大家好&#xff0c;这里是 Lucifer三思而后行&#xff0c;专注于提升数据库运维效率。 目录 前言Oracle 11GR2 RAC 集群启动顺序官方文档11GR212CR218C19C21C23ai 往期精彩文章推荐 前言 前几天使用脚本在 RockyLinux 9.4 安装 Oracle 11GR2 RAC&#xff0c;安装完之后发现集群…

Adobe Premiere Pro (PR2024)win/mac 视频编辑软件安装下载(附安装包)

一、软件概述 1.1 Premiere Pro 简介 Adobe Premiere Pro (简称PR) 是一款专业的视频编辑软件&#xff0c;广泛应用于电影、电视、广告、网络视频等多种视频制作领域。它提供了强大的编辑工具、丰富的特效和灵活的工作流程&#xff0c;帮助用户高效地完成从素材整理到最终输出…

[Linux#41][线程] 线程的特性 | 分离线程 | 并发的问题

1.线程的特性 进程和线程的关系如下图: 关于进程线程的问题 • 如何看待之前学习的单进程&#xff1f;具有一个线程执行流的进程 线程 ID 及进程地址空间布局 pthread_ create 函数会产生一个线程 ID&#xff0c;存放在第一个参数指向的地址中。 该线程 ID 和前面说的线程 ID …

持久化SSE对象

SpringBoot整合SSE&#xff0c;实现后端主动推送DEMO 前些日子写了整合SSE得demo。但是SSE对象是存储在ConcurrentHashMap<String, SseEmitter>中。在正式环境明显就不行了&#xff0c;服务重启一下的话都没有了。 那么要持久化&#xff0c;第一选择放redis 1、写了一个…

When Do We Not Need Larger Vision Models?

总结 传统观点挑战&#xff1a;传统上&#xff0c;扩大视觉模型的大小一直被认为是提升视觉表示能力和下游任务性能的关键途径。然而&#xff0c;本文重新审视了这一观点&#xff0c;提出了通过在不同图像尺度上运行较小的预训练视觉模型&#xff08;如ViT-B或ViT-L&#xff0…

Linux入门——11 线程

线程的概念&#xff0c;线程的控制&#xff0c;线程的同步和互斥&#xff0c;队列结构&#xff0c;线程池&#xff0c;锁 1.预备知识 1.1可重入函数 1.1.1链表的头插 main函数调用insert函数向一个链表head中插入节点node1,插入操作分为两步,刚做完第一步的时候,因为硬件中断…

续——网络通信编程

一、网络通信 1、编程 &#xff08;1&#xff09;基于UDP c/s通信模型 -------server——服务端——被动角色------- socket 全双工的&#xff08;可读可写&#xff09;。同上篇。 bind int bind(int sockfd , struct sockaddr *my_addr&#xff08;所绑定的地址信息&…

Linux的进程详解(进程创建函数fork和vfork的区别,资源回收函数wait,进程的状态(孤儿进程,僵尸进程),加载进程函数popen)

目录 什么是进程 Linux下操作进程的相关命令 进程的状态&#xff08;生老病死&#xff09; 创建进程系统api介绍&#xff1a; fork() 父进程和子进程的区别 vfork() 进程的状态补充&#xff1a; 孤儿进程 僵尸进程 回收进程资源api介绍&#xff1a; wait() waitpid…

编译运行 llama.cpp (vulkan, Intel GPU SYCL)

llama.cpp 是一个运行 AI (神经网络) 语言大模型的推理程序, 支持多种 后端 (backend), 也就是不同的具体的运行方式, 比如 CPU 运行, GPU 运行等. 但是编译运行 llama.cpp 并不是那么容易的, 特别是对于 SYCL 后端 (用于 Intel GPU), 坑那是一大堆. 只有特定版本的 llama.cpp…

【代码随想录训练营第42期 Day38打卡 - 动态规划Part6 - LeetCode 322. 零钱兑换 279.完全平方数 139.单词拆分

目录 一、做题心得 二、题目与题解 题目一&#xff1a;322. 零钱兑换 题目链接 题解&#xff1a;动态规划--完全背包 题目二&#xff1a; 279.完全平方数 题目链接 题解&#xff1a;动态规划--完全背包 题目三&#xff1a;139.单词拆分 题目链接 题解&#xff1a;动…