Vue3+Vite+Element-Plus实现CRUD常见表单项目

news2024/12/22 17:05:02

效果有 查询,增加,表格,删除,编辑

在这里插入图片描述

其实CRUD,就是一个管理项目最常见的功能
C增加 (Create)
R读取 (Read)
U更新 (Update)
D删除 (Delete)

一、创建项目

vue3用vite创建项目

1 对应路径cmd 输入 npm create vite@latest
2 Ok to proceed? 输入 y
3 Project name 输入 项目名称
4 Select a framework 选择 Vue
5 Select a variant 选择 JavaScript

cd 项目名称;npm install;npm run dev

二、引入element-plus

  • 安装
npm install element-plus --save
  • 配置main.js文件
import { createApp } from 'vue'
import App from './App.vue'
//element-plus
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import zhCn from 'element-plus/dist/locale/zh-cn.mjs'

createApp(App).use(ElementPlus,{ locale: zhCn}).mount('#app')

三、基本内容

直接在 App.vue添加内容,分为3大模块

在这里插入图片描述

<template>
  <el-col :span="20" class="table-box">
    <!--title 标题-->
    <div class="title">
      <h2>最简单的 CRUD Demo</h2>
    </div>
    <!--query 查询-->
    <div class="query-box">
      <el-col :span="8">
        <el-input v-model="queryInput" placeholder="请输入姓名搜索" />
      </el-col>
      <div>
        <el-button type="primary" @click="handleAdd">增加</el-button>
        <el-button type="danger" @click="handleListDel" v-if="multipleSelection.length > 0">删除</el-button>
      </div>
    </div>
    <!--table 表格-->
    <el-table :data="tableData" style="width: 100%" border @selection-change="handleSelectionChange"
      ref="multipleTableRef">
      <el-table-column type="selection" width="55" />
      <el-table-column prop="name" label="姓名" width="120" />
      <el-table-column prop="email" label="邮件" width="120" />
      <el-table-column prop="phone" label="电话" width="120" />
      <el-table-column prop="state" label="状态" width="120" />
      <el-table-column prop="address" label="地址" width="300" />
      <el-table-column fixed="right" label="操作" width="120">
        <template #default="scope">
          <el-button link type="danger" size="small" @click="handleRowDel(scope.row.id)">删除</el-button>
          <el-button link type="primary" size="small" @click="handleEdit(scope.row)">编辑</el-button>
        </template>
      </el-table-column>
    </el-table>
  </el-col>
</template>

模拟数据

let tableData = ref([
  {
    id: 1,
    name: 'Tom1',
    email: "123@qq.com",
    phone: "12345678901",
    state: '在职',
    city: 'Los Angeles',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    id: 20,
    name: 'Tom2',
    email: "123@qq.com",
    phone: "12345678901",
    state: '在职',
    city: 'Los Angeles',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    id: 3,
    name: 'Tom3',
    email: "123@qq.com",
    phone: "12345678901",
    state: '在职',
    city: 'Los Angeles',
    address: 'No. 189, Grove St, Los Angeles',
  },

])

四、添加弹窗

    <el-dialog v-model="dialogFormVisible" :title="dialogType === 'add' ? '新增' : '编辑'">
      <el-form :model="tableForm" label-width="auto">
        <el-form-item label="姓名">
          <el-input v-model="tableForm.name" autocomplete="off" />
        </el-form-item>
        <el-form-item label="邮箱">
          <el-input v-model="tableForm.email" autocomplete="off" />
        </el-form-item>
        <el-form-item label="电话">
          <el-input v-model="tableForm.phone" autocomplete="off" />
        </el-form-item>
        <el-form-item label="状态">
          <el-input v-model="tableForm.state" autocomplete="off" />
        </el-form-item>
        <el-form-item label="地址">
          <el-input v-model="tableForm.address" autocomplete="off" />
        </el-form-item>
      </el-form>
      <template #footer>
        <span class="dialog-footer">
          <el-button type="primary" @click="dialogConfirm">确认</el-button>
        </span>
      </template>
    </el-dialog>

五、增加功能

  • 打开页面 dialogFormVisible等于ture是显示
const handleAdd = (val) => {
  tableForm.value = {}
  dialogType.value = "add"
  dialogFormVisible.value = true
}
  • 确认添加
const dialogConfirm = () => {
  if (dialogType.value === 'add') {
    tableData.value.push({
      id: tableData.value.length + 1,
      ...tableForm.value
    })
  } else {
    let index = tableData.value.findIndex(item => item.id === tableForm.id);
    tableData[index] = tableForm
  }
  dialogFormVisible.value = false
}

