vue-pro-table:包含搜索/列表/分页的页面级组件

vue-pro-table:包含搜索/列表/分页的页面级组件vue-pro-table一个基于 ElementUI 封装的 table 列表页组件,将包含搜索、列表、分页等功能的页面封装成一个组件特性•将

vue-pro-table

一个基于 ElementUI 封装的 table 列表页组件,将包含搜索、列表、分页等功能的页面封装成一个组件

特性

•将搜索、列表、分页三者的交互逻辑封装到组件中,节省开发者代码量

•配置化的请求函数,自动发送请求,自动获取请求参数,自动显示 loading 效果

•配置化的表格项,跟 el-table-column 的配置属性类似

•配置化的搜索表单,支持大部分表单元素

•配置化的分页,跟 el-pagination 的配置属性类似

•自定义是否显示搜索和分页

•自定义标题栏和工具栏

•丰富的插槽提供功能扩展

使用

安装和引入

安装

// npm
npm install vue-pro-table
// yarn
yarn add vue-pro-table

引入

该组件依赖 element-ui,需要自行引入

import ElementUI from “element-ui”;
import “element-ui/lib/theme-chalk/index.css”;
Vue.use(ElementUI);

// 引入vue-pro-table
import VueProTable from "vue-pro-table";
Vue.use(VueProTable);

快速使用

<template>
  <vue-pro-table title="列表" :request="getList" :columns="columns">
    <template #operate="scope">
      <el-button size="mini" type="primary">编辑</el-button>
      <el-button size="mini" type="danger">删除</el-button>
    </template>
  </vue-pro-table>
</template>

<script>
import {getUserList} from 'src/api/xxx';
export default {
  data() {
    // 表格列配置,大部分属性跟el-table-column配置一样
    columns: [
      { label: '序号', type: 'index' },
      { label: '名称', prop: 'nickName', width: 180 },
      { label: '邮箱', prop: 'userEmail' },
      {
        label: '操作',
        fixed: 'right',
        width: 180,
        align: 'center',
        tdSlot: 'operate', // 自定义单元格内容的插槽名称
      },
    ],
  },
  methods: {
    // 请求函数
    async getList(params) {
      // params是从组件接收的,包含分页和搜索字段。
      const { data } = await getUserList(params)

      // 必须要返回一个对象,包含data数组和total总数
      return {
        data: data.list,
        total: +data.total,
      }
    },
  }
}
</script>

预览效果

默认不包含搜索表单

vue-pro-table:包含搜索/列表/分页的页面级组件

请求函数配置

•request,请求列表数据的函数

组件加载的时候会自动执行 request 函数,并在加载过程中显示 loading 效果

  • 函数接收参数:包含搜索表单的所有字段和分页的 pageNum 和 pageSize
  • 函数必须返回一个对象,包含:

• data: 列表数据的数组

• total:总数,用于分页

表格配置

•columns 属性的配置,是一个数组

参数

说明

类型

可选值

默认值

label

对应 el-table-column 的 label

string

type

对应 el-table-column 的 type

string

selection/index/expand

prop

对应 el-table-column 的 prop

string

width

对应 el-table-column 的 width

string,number

minWidth

对应 el-table-column 的 min-width

string,number

align

对应 el-table-column 的 align

string

left/center/right

left

fixed

对应 el-table-column 的 fixed

string, boolean

true, left, right

sortable

对应 el-table-column 的 sortable

boolean

false/true

false

filters

对应 el-table-column 的 filters

Array[{ text, value }]

tdSlot

单元格要自定义内容时,可以通过此属性配置一个插槽名称,并且是作用域插槽,可以接收 scope 数据

string

labelSlot

表头要自定义内容时,可以通过此属性配置一个插槽名称,并且是作用域插槽,可以接收 scope 数据

string

•row-key 属性配置

对应 el-table 的 row-key,默认值是’id’

搜索配置

•search 属性的配置,是一个对象

如果不想显示搜索表单,可以不配置 search 或者 search 设置为 false

参数

说明

类型

可选值

默认值

labelWidth

label 文字长度

string

inputWidth

表单项长度

string

fields

