zCrud组件(vue2封装增删查改到一个组件)


一、前言

您相信吗?实现下面的新增、查询、编辑、删除、批量删除、分页等功能只需要一个组件

本文将分享该组件的封装,也是和各位一起交流学习一下组件封装的思路,从而得到提升,也会将此组件源码开源出来交流使用,如果你想用于生产环境你可以阅读组件,进行稍加改造;

在这里插入图片描述

zCrud组件演示视频

带你看下vue的template标签有什么内容,不难看出它是通过options变量来控制查询项,表单项、操作列等等功能

<template>
  <div class='z-crud-demo hidden-container'>
    <zCrud ref="zCrud" v-bind="options" @save="save" @search="search" @search-reset="searchReset" @remove="remove"
      @multiple-remove="multipleRemove" @pagination-size-change="paginationSizeChange"
      @pagination-current-change="paginationcurrentChange" @before-edit="beforeEdit">
      <!-- 插槽格式化文案 -->
      <template #category="{ row }">{{ categoryFormat(row.category) }}</template>
    </zCrud>
  </div>
</template>

二、参数总览

看到这么多配置参数你是不是慌了,其实绝大多数参数你都不需要配置,参数多只是为了有特殊化的需求的出现;

字段说明
searchOption搜索参数配置对象
columns列配置数组
handleOption操作列配置对
paginationOption分页配置对象
formItemOption表单项配置对象
toolbarOption工具栏配置对象
tableOption表格配置对象
selectionOption多选配置对象
indexOption索引配置对象
dialogOption弹窗配置对象
formOption表单配置对象
component组件配置对象

1. 搜索配置对象searchOption

当然你也可以将elementUI的form组件的属性维护在此对象,同样生效

字段说明类型默认值是否必填
query搜索对象object
gutterform-item之间的paddingnumber20
size尺寸stringsmall
1.1 查询项配置对象query
字段说明类型默认值是否必填
label文案string
value值,可以设置默认值anyundefined
component组件配置项目,详细请看指定章节 点我跳转object

示例:
在这里插入图片描述

  searchOption: {
    query: {
      name: {
        label: '商品名称',
        component: {
          name: 'el-input',
          disabled: false,
          span: 8,
        }
      },
      stock: {
        label: '库存数量',
        component: {
          name: 'el-input',
          disabled: false,
          span: 8,
        }
      },
      category: {
        label: '商品分类',
        value: 1,
        component: {
          name: 'el-select',
          span: 8,
          options: [
            {
              label: '全部',
              value: 1
            },
            {
              label: '家电',
              value: 2
            },
            {
              label: '家具',
              value: 3
            },
            {
              label: '食物',
              value: 4
            },
          ]
        }
      },
    }
  },

2. 列配置数组columns

字段说明类型默认值是否必填
labelform-item-label的文案string
field对应form-item-label的propstring

示例
在这里插入图片描述

  columns: [
    {
      label: '商品名称',
      field: 'name',

    },
    {
      label: '商品价格',
      field: 'price',
    },
    {
      label: '商品库存',
      field: 'stock',
    },
    {
      label: '商品分类',
      field: 'category',
    },
    {
      label: '状态',
      field: 'status',
    },
    {
      label: '过期日期',
      field: 'expirationDate',
    },
  ],

3. 操作列配置对象handleOption

默认状态下是开启操作列的,您甚至连handleOption都无需配置,如果你需要关闭则维护下面代码
handleOption: { show:false}

字段说明类型默认值是否必填
show是否展示操作列booleantrue
edit编辑按钮,详细请看点击跳转object
remove删除按钮,详细请看点击跳转object
custom其它自定义按钮,详细请看点击跳转object

示例

在这里插入图片描述

  handleOption: {
    width:'360px',
    show: true,//默认开启的
    edit: {
      text: '编辑', //按钮文字, null= 取消文字
      icon: 'el-icon-edit', //按钮图标
      disabled: (index, row) => {
        if (row.category == 3) return true
        return false
      },// 是否禁用
    },
    remove: {
      icon: 'el-icon-delete', //按钮图标
    },
    custom: [
      {
        text: '进货', //按钮文字, null= 取消文字
        icon: 'el-icon-thumb', //按钮图标
        type:'warning'
      }
    ]
  },

4. 分页配置对象paginationOption

elementUI的pagination组件属性维护到paginationOption对象同样生效

字段说明类型默认值是否必填
currentPage当前页number
pageSize展示条数number
total总数number

示例

在这里插入图片描述

  paginationOption: {
    currentPage: 1,
    pageSize: 20,
    total: 0
  },

5. 表单项配置对象formItemOption

新增、修改弹窗下的el-form-item标签的属性拓展配置对象

字段说明类型默认值是否必填
label文案string
value值,可以设置默认值anyundefined
component组件配置项目,详细请看指定章节 点我跳转object