六、删除功能

//删除一条按钮
const handleRowDel = (id) => {
  console.log(id)
  let index = tableData.value.findIndex(item => item.id === id)
  tableData.value.splice(index, 1)
}

//删除多条
const handleListDel = () => {
  multipleSelection.value.forEach(id => {
    handleRowDel(id)
  })
  multipleSelection.value = [];
}

七、编辑功能

const handleEdit = (val) => {
  tableForm.value = val
  dialogType.value = "edit"
  dialogFormVisible.value = true
}

八、查询功能

//监控数据
watch(queryInput, (val) => {
  if (val.length > 0) {
    tableData.value = tableData.value.filter(item => item.name.toLowerCase().match(val.toLowerCase()));
  } else {
    tableData.value = tableDataCopy;
  } 
})

九、打包上线

在 vite.config.js 配置打包路径

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
  base: '/dist/',
})

记得是 base: ‘/dist/’

然后运行

npm run build

其它UP主在b站视频讲解

Vue3.2 + Vite + Element-Plus 实现最基础的 CRUD

最终完整代码

<template>
  <el-col :span="20" class="table-box">
    <!--title 标题-->
    <div class="title">
      <h2>最简单的 CRUD Demo</h2>
    </div>
    <!--query 查询-->
    <div class="query-box">
      <el-col :span="8">
        <el-input v-model="queryInput" placeholder="请输入姓名搜索" />
      </el-col>
      <div>
        <el-button type="primary" @click="handleAdd">增加</el-button>
        <el-button type="danger" @click="handleListDel" v-if="multipleSelection.length > 0">删除</el-button>
      </div>
    </div>
    <!--table 表格-->
    <el-table :data="tableData" style="width: 100%" border @selection-change="handleSelectionChange"
      ref="multipleTableRef">
      <el-table-column type="selection" width="55" />
      <el-table-column prop="name" label="姓名" width="120" />
      <el-table-column prop="email" label="邮件" width="120" />
      <el-table-column prop="phone" label="电话" width="120" />
      <el-table-column prop="state" label="状态" width="120" />
      <el-table-column prop="address" label="地址" width="300" />
      <el-table-column fixed="right" label="操作" width="120">
        <template #default="scope">
          <el-button link type="danger" size="small" @click="handleRowDel(scope.row.id)">删除</el-button>
          <el-button link type="primary" size="small" @click="handleEdit(scope.row)">编辑</el-button>
        </template>
      </el-table-column>
    </el-table>
    <!--dialog 弹窗-->
    <el-dialog v-model="dialogFormVisible" :title="dialogType === 'add' ? '新增' : '编辑'">
      <el-form :model="tableForm" label-width="auto">
        <el-form-item label="姓名">
          <el-input v-model="tableForm.name" autocomplete="off" />
        </el-form-item>
        <el-form-item label="邮箱">
          <el-input v-model="tableForm.email" autocomplete="off" />
        </el-form-item>
        <el-form-item label="电话">
          <el-input v-model="tableForm.phone" autocomplete="off" />
        </el-form-item>
        <el-form-item label="状态">
          <el-input v-model="tableForm.state" autocomplete="off" />
        </el-form-item>
        <el-form-item label="地址">
          <el-input v-model="tableForm.address" autocomplete="off" />
        </el-form-item>
      </el-form>
      <template #footer>
        <span class="dialog-footer">
          <el-button type="primary" @click="dialogConfirm">确认</el-button>
        </span>
      </template>
    </el-dialog>
  </el-col>
</template>

<script setup>
import { ref, watch } from 'vue'
//数据
const queryInput = ref("")
let tableData = ref([
  {
    id: 1,
    name: 'Tom1',
    email: "123@qq.com",
    phone: "12345678901",
    state: '在职',
    city: 'Los Angeles',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    id: 20,
    name: 'Tom2',
    email: "123@qq.com",
    phone: "12345678901",
    state: '在职',
    city: 'Los Angeles',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    id: 3,
    name: 'Tom3',
    email: "123@qq.com",
    phone: "12345678901",
    state: '在职',
    city: 'Los Angeles',
    address: 'No. 189, Grove St, Los Angeles',
  },

])
let tableDataCopy = tableData.value;
const multipleSelection = ref([]);//多选
const dialogFormVisible = ref(false);//是否打开
const formLabelWidth = "80px";//弹出框 标题长度
const tableForm = ref({})
const dialogType = ref("add")
//监控数据
watch(queryInput, (val) => {
  if (val.length > 0) {
    tableData.value = tableData.value.filter(item => item.name.toLowerCase().match(val.toLowerCase()));
  } else {
    tableData.value = tableDataCopy;
  } 
})
//选择事件
const handleSelectionChange = (val) => {
  multipleSelection.value = [];
  val.forEach(item => {
    multipleSelection.value.push(item.id)
  });
}
//添加按钮
const handleAdd = (val) => {
  tableForm.value = {}
  dialogType.value = "add"
  dialogFormVisible.value = true
}
//编辑按钮
const handleEdit = (val) => {
  tableForm.value = val
  dialogType.value = "edit"
  dialogFormVisible.value = true
}

