位置: IT常识 - 正文

Vue实战【封装一个简单的列表组件,实现增删改查】(vue封装组建)

编辑:rootadmin
Vue实战【封装一个简单的列表组件,实现增删改查】 文章目录🌟前言🌟table组件封装🌟父组件(展示表格的页面)🌟控制台查看父子组件通信是否成功🌟Vue2父子组件传递参数🌟写在最后🌟JSON包里写函数,关注博主不迷路🌟前言

推荐整理分享Vue实战【封装一个简单的列表组件,实现增删改查】(vue封装组建),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue封装组件思路,vue封装过程,vue封装过程,请说下封装 vue 组件的过程?,封装vuex,vue封装组件思路,vue 封装dialog,封装vuex,内容如对您有帮助,希望把文章链接给更多的朋友!

大家好,上一期的Vue实战都阅读了吗?上一期主要是对Vuex的一个基本操作,通过Vuex我们可以实现全局的状态(数据)共享,以便与我们更好的实现一些需求。 不知道大家在日常工作当中是否被频繁的列表增删改查困扰,功能很简单但确实是非常繁琐的一项工作;今天这一期呢我会从Vue2父子组件如何传值并结合Element来封装一个简单的列表组件;一次封装,多次复用。

🌟table组件封装

在你的component目录下创建一个Table.vue:

