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.跨页面复制:文章分类组件到分类![在这里插入图片描述](https://img…...
【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon
文章目录 一、Eureka1、服务提供者与消费者2、Eureka原理分析3、搭建Eureka4、服务注册5、模拟多服务实例启动6、服务的发现 二、Ribbon1、负载均衡的原理2、源码分析3、负载均衡策略4、饥饿加载 一、Eureka 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注释 %%转义字符的实体代码序…...
ReentrantLock实现原理-公平锁
在ReentrantLock实现原理(1)一节中,我们了解了ReentrantLock非公平锁的获取流程,在本节中我们来看下ReentrantLock公平锁的创建以及锁管理流程 创建ReentrantLock公平锁 创建公平锁代码如下: ReentrantLock reentrantLock new ReentrantL…...
掌握Scala数据结构(2)MAP、TUPLE、SET
一、映射 (Map) (一)不可变映射 1、创建不可变映射 创建不可变映射mp,用键->值的形式 创建不可变映射mp,用(键, 值)的形式 注意:Map是特质(Scala里的trait,相当于Java里的interface&#…...
flutter:文件系统目录、文件读写
参考 参考:老孟 文件存储和网络请求 数据存储 Dart的 IO 库包含了文件读写的相关类,它属于 Dart 语法标准的一部分,所以通过 Dart IO 库,无论是 Dart VM 下的脚本还是 Flutter,都是通过 Dart IO 库来操作文件的。但…...
计算机提示“找不到vcruntime140.dll,无法继续执行代码可”以这样子修复
首先,对于那些不熟悉的人来说,vcruntime140.dll是一个关键文件,用于在Windows操作系统上运行使用C语言编写的大型应用程序。如果你正在运行或安装这样的应用程序,但找不到vcruntime140.dll文件,那么你的应用程序可能无…...
深度学习pytorch实战五:基于ResNet34迁移学习的方法图像分类篇自建花数据集图像分类(5类)超详细代码
1.数据集简介 2.模型相关知识 3.split_data.py——训练集与测试集划分 4.model.py——定义ResNet34网络模型 5.train.py——加载数据集并训练,训练集计算损失值loss,测试集计算accuracy,保存训练好的网络参数 6.predict.py——利用训练好的网…...
Rust in Action笔记 第五章 深入理解数据
如果希望看到f32类型的数转换成整型数字u32类型,需要在unsafe包裹下调用std::mem::transmute(data),因为在安全的Rust语法中没有把整型数据按照bit转换成浮点数据的实现,如果想要看到浮点数的二进制输出(通过{:b})&…...
Cocos creator实现飞机大战空中大战《战击长空》小游戏资源及代码
Cocos creator实现飞机大战空中大战《战击长空》小游戏资源及代码 最近在学习Cocos Creator,作为新手,刚刚开始学习Cocos Creator,刚刚入门,这里记录一下飞机大战小游戏实现。 https://wxaurl.cn/VEgRy2eTMyi 一 安装CocosDashBo…...
2.4 逻辑代数的基本定理
学习目标: 如果我要学习逻辑代数的基本定理,我会采取以下步骤: 1. 学习基本概念:首先,我会花时间了解逻辑代数的基本概念,如逻辑运算符(合取、析取、否定等)、真值表、逻辑等价性等…...
适用于 Linux 的 Windows 子系统wsl文档
参考链接:https://learn.microsoft.com/zh-cn/windows/wsl/ 鸟哥的Linux私房菜:http://cn.linux.vbird.org/ http://cn.linux.vbird.org/linux_basic/linux_basic.php http://cn.linux.vbird.org/linux_server/ 目录 安装列出可用的 Linux 发行版列出已…...
C++特殊类的设计与类型转换
特殊类的设计与类型转换 特殊类的设计请设计一个类,只能在堆上创建对象请设计一个类,只能在栈上创建对象请设计一个类,只能创建一个对象(单例模式) C的类型转换 特殊类的设计 请设计一个类,只能在堆上创建对象 通过new创建的类就…...
三只松鼠网站建设/临沂seo
JVM PPT的演进文稿分享 此PPT长达46页,不方便在页面中全部展示,文中只展示了文稿的前十二页。 获取完整版请在公众号内回复“JVM”。...
哪个网站可以做字体大小/国内最好用免费建站系统
上午 题还是比较水的... T1 attack 题意: 给一个有向图,Q次询问K个点,问从1到K个点的必经点 (没说是DAG,但数据是DAG...)、 支配树的裸题吗,但是不会支配树啊.... 然后就求割点,桥,然后就懵逼了…...
网站如何强制修改主页 源码/关键词优化师
数字是表示计数的抽象事物,也是数学运算和推理的基础,所以,生活中数字是生活中无处不在的,那么,在python语言中运用数字有哪些小知识呢,不妨花点时间看一下这篇博文,牢记这些小知识。 整数类型中…...
电子商务网站开发费用/h5网站制作平台
5V 输入升压开关型双节锂电池充电管理芯片 -FS5080ES FS5080ES 是一款 3.6V-5.5V/2A 输入, 1A 输出,双节锂电池/锂离子电池充电的异步升压充电控制器。具有完善的充电保护功能。针对不同的应用场合,芯片可以通过方便地调节外部电阻的阻值来改…...
做网站还能挣钱吗/一件代发48个货源网站
1.鼠标设定:在Allegro视窗layout时,每执行一个指令例:Addconnect, Show element等鼠标会跳到Option窗口,这样对layout造成不便. 1)控制面版>滑鼠之移动选项中,指到预设按钮(或智慧型移动):取消“在对话方块将滑鼠指标…...
模板网站建设公司电话/网站建设需要多少钱
前言:最近因项目需求,需要打包linux-qt程序给客户先用一下子。百度一大堆终于找了几个靠谱的来综合一下,留为备用吧。由于是先遣版所以仅制作为免安装程序的格式。正文:博主的qt是5.9.2的,程序名称为ocs,下…...