//删除一条按钮
const handleRowDel = (id) => {
  console.log(id)
  let index = tableData.value.findIndex(item => item.id === id)
  tableData.value.splice(index, 1)
}

//删除多条
const handleListDel = () => {
  multipleSelection.value.forEach(id => {
    handleRowDel(id)
  })
  multipleSelection.value = [];
}

//确认按钮
const dialogConfirm = () => {
  if (dialogType.value === 'add') {
    tableData.value.push({
      id: tableData.value.length + 1,
      ...tableForm.value
    })
  } else {
    let index = tableData.value.findIndex(item => item.id === tableForm.id);
    tableData[index] = tableForm
  }
  dialogFormVisible.value = false
}

</script>

<style>
.table-box {
  margin: 0 auto;
}

.title {
  text-align: center;
}

.query-box {
  display: flex;
  justify-content: space-between;
  margin-bottom: 20px;
}
</style>

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

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

相关文章

C 语言零基础入门教程(十八)

C 输入 & 输出 当我们提到输入时&#xff0c;这意味着要向程序填充一些数据。输入可以是以文件的形式或从命令行中进行。C 语言提供了一系列内置的函数来读取给定的输入&#xff0c;并根据需要填充到程序中。 当我们提到输出时&#xff0c;这意味着要在屏幕上、打印机上或…

SSM框架整合(Spring+SpringMVC+MyBatis)

一、创建MAVEN工程 二、导入pom依赖 <dependency><groupId>com.mchange</groupId><artifactId>c3p0</artifactId><version>0.9.5.2</version></dependency><!-- https://mvnrepository.com/artifact/commons-logging/comm…

项目错误排查

项目运行不起来&#xff0c;先观察表现&#xff0c;就像中医所讲的望。复现&#xff0c;了解触发问题的时机和过程。在哪个步骤&#xff0c;哪个接口出了问题。闻问切浏览器f12&#xff0c;根据请求参数和响应码判断问题出在前端还是后端。查看错误日志&#xff0c;一般写的还是…

LeetCode011之盛最多水的容器(相关话题:双指针,逻辑分析)

题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容…

小程序 --- 收货地址 --- 定位功能

一、整体功能如下图二、功能点定位选择自己的位置手动选择省市县后输入详细地址关键词搜索地址&#xff0c;然后进行选择三、如何实现定位采用小程序API wx.chooseLocation 调出地图选择位置 API wx.chooseLocation 详细说明根据地址解析出省市县以及详细地址及经纬度代码实现c…

【Linux】-- 进程概念

目录 一、进程概念 二、PCB 1.什么是PCB 2.什么是task_struct 3.task_struct包含内容 三、task_struct内容详解 1.查看进程 &#xff08;1&#xff09;通过系统目录查看 &#xff08;2&#xff09;通过ps命令查看 &#xff08;3&#xff09;通过top命令查看 &…

Mysql自定义变量在递归遍历中的妙用

借着在解决一个递归查询父目录的问题&#xff0c;学习了一下mysql变量的用法&#xff0c;在某些场景下这种解法还是比较有特效的&#xff0c;下面具体来聊一下场景&#xff0c;同时也会详细分析下mysql自定义变量的用法 场景&#xff1a; 获取从树的根节点到叶子节点的全路径&…

图解基于UDS的Flash BootLoader

图解基于UDS的Flash BootLoader一、为什么要搞Bootloader&#xff1f;为什么要基于UDS搞Bootloader二、Bootloader应支持的UDS服务三、Bootloader——三段式(1) 预编程阶段(2) 主编程阶段(3)后编程状态四、BootLoader的启动顺序与转换流程五、问题点疑问点 Q:图中的烧写顺序是…

点云 3D 目标检测 - RangeDet(ICCV 2021)

点云 3D 目标检测 - RangeDet&#xff08;ICCV 2021&#xff09;摘要1. 引言2. 相关工作3. 距离视图表示的回顾4. 方法4.1 距离条件金字塔4.2 元核卷积4.3 加权非最大抑制4.4 距离视图中的数据增强4.5 体系结构5. 实验5.1 元核卷积的研究5.2 距离条件金字塔的研究5.3 加权非最大…