表单字段列表,包含 text,select,radio,checkbox,datetime 等类型,所有字段类型配置见下表

Array[{字段类型}]

•fields 列表的字段类型配置

参数

说明

类型

可选值

默认值

type

字段类型

string

text,textarea,select,radio,radio-button,checkbox,checkbox-button,number,date,daterange,datetime,datetimerange

text

label

label 文本

string

name

搜索时的提交的参数名称

string

style

额外的样式

object

defaultValue

默认值

options

当 type 是 select,radio,radio-button,checkbox,checkbox-button 时的枚举选项

Array[{name, value}]

transform

搜索前对表单数据进行转换,比如表单数据是数组,但是搜索的时候需要传递字符串。它是一个函数,默认参数是字段的 value,需要返回转换后的结果

function(value)

trueNames

当 type 是 daterange,datetimerange 时,开始时间和结束时间是在一个数组里面,但是搜索时可能需要两个字段,这时就需要把开始时间和结束时间分别赋值给两个字段,这两个字段的名称就是通过 trueNames 配置,它是一个数组,例如:trueNames: [‘startTime’, ‘endTime’]

Array[string]

min

当 type 是 number 时的最小值

number

max

当 type 是 number 时的最大值

number

分页配置

pagination 属性的配置,是一个对象

如果不想显示分页,将 pagination 设置为 false

参数

说明

类型

可选值

默认值

layout

组件布局

string

total, sizes, prev, pager, next, jumper

total, sizes, prev, pager, next, jumper

pageSize

每页显示条目个数

number

10

pageSizes

每页显示个数选择器的选项设置

Array[number]

[10, 20, 30, 40, 50, 100]

标题栏配置

表格上方有一个标题栏,标题栏左侧显示一个标题,右侧是一个可自定义的工具栏

•hide-title-bar

是否隐藏标题栏,布尔值

•title

表格标题

•自定义表格标题

提供一个具名插槽title,来自定义标题的内容

•工具栏

工具栏默认是空的,提供一个具名插槽 toolbar,来自定义工具栏的内容

事件

•selectionChange

如果columns中配置了type为selection的列,可以通过该事件得到已选择的行,参数是一个数组

组件内部方法

•refresh

配置 ref 属性,可以通过 ref 获取组件后调用组件内部的refresh方法刷新列表

完整用法

<template>
  <vue-pro-table
    ref="proTable"
    title="用户列表"
    :request="getList"
    :columns="columns"
    :search="searchConfig"
    :pagination="paginationConfig"
    @selectionChange="handleSelectionChange"
  >
      <!-- 工具栏 -->
      <template #toolbar>
        <el-button
          type="primary"
          icon="el-icon-plus"
          @click="$router.push({name: 'userAdd'})"
        >创建账号</el-button>
        <el-button
          type="danger"
          icon="el-icon-refresh"
          @click="$refs.pageBox.refresh()"
        >刷新</el-button>
      </template>

      <!-- 展开行 -->
      <template #expand="{row}">
        {{row.userEmail}}
      </template>

      <!-- 状态 -->
      <template #status="{row}">
        <el-tag :type="+row.status === 1 ? 'success' : 'info'">{{+row.status === 1 ? '启用' : '停用'}}</el-tag>
      </template>

      <!-- 表格操作栏 -->
      <template #page-operate="{row}">

        <el-button
          type="text"
          @click="$router.push({name: 'userEdit', params: {
                id: row.id
              }})"
        >编辑</el-button>

        <el-button
          v-if="+row.status === 1"
          type="text"
          @click="setUserStatus(row, 0)"
        >停用</el-button>

        <el-button
          v-else
          type="text"
          @click="setUserStatus(row, 1)"
        >启用</el-button>

      </template>

      <!-- 操作栏头部 -->
      <template #th-operate>
        <el-input />
      </template>

  </vue-pro-table>
</template>

