Vue3_ElementPlus_简单增删改查(2023)
Vue3,Element Plus简单增删改查

代码:https://github.com/xiaoming12318/Vue3_ElementPlus_CRUD.git
环境:
Visual Studio Code
Node.js 16.0或更高版本,https://nodejs.org/en
axios
快速上手:
如果已经有16.0及以上就不用再重复安装了
官网安装node安装过程有一项是Add to Path勾选自动配置环境变量

安装后测试

第一个Vue项目
使用管理员打开命令行,在目标文件夹(创建一个新的文件夹)下创建vue项目
npm init vue@latest
指定vue项目名,选择自定义或者回车为默认值vue-project

自定义为vue初始化

| 名称 | 功能 |
|---|---|
| Add TypeScript | 添加TS |
| Add JSX Support | 是否支持JSX |
| Add Vue Router for Single Page Application development | 为单页程序开发添加Vue路由 |
| Add Pinia for state management | 用于状态管理的Pinia |
| Add Vitest for Unit Testing | 添加Vitest用于单元测试 |
| Add Cypress for both Unit and End-to-End testing | 添加Vitest用于单元和端到端的测试 |
| Add ESLint for code quality | 添加ESLint检查代码质量 |
| Add Prettier for code formatting | 为代码格式化添加Prettier |
进入生成的文件
cd vue-project //对应自定义名称npm install npm run dev

文件项说明



完成初始化之后,开启第一个vue3+ElementPlus增删改查项目

1.main.js中引入所需的包
以管理员方式打开命令行,导入所需包
//UI界面设计npm install element-plus --save//发送请求所使用的APInpm i axios
// import './assets/main.css'//引入ElementPlus和样式文件
import ElementPlus from "element-plus"
import "element-plus/dist/index.css"
//创建vue
import { createApp } from 'vue'
import App from './App.vue'const app=createApp(App)
//使用ElementPlus
app.use(ElementPlus)
//启动APP
app.mount("#app")
1.1.列表展示
1.1.1.声明数组
在App.vue中声明一个响应式数组,用于封装list数据,并且回显
const list=ref([])
1.1.2.发送axios请求获取数据
-
通过mock生成随机数据