基于android的有声听书系统

需求信息&#xff1a; 1&#xff1a;注册登录&#xff1a;未注册用户首先进行账号注册&#xff0c;注册成功后进行登录&#xff0c;已注册用户直接输入账号密码进行登录&#xff0c;登录成功后进入主页面。 2&#xff1a;主页面&#xff1a;通过左右滑动可以实现对推荐界面、订…

Activity7工作流介绍_和BPM语言介绍---工作流工作笔记003

只说经典,重要的部分,节省学习时间,用最快的速度学习掌握 看一个简单审批流程,要知道工作流是基于状态驱动的,就是比如,状态有: 0 已创建 1 已提交 2 已部门经理审核 3 已总经理审核 4 审核通过 5 审核拒绝 根据这些状态来做驱动. 这里需要用到流程引擎,常见的比如有Drools规…

不看后悔,一文入门Go云原生微服务

文章目录打好基础微服务框架对比简单横评各个框架微服务概念软件架构演进史简单理解微服务的好处go-micro概述构成组件Go MicroAPISidecarWebCLIBot总结Go Micro组件架构Registry注册中心Selector负载均衡Broker事件驱动&#xff1a;发布订阅Transport消息传输总结快速入门准备…

使用Java8优化模板方法模式

目录 前言 以前的模板方法 Java 8 的函数式编程 Java 8以后的模板方法 总结 前言 我们在日常开发中&#xff0c;经常会遇到类似的场景&#xff1a;当要做一件事儿的时候&#xff0c;这件事儿的步骤是固定好的&#xff0c;但是每一个步骤的具体实现方式是不一定的。 通…

网络 随笔 2-linux的三种网络模式

0. 前面的科普对操作系统网络的理解还有帮助的 简单点&#xff0c;linux三种网络模式 linux中的三种网络模式 1. bridge 物理网卡使用虚拟网桥作为虚拟交换机的输入物理机以及虚拟网卡接入这个虚拟交换机虚拟网卡与物理网卡处于一个网段下(网关与DNS 一致) 2. NAT 虚拟的N…

删除的文件怎么恢复?误删文件恢复,就使用这些方法!

电脑里面保存着很多文件&#xff0c;为了让电脑更整洁&#xff0c;我们一般都会定期清理不必要的数据。在清理过程中&#xff0c;出现文件被误删&#xff0c;我们该怎么办&#xff1f;误删文件恢复&#xff0c;方法就看下面三个&#xff1a;注册表恢复、回收站恢复、软件恢复。…

一场晚会直播背后的安全攻防

多姿多彩的数字世界中&#xff0c;“直播”扮演了不可或缺的角色。刚刚结束的央视春晚&#xff0c;腾讯和中央广播电视总台一起打造了“竖屏春晚HDR及菁彩声”技术方案&#xff0c;并在“央视频”客户端上线。让广大用户“听”得更沉浸&#xff0c;“看”得更清晰。总台首次使用…

无刷电机驱动器

0.0参考&#xff1a; FOC?看这篇文章就够了 志辉君——【自制FOC驱动器】深入浅出讲解FOC算法与SVPWM技术 SPWM基本原理详解&#xff08;图文并茂公式推导C程序实现&#xff09; 1、开源的FOC方案 1、SmipleFOC是比较常见的无刷驱动方案&#xff0c;因为其便宜的制造成本…

高级Spring之Scope 详解

在当前版本的 Spring 和 Spring Boot 程序中&#xff0c;支持五种 Scope singleton&#xff0c;容器启动时创建&#xff08;未设置延迟&#xff09;&#xff0c;容器关闭时销毁 prototype&#xff0c;每次使用时创建&#xff0c;不会自动销毁&#xff0c;需要调用 DefaultList…

使用Plotly和Python进行交互式数据可视化

使用Plotly和Python进行交互式数据可视化 Python是数据探索和数据分析的好帮手&#xff0c;这都要归功于numpy、pandas、matplotlib等神奇库的支持。在我们的数据探索和数据分析阶段&#xff0c;理解我们正在处理的数据是非常重要的&#xff0c;为此&#xff0c;数据的可视化表…

Swin-Transformer算法解析

本文参考&#xff1a; SwinTransformer&#xff1a;使用shifted window的层级Transformer(ICCV2021)_tzc_fly的博客-CSDN博客 https://zhuanlan.zhihu.com/p/430047908 目录 1 为什么在视觉中使用Transformer 2 Swin-Transformer算法总体架构 3 Swin-Transformer Block详述…