示例也可以参照此章节点我跳转


6. 工具栏配置对象toolbarOption

默认是开启工具栏功能的,如果需要关闭只需要配置toolbarOption:{show:false}

字段说明类型默认值是否必填
show是否显示工具栏booleantrue
create新增按钮,详细请看点击跳转object
multipleRemove批量删除按钮,详细请看点击跳转object

示例

在这里插入图片描述

  toolbarOption: {
    show:true,//默认是开启的
    create:{
      icon: 'el-icon-circle-plus-outline', //按钮图标
    },
    multipleRemove:{
      icon: 'el-icon-delete',
    }
  },

7. 表格配置对象tableOption

绝大多数情况下您无需配置,可以将elementUI的table组件的属性作用于此对象

8. 多选配置对象selectionOption

默认是开启表格勾选功能的,同时如果关闭表格勾选功能的话批量删除功能也会关闭

字段说明类型默认值是否必填
show是否需要多选表格booleantrue

9. 索引配置对象indexOption

该功能默认是关闭的,如果你要开启只需要穿个空对象即可,也就是indexOption:{}

10. 弹窗配置对象dialogOption

绝大多数情况下您无需配置,可以将elementUI的dialog组件的属性作用于此对象

字段说明类型默认值是否必填
editTitle编辑时的弹窗title文案string编辑
createTitle新增时的弹窗title文案string新增

11. 表单配置对象formOption

新增、修改弹窗下的el-form标签的属性拓展配置对象,绝大多数下,您无需配置;

字段说明类型默认值是否必填
rules表单校验规则object

示例

  formOption: {
    rules: {
      name: [{ required: true, trigger: 'blur', message: '此项是必填项' }],
      price: [{ required: true, trigger: 'blur', message: '此项是必填项' }],
      stock: [{ required: true, trigger: 'blur', message: '此项是必填项' }],
      category: [{ required: true, trigger: 'blur', message: '此项是必填项' }],
      expirationDate: [{ required: true, trigger: 'blur', message: '此项是必填项' }],
    },
  },

12. 组件配置对象component

  • 此处的组件配置对象,主要用于searchOption.query(搜索的form-item)、formItemOption(弹窗的form-item)
  • 您也可以将elmentUI组件的属性配置到此对象,采用v-bind=“$attrs” elementUI属性同样生效
字段说明类型默认值是否必填
name组件类型名称stringel-input
spancol的span,总列24列number24
options部分组件的选项;如下拉框。多选框,单选框等组件array
show组件是否显示,可以是一个boolean,也可以是一个函数 ,函数有一个回调参数mode,如下所示为只在新增时才显示:show(mode){return mode==‘create’}Boolean \ Functiontrue
disabled是否禁用,用法同showBoolean \ Functionfalse
event事件,请参照下方示例object
props使用自定义组件时候,传递参数,查看示例object
on使用自定义组件时候的事件,查看示例object

示例
在这里插入图片描述

    category: {
      label: '商品分类',
      value:3,//默认值3
      component: {
        name: 'el-select', //组件类型
        span: 12,//占12格子
        clearable:true,//elementUI属性,同样生效
        event:{ //事件
          focus(e){
            console.log(e);
          },
          change(e){
            console.log("🚀 ~ file: options.js:134 ~ change ~ change:",e)
          }
        },
        options: [ //部分组件需要选项
          {
            label: '家电',
            value: 2
          },
          {
            label: '家具',
            value: 3
          },
          {
            label: '食物',
            value: 4
          },
        ]
      }
    },

13. button配置对象

针对的是配置对象下的create、edit、remove、multipleRemove按钮的配置

字段说明类型默认值是否必填
text按钮文案string
primary按钮类型string
size按钮尺寸string
circle原型按钮boolean
show按钮是否显示,可以是一个boolean,也可以是一个函数 ,函数有一个回调参数mode,如下所示为只在新增时才显示:show(mode){return mode==‘create’}Boolean \ Functiontrue
disabled是否禁用,用法同showBoolean \ Functionfalse

示例

edit:{
    text: '编辑', //按钮文字, null可以取消文案
    type: 'warning', // 按钮类型  可选值【primary / success / warning / danger / info / text】
    icon:'icon-edit', //按钮图标
    size: 'small', // 按钮大小
    circle: false,//圆形按钮 ,需要thin=true,且text=null
    show(mode){return mode=='create'}
    disabled:false, // 是否禁用
}

三、事件

提示:在dialog-before-open和before-edit执行时机是相同的,只是参数不一样,在此时机内部已经实现了表单重置,您无需手动重置;