通过官网下载
在项目目录创建mock目录,编写一个用于自定义数据的脚本
import Mock from "mockjs" // 内存模拟数据 const arr = [] for (let i = 0; i < 10; i++) { //存入10条数据arr.push({id: Mock.mock("@id"),name: Mock.mock("@cname"),place: Mock.mock("@county(true)"),}) } //定义请求 export default [{url: "/list",method: "get",response: () => {return arr},},{url: "/del/:id",method: "delete",//响应体接收一个请求体传过来的数据response: (req) => {//调用数组的findIndex方法,检索特定需求的数据//findIndex:匹配返回元素的索引,未匹配返回-1//index并赋值给index//===严格相等运算符,值的类型不对应则返回false//这里通过原数组中的数据与接收请求体的数据做比较,//if>-1则匹配到对应的id,通过splice删除数组中的数据,splice与delete的区别是,delete删除元素,但是会保留元素原本的位置,比如arr数组有三个元素,当使用 delete arr[1]删除第二个元素时,再使用arr.length结果还是3//splice则把占位一并删除 arr.splice(1,1),删除第二个元素从第二个元素开始删除一条元素const index = arr.findIndex((item) => item.id === req.query.id)if (index > -1) {//arr.splice(index, 1)return { success: true }} else {//否则就是没有查询到对应数据return { success: false }}},},{url: "/edit/:id",method: "patch",response: ({ query, body }) => {const item = arr.find((item) => item.id === query.id)if (item) {item.name = body.nameitem.place = body.placereturn { success: true }} else {return { success: false }}},}, ]在vite.config.js中编写Mock服务
viteMockServe({//刚刚创建的mock目录mockPath: "./mock",localEnabled: true,}),在App.vue的script setup中编写请求代码
const getList=()=>{const res=await axios.get("/list")list.value=res.data }编写一个生命周期钩子函数onMounted(在组件挂载完成后执行)中调用getList函数 onMounted(()=>{getList() })Vue生命周期
可以看到mounted是在初始化渲染创建和插入DOM节点之后被启用的

1.1.3.回显数据
在列表中回显数据,通过以上代码已知list中已有所需数据,则添加到elementUI的表中即可回显数据
<el-table :data="list">
总结
列表显示中注意事项
使用由mock生成的随机数据作为数据源
-
安装mock npm i vite-plugin-mock
-
在vite.config.js中从vite-plugin-mock中引入viteMockServe
-
在plugins中并配置mock自定义mock配置的路径
export default defineConfig({plugins: [vue(),viteMockServe({mockPath: "./mock",localEnabled: true,}),],resolve: {alias: {'@': fileURLToPath(new URL('./src', import.meta.url))}} })
-
-
在项目目录创建mock目录,创建mock.js用于响应前端发送的请求,并且把结果判断的值返回
1.2.删除
1.2.1.绑定单击事件
在删除的button中绑定一个单击事件
<el-button type="danger" link @click="deleteById()">删除</el-button>
1.2.2.编写删除脚本代码
测试按钮是否绑定成功
在script中编写方法
const deleteById=()=>{console.log("删除测试")
}
通过单击获取行数据,使用vue3特性中table组件中的default插槽,template后面写入 #default=row
<template #default=row><el-button type="danger" link @click="deleteById(row)">删除</el-button>
</template>
在绑定按钮的方法中编写获取数据,控制台打印
script中接收数据,获取id
const deleteById=(data)=>{const id=data.row.idconsole.log(data)
}

1.2.3.发送请求到mock自定义的虚拟数据
写法和上面list唯一的差别是方法名和请求体中携带参数const res=await axios.delete(`/del/${id}`)
此时单击则可以实现删除
1.2.4.完成删除实时更新列表
//deleteById的末尾调用list更新列表,表示先删除再更新
getList()
1.3.编辑
采用组件化的编写方式,编写一个组件实现编辑功能,涉及子父组件通信
1.3.1.绑定编辑单击事件
在父组件:App.vue中的编辑按钮编写一个click事件,并把数据放入方法中
<el-button type="primary" link @click="onEdit(row)"
1.3.2.引入子组件
在父组件App.vue中引入Edit.vue
import Edit from './components/edit.vue'
具体位置视自身情况定。
1.3.3.在template中使用子组件,并在其中声明一个ref用于子父通信
在template中引入Edit作为子组件
<template><div class="app"><el-table :data="list"><el-table-column prop="id" label="ID" width="180"></el-table-column><el-table-column prop="name" label="name"></el-table-column><el-table-column prop="place" label="place"></el-table-column><el-table-column prop="operation" label="operation"><template #default=row><el-button type="primary" link @click="onEdit(row)">编辑</el-button><el-button type="danger" link @click="deleteById(row)">删除</el-button></template></el-table-column></el-table></div>//这个部分<Edit ref="editRef" />
</template>
其中为Edit嵌入一个ref即可让父子间实现简单通信
当然也需要在script中定义editRef
//传入子组件的ref
constconst editRef=ref(null)
//点击编辑通过子父组件通信的弹窗
const onEdit=(list)=>{editRef.value.openDialog(list.row)
}
1.3.4.在子组件中编写template代码和script
在子组件中编写以下代码,具体可以去"Element+"自定义想要的格式
<template><el-dialog v-model="dialogVisible"title="编辑"width="400px"><el-form :model="form" label-width="50px"><el-form-item label="姓名"><el-input v-model="list.name" autocomplete="off"/></el-form-item><el-form-item label="地区"><el-input v-model="list.place"/></el-form-item></el-form><template #footer><span class="dialog-footer"><el-button @click="dialogVisible = false">取消</el-button><el-button type="primary" >确认</el-button></span></template></el-dialog></template><style scoped>
.el-input {width: 290px;
}
</style>
在script中编写参数
1.编写一个响应式方法接收父组件在Edit中传入的数据
const list=ref({id:'',name:'',place:''
})
//以及一个控制弹窗的开关
const dialogVisible=ref(false)
2.编写一个方法接收数据
const openDialog=(row)=>{list.name=row.name,list.place=row.placelist.id=row.id//父组件在调用方法的同时会打开dialog窗口dialogVisible.value=true
}暴露方法,使父组件可收到
defineExpose({openDialog
})const emit=defineEmits(['on-update'])
3.回显数据到到Edit.vue中的dialog
解释上面template代码,<el-input>中的v-model="list.name",就是从list中获取name
<el-form-item label="姓名"><el-input v-model="list.name" autocomplete="off"/>
</el-form-item>
<el-form-item label="地区"><el-input v-model="list.place"/>
</el-form-item>
1.3.5.修改完成时在子组件中发送axios请求

如图,当修改完毕,发送axios请求
在按钮中绑定单击事件
<el-button type="primary" @click="onUpdate">确认</el-button>
在script中测试是否绑定成功,并发送axios请求
const onUpdate=async()=>{console.log("绑定成功")await axios.put({method:'put',url:`/edit/${id}`,data:{name:list.name,place:list.place},}).then((res)=>{//发送请求//1.把更新列表请求发送给父组件,将会使用到defineEmits()//这个emit方法在上面已经定义emit('on-update')//2.关闭窗口dialogVisible.value=false})
}
关于defineEmit的具体操作参考官网文档
1.3.6.通过子组件发出的请求,父组件调用list方法更新列表
父组件的<Edit>中<Edit ref="editRef" @on-update="getList"/>
自此一个简单的基于Vue3+ElementPlus的简单删改查就完成了。
相关文章:
Vue3_ElementPlus_简单增删改查(2023)
Vue3,Element Plus简单增删改查 代码:https://github.com/xiaoming12318/Vue3_ElementPlus_CRUD.git 环境: Visual Studio Code Node.js 16.0或更高版本,https://nodejs.org/en axios 快速上手: 如果已经有16.0及…...
vue中重写并自定义console.log
0. 背景 在vue2项目中自定义console.log并输出文件名及行、列号 1. 实现 1.1 自定义console.log export default {// 输出等级: 0-no, 1-error, 2-warning, 3-info, 4-debug, 5-loglevel: 5,// 输出模式: 0-default, 1-normal, 2-randommode: 1,// 是否输出图标hasIcon: fal…...
基于OpenCV 和 Dlib 进行头部姿态估计
写在前面 工作中遇到,简单整理博文内容涉及基于 OpenCV 和 Dlib头部姿态评估的简单Demo理解不足小伙伴帮忙指正 庐山烟雨浙江潮,未到千般恨不消。到得还来别无事,庐山烟雨浙江潮。 ----《庐山烟雨浙江潮》苏轼 https://github.com/LIRUILONGS…...
24个Jvm面试题总结及答案
1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。 Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每…...
freemarker 生成前端文件
Freemarker是一种模板引擎,它允许我们在Java应用程序中分离视图和业务逻辑。在Freemarker中,List是一种非常有用的数据结构,它允许我们存储一组有序的元素。有时候,我们需要判断一个List是否为空,这在程序设计中有许多…...
Pycharm+pytest+allure打造高逼格的测试报告
目录 前言: 1、安装allure 2、安装allure-pytest 3、一个简单的用例test_simpe.py 4、在pycharm底部打开terminal 5、用allure美化报告 6、查看报告 总结: 前言: 今天分享的内容:在Pycharmpytest基础上使用allure打造高逼格…...
Mybatis-Plus中update更新操作用法
目录 一、前言二、update1、关于修改的4个条件构造器2、UpdateWrapper【用法示例】3、LambdaUpdateWrapper【用法示例】4、UpdateChainWrapper【 用法示例】5、LambdaUpdateChainWrapper【 用法示例】6、updateById 和 updateBatchById7、Mybatis-plus设置某个字段值为null的方…...
16道JVM面试题
1.jvm内存布局 1.程序计数器:当前线程正在执行的字节码的行号指示器,线程私有,唯一一个没有规定任何内存溢出错误的情况的区域。 2.Java虚拟机栈:线程私有,描述Java方法执行的内存模型,每个方法运行时都会…...
HttpRunner 接口自动化测试框架实战,打造高效测试流程
简介 2018年python开发者大会上,了解到HttpRuuner开源自动化测试框架,采用YAML/JSON格式管理用例,能录制和转换生成用例功能,充分做到用例与测试代码分离,相比excel维护测试场景数据更加简洁。在此,利用业…...
手写一个webpack插件(plugin)
熟悉 vue 和 react 的小伙伴们都知道,在执行过程中会有各种生命周期钩子,其实webpack也不例外,在使用webpack的时候,我们有时候需要在 webpack 构建流程中引入自定义的行为,这个时候就可以在 hooks 钩子中添加自己的方…...
jvm常见面试题
0x01. 内存模型以及分区,需要详细到每个区放什么。 栈区: 栈分为java虚拟机栈和本地方法栈 重点是Java虚拟机栈,它是线程私有的,生命周期与线程相同。 每个方法执行都会创建一个栈帧,用于存放局部变量表࿰…...
TF-A 项目的长期支持介绍
引流关键词:Armv8-A, Armv9-A, Cortex-A, Cortex-A12, Cortex-A15, Cortex-A17, Cortex-A32, Cortex-A34, Cortex-A35, Cortex-A5, Cortex-A510, Cortex-A53, Cortex-A55, Cortex-A57, Cortex-A65, Cortex-A65AE, Cortex-A7, Cortex-A710, Cortex-A715, Cortex-A72, Cortex-A7…...
企业电子招标采购系统源码java 版本 Spring Cloud + Spring Boot
项目说明 随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及…...
7.Mysql 事务底层
一、事务的基础知识 mysql中的事务 分为 显式事务 和 隐式事务。 1.1 显式事务 显式事务就是我们手动开启事务,并且提交事务比如: -- 开启事务 begin; -- 执行查询语句 select *from where id = 1 for update ; -- 提交事务 commit;1.2 隐式事务 在 MySQL 中,隐式事务是…...
15.DIY可视化-拖拽设计1天搞定主流小程序-分类联动文章列表实时刷新
分类联动文章列表实时刷新 本教程均在第一节中项目启动下操作 分类联动文章列表实时刷新前言需求一:功能实现:点击首页分类,对应分类内容显示到当前页一、清空原分类界面:二. 设置选项卡三:设定展示内容字段:1.跨页面复制:文章分类组件到分类
CRect rect; this->GetClientRect(rect); pDC->Ellipse(rect); // DDALineView.cpp : implementation of the CDDALineView class // #include “stdafx.h” #include “DDALine.h” #include “DDALineDoc.h” #include “DDALineView.h” #ifdef _DEBUG #define new…...
Spark大数据处理学习笔记(3.2.1)掌握RDD算子
该文章主要为完成实训任务,详细实现过程及结果见【http://t.csdn.cn/FArNP】 文章目录 一、准备工作1.1 准备文件1. 准备本地系统文件2. 把文件上传到 1.2 启动Spark Shell1. 启动HDFS服务2. 启动Spark服务3. 启动Spark Shell 二、掌握转换算子2.1 映射算子 - map()…...
lammps初级:石墨烯、金属材料、纳米流体、热传导、多成分体系、金属、半导体材料的辐照、自建分子力场、MOFS、H2/CO2混合气体等模拟
1 LAMMPS的基础入门——初识LAMMPS是什么?能干什么?怎么用? 1.1 LAMMPS在win10和ubuntu系统的安装及使用 1.2 in文件结构格式 1.3 in文件基本语法:结合实例,讲解in文件常用命令 1.4 data文件格式 1.5 LAMMPS常见错误解…...
【MarkerDown】CSDN Markdown之时序图sequenceDiagram详解
CSDN Markdown之时序图sequenceDiagram详解 序列图 sequenceDiagram参与者与组参与者 participant拟人符号 actor别名 as组 box 消息(连线)激活/失活 activate/deactivate备注 Note循环 loop备选 Alt并行 par临界区 critical中断 break背景高亮 rect注释 %%转义字符的实体代码序…...
保姆级教程:用ESP8266-01S和机智云固件,5分钟搞定智能硬件联网(附烧录软件下载)
5分钟极速上手:ESP8266-01S与机智云固件实战指南 当你想把一盏台灯变成手机可控的智能设备,或是让温湿度传感器数据实时上传云端时,ESP8266-01S这个小巧的Wi-Fi模块就是最佳选择。它价格低廉、功能强大,配合机智云的固件…...
从‘巡逻’到‘狂暴’:手把手用Unity行为树节点拼出一个有灵魂的BOSS战AI
从‘巡逻’到‘狂暴’:手把手用Unity行为树节点拼出一个有灵魂的BOSS战AI 想象一下,你正在玩一款动作游戏,面对一个看似普通的BOSS。起初它只是机械地挥舞武器,但随着战斗深入,它开始召唤小弟、释放范围技能࿰…...
App UI自动化项目模板
完整的App UI自动化项目模板 以下是一套工程化、可复用、易维护的App UI自动化项目模板,基于PythonAppium2pytest实现,包含BasePage封装、PO页面类、数据驱动、日志/报告/配置分离等核心工程化配置,你只需替换业务相关的元素定位、操作逻辑、…...
Zotero Citation插件进阶使用指南:从安装到定制的全流程解决方案
Zotero Citation插件进阶使用指南:从安装到定制的全流程解决方案 【免费下载链接】zotero-citation Make Zoteros citation in Word easier and clearer. 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-citation [痛点分析]:文献管理中的隐…...
Phi-3-mini-4k-instruct-gguf多场景落地:客服话术优化、会议纪要提炼、周报生成实战
Phi-3-mini-4k-instruct-gguf多场景落地:客服话术优化、会议纪要提炼、周报生成实战 1. 轻量级文本生成利器介绍 Phi-3-mini-4k-instruct-gguf是微软推出的轻量级文本生成模型,特别适合处理日常办公场景中的文本任务。这个模型体积小巧但能力出众&…...
CVE-2024-36401复现
一.漏洞概述 CVE-2024-36401 是 GeoServer 中的一个严重级远程代码执行漏洞(CVSS 9.8),允许未经身份验证的远程攻击者在服务器上执行任意代码。该漏洞源于 GeoServer 调用的 GeoTools 库 API 在评估 XPath 表达式时存在不安全处理࿰…...
华为云AI开发认证HCCDA通关指南:从试题解析到实战应用
1. 华为云HCCDA认证:AI开发者的黄金敲门砖 最近两年,AI技术在各行各业的应用越来越广泛,很多开发者都在寻找能够系统学习AI开发的途径。华为云推出的HCCDA(Huawei Cloud Certified Developer Associate)认证࿰…...
73:L的程序安全:蓝队的规范防御
作者: HOS(安全风信子) 日期: 2026-03-26 主要来源平台: GitHub 摘要: 程序安全是防御的基石,通过规范的流程、自动化执行和可追溯设计构建可靠的安全防御体系。本文分享程序安全的核心价值、L的程序安全策略、技术实现…...
为什么MedNeXt能超越Transformer?揭秘大卷积核在医学图像分割中的独特优势
MedNeXt如何用大卷积核重塑医学图像分割?技术优势全解析 当你在深夜的医院影像科,看着屏幕上模糊的CT扫描图,试图从那些灰度渐变中分辨出肿瘤边界时,是否会想过AI模型眼中的世界?医学图像分割——这个决定患者治疗方案…...
在Python项目中是否应该采用分层结构
在学习Python的过程中,许多开发人员会发现,一些Django项目在视图函数中包含了大量的业务逻辑,类似于Java中的控制器进行过多的业务处理。这导致了一个关键问题:Python项目是否应该采用分层结构?这与MVC(模型-视图-控制…...