<script>
import {getUserList} from 'src/api/xxx';
export default {
  data() {
    // 表格列配置,大部分属性跟el-table-column配置一样
    columns: [
        { label: '', type: 'expand', tdSlot: 'expand' },
        { label: '全选', type: 'selection' },
        { label: '序号', type: 'index' },
        { label: '账户名称', prop: 'nickName', sortable: true },
        { label: '账号', prop: 'userEmail', width: 80 },
        {
          label: '状态',
          prop: 'status',
          tdSlot: 'status',
          filters: [
            { text: '启用', value: 1 },
            { text: '禁用', value: 0 },
          ],
        },
        { label: '创建时间', prop: 'createTime', align: 'right' },
        { label: '最后修改时间', prop: 'updateTime' },
        {
          label: '操作',
          labelSlot: 'th-operate',
          fixed: 'right',
          width: 180,
          align: 'center',
          tdSlot: 'page-operate',
        },
    ],
    // 搜索配置
    searchConfig: {
        labelWidth: '90px',
        inputWidth: '360px',
        fields: [
          {
            type: 'text',
            label: '账户名称',
            name: 'nickName',
            defaultValue: 'abc',
          },
          {
            type: 'textarea',
            label: '描述',
            name: 'description',
          },
          {
            label: '状态',
            name: 'status',
            type: 'select',
            defaultValue: 1,
            options: [
              {
                name: '已发布',
                value: 1,
              },
              {
                name: '未发布',
                value: 0,
              },
            ],
          },
          {
            label: '性别',
            name: 'sex',
            type: 'radio',
            options: [
              {
                name: '男',
                value: 1,
              },
              {
                name: '女',
                value: 0,
              },
            ],
          },
          {
            label: '城市',
            name: 'city',
            type: 'radio-button',
            options: [
              {
                name: '北京',
                value: 'bj',
              },
              {
                name: '上海',
                value: 'sh',
              },
              {
                name: '广州',
                value: 'gz',
              },
              {
                name: '深圳',
                value: 'sz',
              },
            ],
          },
          {
            label: '爱好',
            name: 'hobby',
            type: 'checkbox',
            defaultValue: ['吃饭'],
            options: [
              {
                name: '吃饭',
                value: '吃饭',
              },
              {
                name: '睡觉',
                value: '睡觉',
              },
              {
                name: '打豆豆',
                value: '打豆豆',
              },
            ],
            transform: (val) => val.join(','),
          },
          {
            label: '水果',
            name: 'fruit',
            type: 'checkbox-button',
            options: [
              {
                name: '苹果',
                value: '苹果',
              },
              {
                name: '香蕉',
                value: '香蕉',
              },
              {
                name: '橘子',
                value: '橘子',
              },
              {
                name: '葡萄',
                value: '葡萄',
              },
            ],
            transform: (val) => val.join(','),
          },
          {
            label: '日期',
            name: 'date',
            type: 'date',
          },
          {
            label: '时间',
            name: 'datetime',
            type: 'datetime',
            defaultValue: '2020-10-10 8:00:00',
          },
          {
            label: '日期范围',
            name: 'daterange',
            type: 'daterange',
            trueNames: ['startDate', 'endDate'],
            style: { width: '360px' },
          },
          {
            label: '时间范围',
            name: 'datetimerange',
            type: 'datetimerange',
            trueNames: ['startTime', 'endTime'],
            style: { width: '360px' },
            defaultValue: ['2020-10-10 9:00:00', '2020-10-11 18:30:00'],
          },
          {
            label: '数量',
            name: 'num',
            type: 'number',
            min: 0,
            max: 10,
          },
        ],
    },
    // 分页配置
    paginationConfig: {
      layout: 'total, prev, pager, next, sizes', // 分页组件显示哪些功能
      pageSize: 5, // 每页条数
      pageSizes: [5, 10, 20, 50],
    }
  },
  methods: {
    // 请求函数
    async getList(params) {
      // params是从组件接收的,包含分页和搜索字段。
      const { data } = await getUserList(params)

      // 必须要返回一个对象,包含data数组和total总数
      return {
        data: data.list,
        total: +data.total,
      }
    },
    // 选择
    handleSelectionChange(arr) {
      console.log(arr)
    },
  }
}
</script>

效果:

vue-pro-table:包含搜索/列表/分页的页面级组件

今天的文章vue-pro-table:包含搜索/列表/分页的页面级组件分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/7763.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注