事件说明参数
search搜索事件
search-reset搜索条件重置事件,内部会将分页的参数重置
save保存事件(包括新增和编辑)form为表单数据;mode为模式:create\edit
pagination-current-change分页currentPage改变事件 ,内部会更改分页的currentPage,您无需手动更改currentPage
pagination-size-change分页Size改变事件 ,内部会更改分页的pageSize,您无需手动更改pageSize
remove删除事件当前行数据
multiple-remove批量删除事件选中行数据
before-edit操作列点击编辑按钮之前的事件当前行数据row,和索引index
dialog-before-open弹窗打开之前的事件(包括新增和编辑),编辑模式下事件时机与before-edit一样,只是回调参数不一样当前模式mode
dialog-after-open操作列点击编辑按钮之后的事件当前模式mode
dialog-close弹窗关闭事件
search-item-change单个搜索条件change事件raw修改的项数据,field修改的键
form-item-change弹窗表单项change事件raw修改的项数据,field修改的键,mode当前模式

四、插槽

事件说明参数
toolbar工具栏插槽
beforeSave弹窗在【保存】按钮之前的插槽表单数据
afterSave弹窗在【保存】按钮之后的插槽表单数据

五、方法(重要)

内部通过计算属性挂载了一个 z 对象,你可以通过 t h i s . z对象,你可以通过this. z对象,你可以通过this.refs.zCrud.$z.xxx()来执行方法

方法说明参数返回值
getParam因为我们的配置对象是带组件信息的,不能用于参数传与后端,可以通过$z.getParam() 获取到正常的查询参数返回一个带分页数据,用于请求后端的数据
showLoading内部实现了开启loading的方法
hideLoading内部实现了关闭loading的方法
setFormItemData因为我们的表单配置对象是带组件信息的,可以通过$z.setFormItemData(res.data)转换成正常的表单对象需要传递一个后端返回的数据
resetPagination重置分页对象
resetFormItemOption重置表单对象,已经内部实现重置,基本上无需手动调用
getSelection获取表格勾选的数据,返回的是一个Promise

示例

  /**从后端获取列表数据 */
    async getList() {
      // 因为我们的配置对象是带组件信息的,不能用于参数传与后端,可以通过$z.getParam() 获取到正常的查询参数,
      //并且如果你开启了分页,那么分页参数也会带过来
      const param = this.$refs.zCrud.$z.getParam()
      //内置了一个开启loading的方法
      this.$refs.zCrud.$z.showLoading()
      // 参数与
      const res = await getList(param)
      //将数据给到data
      this.options.data = res.data.list
      //将分页总数给到分页对象
      this.options.paginationOption.total = res.data.total
      //内置了一个关闭loading的方法
      this.$refs.zCrud.$z.hideLoading()
    },

六、自定义组件的使用

无可厚非,项目中你肯定会用到非ElementUI的组件,那么zCrud久黔驴技穷了嘛?请看示例

假设我有一个封装好的验证码发送组件,这个组件也是支持v-mode绑定值的

那么你可以看下面的示例

在这里插入图片描述

import zCaptcha from '@/components/z-captcha'

  formItemOption: {
    code:{
      label:'验证码',
      component: {
        name: zCaptcha,
        span: 12,
        props:{
          placeholder:'请获取验证码'
        },
        on:{
          getCaptcha(){
            console.log('开始模拟请求后端的短信接口');
          }
        }
      }
    }
  }

七、源码地址

如果此项目对你有帮助,麻烦到github源码地址点个start

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue.js 3.x 提供了一种声明式的编程模型,非常适合构建用户界面。在 Vue 中进行增删查改(CRUD)操作主要涉及组件、数据绑定和方法调用。下面是Vue3中实现增删查改的基本步骤: 1. **增(Create)**: - 创建一个新的Vue实例时,可以通过`data()`或`setup()`方法定义一个数组来保存数据。 - 使用`v-model`或`ref`来双向绑定表单元素到数据数组中的对象。 - 当添加按钮被点击时,可以在`methods`中定义一个方法(如`addItem`),创建新的对象并推入数据数组。 ```javascript // 在setup()中定义数据 const items = ref([]); // 添加方法 methods: { addItem(newItem) { items.value.push({ ...newItem }); } } ``` - 在模板中使用`v-for`展示和编辑列表项。 2. **删(Delete)**: - 继续使用`items`数组,为每个列表项提供删除操作。 - 在`methods`中添加`deleteItem`方法,接收索引作为参数,然后从数组中移除该元素。 ```javascript methods: { deleteItem(index) { items.value.splice(index, 1); } } ``` - 使用`@click`监听删除按钮的点击事件,传入对应索引。 3. **查(Read)**: - 可直接通过`items`获取当前的数据列表。 - 在模板中使用`v-for`遍历显示列表内容。 4. **改(Update)**: - 类似于添加操作,只需更新数组中对应索引的对象即可。例如,`updateItem`方法接收索引和新的属性对象。 ```javascript methods: { updateItem(index, updatedItem) { items.value[index] = { ...items.value[index], ...updatedItem }; } } ``` - 更新按钮同样通过`@click`监听,传入索引和新值。 相关问题:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值