<template> <el-card class="box-card" style="width: 100%;height: 100%"> <div class="btnBox"> <el-button v-for="(item,index) in tableOperation" :key="index" :type="item.type" size="small" @[eventName]="handleClick(item.fun, multipleSelection)">{{ item.label }}</el-button> </div> <el-table style="margin-bottom: 20px" :data="tableData" size="small" row-class-name="row" cell-class-name="column" :highlight-current-row="true" fit @selection-change="handleSelectionChange" > <!--这是是为了将表格设置成带有选择框的表格--> <el-table-column type="selection" width="55" /> <el-table-column v-for="(item, index) in tableLabel" :key="index" align="center" :prop="item.prop" :width="item.width" :label="item.label" /> </el-table> <div class="block" style="text-align: end"> <el-pagination background :current-page="1" :page-sizes="[10, 20, 30, 40]" :page-size="10" layout="total, sizes, prev, pager, next, jumper" :total="tableData.length" @size-change="handleSizeChange" @current-change="handleCurrentChange" /> </div> </el-card></template><script>export default { name: 'Table', // 因为是子组件,要接受父组件传递的数据,所以这里我们定义props props: { tableData: { // 父组件传递过来的表格数据 type: Array, default: () => { return [] } }, tableLabel: { // 父组件传递过来的表头数据 type: Array, default: () => { return [] } }, tableOperation: { // 父组件传递过来的操作按钮数据 type: Array, default: () => { return [] } } }, data() { return { eventName: 'click', // 点击按钮绑定的方法,这样写法也可以去绑定一些其他的比如change等方法 multipleSelection: [] // 这个数组用来保存被选择行的数据,顺序是按照你勾选的顺序来排序的 } }, methods: { // @selection-change方法可以监听到表格里哪一行被选中,类型是数组; // 然后我们将它赋值给定义好的 multipleSelection handleSelectionChange(val) { this.multipleSelection = val }, // 动态绑定操作按钮的点击事件(按钮是父组件传递过来循环出来的,所以我们给按钮定义一个方法) // 接收两个参数,一个是fun(string类型),一个是row(array类型,也就是我们选中行的数据) // 这里的某个按钮时传递的参数 // 比如我点击的是编辑,那这时的fun就是 'edit',执行的方法就是下边的this.edit(row) handleClick(fun,row) { this[fun](row) }, edit(row) { if (!row.length) { this.$message.error('请勾选数据后操作') return false } else if (row.length > 2) { this.$message.error('当前仅支持单条数据操作') return false } else { console.log('子组件点击编辑,触发父组件方法;并传递数据', row) // 通过$meit通知父组件propClick方法,并传递两个参数:'edit'和row this.$emit('propClick', 'edit', row) } }, look(row) { if (!row.length) { this.$message.error('请勾选数据后操作') return false } else if (row.length > 2) { this.$message.error('当前仅支持单条数据操作') return false } else { console.log('子组件点击查看,触发父组件方法;并传递数据', row) // 通过$meit通知父组件propClick方法,并传递两个参数:'edit'和row this.$emit('propClick', 'look', row) } }, delete(row) { if (!row.length) { this.$message.error('请勾选数据后操作') return false } else if (row.length > 2) { this.$message.error('当前仅支持单条数据操作') return false } else { console.log('子组件点击删除,触发父组件方法;并传递数据', row) // 通过$meit通知父组件propClick方法,并传递两个参数:'edit'和row this.$emit('propClick', 'del', row) } }, handleSizeChange(val) { console.log(`每页 ${val} 条`) }, handleCurrentChange(val) { console.log(`当前页: ${val}`) } }}</script><style scoped></style>

table组件封装好了,就可以在父组件里使用啦。

🌟父组件(展示表格的页面)

创建一个父组件(也就是你的页面),我这里起名index.vue大家可以随意;

<template> <div v-loading="tableLoading" class="dashboard-container"> <!--子组件位置--> <!--自定义table-data,table-label,table-operation三个属性,分别传递我们需要的数据--> <!--自定义@propClick方法,用来接收子组件的通知并执行定义的btnClick方法--> <myTable :table-data="tableData" :table-label="tableLabel" :table-operation="tableOperation" @propClick="btnClick" /> </div></template><script>import { mapGetters } from 'vuex'// 根据你的table组件引入到父组件里import myTable from '@/components/Table/table'export default { name: 'Dashboard', // 并在父组件的compoments里边注册 components: { myTable }, computed: { ...mapGetters([ 'name' ]) }, // eslint-disable-next-line vue/order-in-components data() { return { tableLoading: true, // 子组件的表格数据 tableData: [ { id: 1, date: '2018-07-24', sales: 23.34, sale: 137597.76, const: 102203.71, profit: 35394.05 }, { id: 2, date: '2018-07-24', sales: 23.34, sale: 137597.76, const: 102203.71, profit: 35394.05 }, { id: 3, date: '2018-07-24', sales: 23.34, sale: 137597.76, const: 102203.71, profit: 35394.05 }, { id: 4, date: '2018-07-24', sales: 23.34, sale: 137597.76, const: 102203.71, profit: 35394.05 }, { id: 5, date: '2018-07-24', sales: 23.34, sale: 137597.76, const: 102203.71, profit: 35394.05 }, { id: 6, date: '2018-07-24', sales: 23.34, sale: 137597.76, const: 102203.71, profit: 35394.05 }, { id: 7, date: '2018-07-24', sales: 23.34, sale: 137597.76, const: 102203.71, profit: 35394.05 }, { id: 8, date: '2018-07-24', sales: 23.34, sale: 137597.76, const: 102203.71, profit: 35394.05 }, { id: 9, date: '2018-07-24', sales: 23.34, sale: 137597.76, const: 102203.71, profit: 35394.05 }, { id: 10, date: '2018-07-24', sales: 23.34, sale: 137597.76, const: 102203.71, profit: 35394.05 }, { id: 11, date: '2018-07-24', sales: 23.34, sale: 137597.76, const: 102203.71, profit: 35394.05 }, { id: 12, date: '2018-07-24', sales: 23.34, sale: 137597.76, const: 102203.71, profit: 35394.05 } ], // 子组件的表头数据 tableLabel: [ { label: 'ID', width: '40', prop: 'id' }, { label: '日期', width: '', prop: 'date' }, { label: '销售量', width: '', prop: 'sales' }, { label: '销售额', width: '', prop: 'sale' }, { label: '成本', width: '', prop: 'const' }, { label: '利润', width: '', prop: 'profit' } ], // 子组件的操作按钮 tableOperation: [ { label: '编辑', fun: 'edit', type: 'primary' }, { label: '查看', fun: 'look', type: 'success' }, { label: '删除', fun: 'delete', type: 'danger' } ] } }, mounted() { setTimeout(() => { this.tableLoading = false this.$message.success('数据加载成功') }, 1000) }, methods: { // 当父组件接收到了子组件this.$emit的通知后就会执行这个方法来接收子组件点击传递过来的数据 btnClick(fun, row) { if (fun === 'edit') { console.log('子组件点击了编辑,父组件收到子组件传递的数据', row) } else if (fun === 'look') { console.log('子组件点击了查看,父组件收到子组件传递的数据', row) } else if (fun === 'del') { console.log('子组件点击了删除,父组件收到子组件传递的数据', row) } } }}</script><style lang="scss" scoped>.dashboard { &-container { /*width: 100%;*/ margin: 30px; height: 88vh; } &-text { font-size: 30px; line-height: 46px; }}</style>🌟控制台查看父子组件通信是否成功

列表增删改查

🌟Vue2父子组件传递参数Vue实战【封装一个简单的列表组件,实现增删改查】(vue封装组建)

接下来我们来复习一下父子组件传递参数的方法吧

父组件向子组件传递数据:

父组件通过 props 给子组件下发数据

在父组件内为子组件添加自定义属性,例如我上边的table-data,table-label,table-operation三个属性,并为其绑定数据;如果是动态绑定就需要加上 :,反则不用加。子组件内通过定义props来接受数据;并且有以下几个参数配置;属性值说明type原生构造器参数的类型defaultany参数的默认值,数组/对象的默认值应当由一个工厂函数返回requiredtrue/false参数是否必传validatorfunction自定义验证函数Vue.component('example', { props: { // 基础类型检测 (`null` 指允许任何类型) propA: Number, // 可能是多种类型 propB: [String, Number], // 必传且是字符串 propC: { type: String, required: true }, // 数值且有默认值 propD: { type: Number, default: 100 }, // 数组/对象的默认值应当由一个工厂函数返回 propE: { type: Object, default: function () { return { message: 'hello' } } }, // 自定义验证函数 propF: { validator: function (value) { return value > 10 } }, propG: { validator: function (value) { // 这个值必须匹配下列字符串中的一个 return ['success', 'warning', 'danger'].indexOf(value) !== -1 } } }})

子组件向父组件传递数据:

子组件通过事件给父组件发送消息

每个 Vue 实例都实现了事件接口,即:

使用 $on(eventName) 监听事件使用 $emit(eventName, optionalPayload) 触发事件

1. 主要方法在父组件里。 2. 在父组件里添加自定义事件,自定义事件触发执行主要方法。 3. 在子组件里写一个通知方法( this.$emit(‘自定义事件’,参数) )用来告诉父组件执行自定义事件。 4. 在需要触发这个事件的元素上添加触发事件(例:@click=“子组件里的通知方法”)

<!-- 子组件 --><template> <el-card class="box-card" style="width: 100%;height: 100%"> <div class="btnBox"> <el-button v-for="(item,index) in tableOperation" :key="index" :type="item.type" size="small" @click="handleClick(item.fun, multipleSelection)">{{ item.label }} </el-button> </div> </el-card></template><script>export default { name: 'Table', methods: { add(row) { console.log('子组件点击新增,触发父组件里的自定义事件-propClick') this.$emit('propClick', 'add') } }}</script><style scoped></style><!-- 父组件 --><template> <div v-loading="tableLoading" class="dashboard-container"> <myTable @propClick="btnClick" /> </div></template><script>import myTable from '@/components/Table/table'export default { name: 'Dashboard', components: { myTable }, methods: { //自定义事件-propClick触发该方法, 接收子组件点击按钮数据 btnClick(fun, row) { if (fun === 'edit') { console.log('子组件点击了编辑,父组件收到子组件传递的数据', row) // 这里就可以去写我们需要调用的接口呀,数据处理逻辑呀等等 } else if (fun === 'look') { console.log('子组件点击了查看,父组件收到子组件传递的数据', row) // 这里就可以去写我们需要调用的接口呀,数据处理逻辑呀等等 } else if (fun === 'del') { console.log('子组件点击了删除,父组件收到子组件传递的数据', row) // 这里就可以去写我们需要调用的接口呀,数据处理逻辑呀等等 } } }}</script>🌟写在最后

这篇文章通过父子组件通信并结合Element封装了一个简单的增删改查列表组件,你是否学会了呢?很多复杂的功能都是通过基础知识举一反三得来的,小伙伴一定记的尝试哦。后续会为小伙伴们持续更新Vue的一些实战小魔法!各位小伙伴让我们 let’s be prepared at all times!

🌟JSON包里写函数,关注博主不迷路

✨原创不易,还希望各位大佬支持一下! 👍 点赞,你的认可是我创作的动力! ⭐️ 收藏,你的青睐是我努力的方向! ✏️ 评论,你的意见是我进步的财富!

本文链接地址:https://www.jiuchutong.com/zhishi/296163.html 转载请保留说明!

上一篇:国内外人工智能AI工具网站大全(一键收藏,应有尽有)(国内外人工智能发展现状,及最新的人工智能应用?)

下一篇:[HyperGraph专题]HGNN+:General Hypergraph Neural Networks(hypergraph learning)

  • Edge浏览器闪退解决办法(Edge浏览器闪退)

    Edge浏览器闪退解决办法(Edge浏览器闪退)

  • 网站推广新方法:如何做一个自媒体 自媒体的运营规划(如何进行网站推广?网站推广的基本手段有哪些)

    网站推广新方法:如何做一个自媒体 自媒体的运营规划(如何进行网站推广?网站推广的基本手段有哪些)

  • 微信接不到语音通话和视频是怎么回事呢(微信接不到语音电话 过后只能收到未接提醒)

    微信接不到语音通话和视频是怎么回事呢(微信接不到语音电话 过后只能收到未接提醒)

  • opporeno如何开空调(oppo 如何开空调)

    opporeno如何开空调(oppo 如何开空调)

  • 苹果屏幕下面的横条怎么设置(苹果屏幕下面的横条有什么用)

    苹果屏幕下面的横条怎么设置(苹果屏幕下面的横条有什么用)

  • qq聊天记录会被监视吗(qq聊天记录会被网络警察监控吗)

    qq聊天记录会被监视吗(qq聊天记录会被网络警察监控吗)

  • 抖音可以隐身吗(抖音怎么无痕浏览别人)

    抖音可以隐身吗(抖音怎么无痕浏览别人)

  • 苹果手机与电脑连接的软件(苹果手机与电脑连接不上)

    苹果手机与电脑连接的软件(苹果手机与电脑连接不上)

  • 拼多多能看到好友的购买记录吗(拼多多能看到好友的地址吗)

    拼多多能看到好友的购买记录吗(拼多多能看到好友的地址吗)

  • 差评对于天猫重要吗(给天猫店差评买家的评价管理会显示吗)

    差评对于天猫重要吗(给天猫店差评买家的评价管理会显示吗)

  • 华为铃声是什么歌中文(华为铃声是什么名字)

    华为铃声是什么歌中文(华为铃声是什么名字)

  • 荣耀v20支持屏下指纹吗(荣耀v20可以灭屏显示吗)

    荣耀v20支持屏下指纹吗(荣耀v20可以灭屏显示吗)

  • 豆瓣发送私信过于频繁要等多久(豆瓣发私信对方能不能看到)

    豆瓣发送私信过于频繁要等多久(豆瓣发私信对方能不能看到)

  • 苹果7p有信号电话打不进(苹果7p手机有信号为什么打不通)

    苹果7p有信号电话打不进(苹果7p手机有信号为什么打不通)

  • 勿扰模式能看到来电吗(勿扰模式能看到定位吗)

    勿扰模式能看到来电吗(勿扰模式能看到定位吗)

  • 网速和网线有关吗(网速跟网线有关系么)

    网速和网线有关吗(网速跟网线有关系么)

  • 手机截屏是什么意思(手机截屏是什么格式)

    手机截屏是什么意思(手机截屏是什么格式)

  • qq如何发送文件(qq如何发送文件夹给对方)

    qq如何发送文件(qq如何发送文件夹给对方)

  • 手机分辨率一般为多少(手机分辨率一般是多少像素)

    手机分辨率一般为多少(手机分辨率一般是多少像素)

  • 文档部件域是干什么的(文档部件域styleref)

    文档部件域是干什么的(文档部件域styleref)

  • xs怎么开机(xs如何开机关机)

    xs怎么开机(xs如何开机关机)

  • 5g牌照是什么(5g车牌号)

    5g牌照是什么(5g车牌号)

  • 电信光纤e蓝色灯一直亮(电信光纤e蓝色灯不亮)

    电信光纤e蓝色灯一直亮(电信光纤e蓝色灯不亮)

  • 京东退货如何填写(京东退货如何填写快递单号)

    京东退货如何填写(京东退货如何填写快递单号)

  • MOM.exe是什么进程?是MOM.exe病毒吗?为什么运行?(mode exe)

    MOM.exe是什么进程?是MOM.exe病毒吗?为什么运行?(mode exe)

  • 手把手教你使用--常用模块--HC05蓝牙模块,无线蓝牙串口透传模块,(实例:手机蓝牙控制STM32单片机点亮LED灯)(手把手教你使用opc)

    手把手教你使用--常用模块--HC05蓝牙模块,无线蓝牙串口透传模块,(实例:手机蓝牙控制STM32单片机点亮LED灯)(手把手教你使用opc)

  • 退个税手续费如何申报
  • 资产处置出售
  • 个人所得税年底返税
  • 其他业务收入冲应收账款
  • 通用机打发票如何验旧
  • 自建的固定资产可以抵扣吗
  • 价外费用纳税义务发生时间
  • 收到赞助费如何做分录
  • 加油费充值卡发票可以报销吗
  • 应收账款客户少了几毛没有付怎么处理
  • 待摊费用的金额
  • 虚开发票的进项税额转出如何做分录?
  • 资管新规出台目的
  • 固定资产内部调拨流程
  • 出售固定资产累计折旧的账务处理
  • 坏账准备的计提应当关注
  • 投资性房地产转为自用的会计处理
  • 车辆租赁费交的是什么税
  • 员工因违反公司规章制度被辞退有补偿吗
  • 如何做预估成本
  • 个人股权转让如何申报个人所得税
  • PHP:mb_ereg_search_pos()的用法_mbstring函数
  • 光纤布线有什么作用
  • RPDFLchr.exe - RPDFLchr是什么进程 有什么用
  • 如何设置两台路由器连接
  • 代开专票缴纳的增值税怎么做账?
  • 绩效奖个人所得怎么算
  • citespace分析derwent
  • vue props emit
  • PHP:imageinterlace()的用法_GD库图像处理函数
  • mac phpstudy
  • windows nginx php配置
  • 利润表用处
  • 国税网如何下载申报后的财务报表
  • 小规模能取得专用发票吗
  • 消费税增值税和个人所得税是什么意思
  • 织梦相关文章调用
  • 企业预收账款缴纳个税吗
  • mongodb数据删除
  • 延期缴纳土地使用税怎么办理
  • 拓展费用入什么科目
  • 股票股利的资金来源
  • 企业所得税汇算清缴时间
  • 基建并账时用交付使用资产对冲基建拨款
  • 单位未足额缴纳社保怎么赔偿
  • 冲减以前年度营业外收入分录
  • 税金及附加的核算范围
  • 民间非盈利组织会计制度核算的基础
  • 长期未用的定金可以退吗
  • 建筑施工企业劳务费怎么入成本
  • 公司买车车辆购置税怎么交钱
  • 软件测试收费标准2019
  • 记账凭证原始凭证回单的粘贴顺序
  • centos下安装jdk
  • 微软10月已停止服务中国用户
  • redhat网卡配置文件
  • rancheros github
  • xmp文件是干嘛用的
  • Win7旗舰版系统安装
  • ie11安装方法
  • win10自定义壁纸在哪个文件夹里
  • 系统死锁或资源管理器崩溃时让xp系统自动重启的方法
  • windowsxp优化教程
  • 密码多次错误被锁定怎么办
  • 给推荐几款
  • linux shell find
  • win8鼠标速度怎么调
  • glrotatef函数
  • node.js加密
  • 相片管理必备知识
  • xcopy命令拷贝目录
  • 如何用python画花瓣
  • js异步实现原理
  • javascript基础教学
  • Python Sqlite3以字典形式返回查询结果的实现方法
  • js鼠标滚动控制图片缩放
  • 国家税务总局现任局长
  • 如何当好一名税务局长
  • 北京国税app
  • 核定土地增值税的条件
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设