# grid 数据表格
带有分页栏的数据表格,集成了单选、多选、跨页选择等功能
v-grid
是基于 element-ui 的组合了 Table
、Pagination
以及 Loading
等组件的功能模块,各组件原生文档内容可访问以下位置
v-grid
完整继承 Table
的所有选项入参 props
、事件 event
、函数 methods
以及插槽 slot
等内容,并在此基础上增加业务常用功能封装,形成公司产品生态的标准化数据表格模块
# 安装
安装依赖
# 安装聚合包
npm i @plugins-core/main
# 安装独立功能库
npm i @plugins-core/grid
# 全局配置
import { post } from '@/config/settings/http'
// 聚合包
import { Grid } from '@plugins-core/main'
// 独立包
import Grid from '@plugins-core/grid'
// 全局安装 Grid 插件
Vue.use(Grid, {
http: (url, data) => {
return post(url, data)
}
})
实际上,在业务项目使用的数据结构与表格定义的标准数据结构不一致时,除了通过配置 model
与 format
prop 进行定制之外,也可以在此处进行全局安装并定义 http
函数时,对数据结构进行统一修改
关于 post
的内容可跳转至 HTTP 数据请求 位置查看
旧版包
import { post } from '@/config/settings/http'
import { Grid } from '@plugins/core'
// 全局安装 Grid 插件
Vue.use(Grid, {
http: (url, data) => {
return post(url, data)
}
})
# 属性(prop)
设置 Grid
的功能与可定制内容
# data 必填
- 类型:
object | string
数据表格的数据源指定,object
对象格式则为应用本地数据进行功能调试,数据格式应用 数据表格标准返回格式 位置中指定的数据格式 。
通常情况下,指定一个数据接口 url 为数据源,表格将会对指定位置进行数据请求,该数据接口返回的数据格式也应满足上述位置中指定的数据格式
# model @plugins-core 0.2.4+
- 类型:
object
- 默认:
Model
Model
的类型定义
{
node: 'grid',
totalRecords: 'total',
dataList: 'list'
}
该模型内容描述了根据 数据表格标准返回格式 中定义的接口数据返回格式的部分关键数据节点名称。设置该 prop
的作用在于可按需对旧项目的旧数据结构进行适配
Vue.use(Grid, {
model: {
node: 'gridResult',
totalRecords: 'totalRow',
dataList: 'lists'
},
http: (url, data) => { ... }
})
# height
- 类型:
string | number
设置表格区域的高度,通常情况下,表格会应用根据内容自适应高度,在部分对内容区域高度有要求的场景,可自定义设置,该参数的设置值可参考 element-ui
官方对该值的描述
Table 的高度,默认为自动高度。如果 height 为 number 类型,单位 px;如果 height 为 string 类型,则这个高度会设置为 Table 的 style.height 的值,Table 的高度会受控于外部样式
# index
- 类型:
boolean
- 默认:
false
显示序号列,该列显示了数据行的序号,该列与选择列(check)同时开启时,序号列则排在选择列之后
# check
- 类型:
boolean
- 默认:
false
设置表格是否显示选择列(复选框多选),true
为多选模式启用,在该模式下,可手动选择多个数据行进行业务处理。默认为 false
单选模式,则选择列不显示,但表格行依然响应选择事件
# params
- 类型:
object
传递到服务端的查询参数,可将自定义的业务参数以及查询表单的查询字段合并到该参数中
# format
- 类型:
function
自定义格式化返回的表格原始数据
应用场景
- 表格数据格式与标准格式不一致
- 表格返回的数据中包含有它元素需要提取
注意:此处返回的数据模型,需与 model
prop 中指定的模型一致,否则表格将无法解析数据
<template>
<v-grid :format="format" />
</template>
<script>
// 自定义内容处理类
import { getStateName } from './state'
export default {
methods: {
// data 值为接口返回的原始数据集
format (data) {
const { total, list } = data.grid
// 应用标准数据结构
return {
total: total,
list: list.map(val => {
// 此处仅举例将数据进行转换处理
val.stateStr = getStateName(val.state)
return val
})
}
}
}
}
</script>
如果使用了自定义数据结构,例如
{
model: {
node: 'gridResult',
totalRecords: 'totalRow',
dataList: 'results'
}
}
则格式化函数应返回
function format () {
return {
totalRow: 10,
results: [...]
}
}
# selected
- 类型:
array
初始化表格已选中的项目
# autoload
- 类型:
boolean
- 默认:
true
表格加载时,是否立即开始读取数据
例如:父子表格的场景,子表格的内容需取决于父表格选中的项目,在渲染后并不需要立即加载数据,此时可将子表格的 autoload
设置为 false
# crossPagePick
- 类型:
boolean
- 默认:
false
跨页选择数据,启用该功能后,picked-change
事件响应的数据将是所有选中的数据行,而非当前页面选中的数据行
依赖
该功能依赖于 check
prop 须设置为 true
# blankText
- 类型:
string
- 默认:
'暂无数据'
表格无数据时显示的提示文本
# pagination
- 类型:
boolean
- 默认:
true
是否使用分页栏
# currentPage
- 类型:
number
- 默认:
1
加载表格时,直接跳转至指定的页码
# pagerCount
- 类型:
number
- 默认:
7
分页栏中显示的页码个数
# pageLength
- 类型:
number
- 默认:
10
每页加载的记录数
# pageLengthList
- 类型:
number[]
- 默认:
[10, 20, 50, 100, 200]
每页显示记录数列表
# paginationLayout
- 类型:
string
- 默认:
->, sizes, slot, prev, pager, next
# hidePaginationWhenNoData
- 类型:
boolean
- 默认:
true
表格无数据时,自动隐藏分页栏
# loadingTransition
- 类型:
boolean
- 默认:
true
使用 loading 动画过渡表格数据加载
# loadingOverlay
- 类型:
boolean
- 默认:
true
表格数据加载过程显示覆盖整个表格的遮罩,阻止多余操作
# 可全局设置的 prop
- blankText
- pageLength
- pageLengthList
- model
// 全局设置样例
Vue.use(Grid, {
blankText: '您的角色无相关数据',
pageLength: 30,
http: (url, data) => { ... }
})
# 函数(method)
函数需要通过定义 ref
来获得 v-grid
的组件对象引用,再访问相关函数
<template>
<div>
<button type="button" @click="reload">查询表格</button>
<v-grid ref="grid" />
</div>
</template>
<script>
export default {
methods: {
reload () {
this.$refs.grid.reload()
}
}
}
</script>
# grid
获得表格原生实例,使用返回的对象即可调用 element table
原生函数
grid(): object
函数使用示例
{
methods: {
doSomething () {
// 获得 element-ui table 原生对象
const grid = this.$refs.grid.grid()
// 调用 element-ui table 原生函数 setCurrentRow
grid.setCurrentRow({ row-data })
}
}
}
# page
获得表格中的分页栏原生实例,使用返回的对象即可调用 element pagination
原生函数,使用方式类同 grid
函数
page(): object
# reload
刷新表格、使用新的查询条件查询表格
reload(): void
函数使用示例
<template>
<div>
年度:<input type="text" v-model="searchParams.year">
<button type="button" @click="search">查询表格</button>
<v-grid ref="grid" :params="searchParams"></v-grid>
</div>
</template>
<script>
export default {
data () {
return {
searchParams: {
// 设置默认年度为当前年度
year: new Date().getFullYear().toString()
}
}
},
methods: {
search () {
// 表格数据查询前对数据进行处理
if (!this.searchParams.year) {
this.searchParams.year = new Date().getFullYear().toString()
}
// 处理好查询参数后,刷新表格当前页
this.$refs.grid.reload()
}
}
}
</script>
# clearSelection
清除表格选中的行
clearSelection(row: object): void
在绝大多数情况下,调用该函数可清除所有选中的行
在多选模式下,调用函数且传递行数据时(行的原始数据),则仅清除指定行的选中状态
# clearGrid
完全重置表格,清除表格数据
clearGrid(): void
# 事件(event)
数据表格的响应事件,在 v-grid
上可直接使用 element-ui
的 table
组件的所有原生事件,文中列出的是 v-grid
表格插件定制化的事件
<template>
<div>
<!--
done 是 v-grid 自定义的事件
row-click 是 element-ui table 组件的原生行点击事件
-->
<v-grid
@done="loaded"
@row-click="rowClick"
>
</v-grid>
</div>
</template>
<script>
export default {
methods: {
loaded (data) {
...
},
rowClick (row, column, event) {
...
}
}
}
</script>
# picked-change
行选中结果发生变化时触发的事件,返回的 data
入参为已选中行的原始数据
'picked-change'(data: object[]): void
# done
表格数据加载完成后触发的事件,返回的 data
入参为当前分页相关信息,数据格式如下
done(data: PageInfo): void
interface PageInfo {
pageNumber: number
pageSize: number
totalRow: number
}
# loading-change
响应表格 loading
状态的事件
'loading-change'(data: boolean): void
# 插槽(slot)
可自定义内容的插槽位置
# no-data
自定义表格无数据时的提示内容
提示
组件已默认集成了无数据提示的处理流程,通常情况下,初始化表格不加载数据(autoload
: false)与使用 clearGrid
函数重置表格后等场景仅显示空白表格,在进行数据加载后且无数据的情况下,显示出无数据的提示与图标
也就是无数据提示仅与数据加载行为关联,其他状态下展示空表格
需要注意的是:若自定义了该插槽,则失去了上述控制逻辑
插槽使用示例
<template>
<v-grid>
<!--
也可以使用缩写
<template #no-data>
-->
<template v-slot:no-data>
<div>暂时没有相关的数据</div>
</template>
</v-grid>
</template>
# footer
分页栏左侧空白区域插槽
<template>
<v-grid>
<template v-slot:footer>
<div>自定义内容</div>
</template>
</v-grid>
</template>
# loading
通常应用于自定义 loading 过渡的插槽。实际上它只是提供了一个位于 v-grid
根节点下的元素插槽,可以适用于制作全表格覆盖的遮罩(使用绝对布局)或是在分页栏以下扩展的内容区域
以下是一个自定义 loading 内容的应用实例
<template>
<v-grid
:loading-transition="false"
@loading-change="loadingChange"
>
<template v-slot:loading>
<!-- 设置绝对定位,并覆盖全表格 -->
<div
style="position: absolute;top: 0;left: 0;bottom: 0;right: 0;"
v-if="loading"
>
自定义 loading 内容
</div>
</template>
</v-grid>
</template>
<script>
export default {
data () {
return {
loading: false
}
},
methods: {
loadingChange (val) {
this.loading = val
}
}
}
</script>
实例中通过设置 loading-transition
prop 关闭内置的 loading 动画效果,并应用了 loading-change 事件响应的 loading
状态来控制自定义内容的显示,使功能应用逻辑完整