# 通用列表 UniList
ElTable 的二次封装
通过配置提供分页,请求,筛选按钮,操作按钮,表单生成等功能
你应该使用本组件
- 需求为用于显示数据的普通列表
- 有通用的请求方式
- 有比较固定的表结构
你不应该使用本组件
- 需求有树状结构,多级表头,排序,合并行等的复杂列表
- 请求方式与其他页面不通用
- 表结构需要频繁更改
# 基础显示
# schema 属性描述表结构
schema 属性允许你定义表结构,覆盖表样式,每一个 UniList 组件都应首先定义 schema
- 1
schema 属性每一项的 value 被绑定到了对应的 el-table-column 组件,所以你也可以使用这些属性来自定义列样式:
| 参数 | 说明 | 类型 | 可选值 | 默认值 |
|---|---|---|---|---|
| label | 显示的标题 | string | — | — |
| width | 对应列的宽度 | string | — | — |
| min-width | 对应列的最小宽度,与 width 的区别是 width 是固定的,min-width 会把剩余宽度按比例分配给设置了 min-width 的列 | string | — | 150 |
| formatter | 用来格式化内容 | Function({row, column, value, $index}) | — | — |
| align | 对齐方式 | String | left/center/right | center |
| class-name | 列的 className | string | — | — |
例外
为了使用方便,formatter类型与 element 不同,为Function({row, column, value, $index})
使用时:
schema = {
//错误
foo:{
formatter:(row,column,cellValue)=>{ console.log(cellValue,row) }
}
//正确
bar:{
formatter:({value,row})=>{ console.log(value,row) }
}
//正确
baz:{
formatter:({row,$index})=>{ console.log(row,$index) }
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
- 1
# 使用插槽定制列元素
聪明的你可能会问,表格中的图片或更复杂的东西怎么显示呢
不用怕,我们用保留了定制列的能力
- 1
# 重写配置
不同的项目中可能需要完全不一样的请求,刷新,操作逻辑和样式
我们提供了两种覆盖配置的方式
# 全局配置策略
使用方法:直接修改自定义配置文件 UniList/custom.ts 中的方法和成员
提示
首次使用本组件时,你应该修改 UniList/custom.ts 配置文件中的 fetch 方法以适配当前项目的请求方式
import { Component } from "vue-property-decorator";
import Base from "./base";
//类语法 我已经替你写好了,你只需要改这个类里面的方法
@Component({})
export default class extends Base {
//其他配置...
/**
* 例1
* 列样式
* 可以被schema中的value覆盖
*/
columnStyle = {
align: "center", // 默认对齐
minWidth: "150", // 默认最小宽度
};
/**
* 例2
* 这是本页面示例中的 fetch 方法
* 延时并返回模拟数据
* 可以在init中覆盖
* 更多信息请查看 UniList/custom.ts
*/
async fetch() {
//在这里你也可以通过this.api获得接口标记,并做出相关处理
const formData = { ...this.pages, ...this.params };
const total = 31;
const data = [];
for (let i = 1; i <= total; i++) {
data.push({
id: i,
title: "title" + i,
name: "王小虎",
address: `上海市普陀区金沙江路 ${1517 + i} 弄`,
content: "text" + i,
});
}
return new Promise<any>((R) =>
setTimeout(
() =>
R({
pages: { current: formData.current, total },
data: data.slice(
(formData.current - 1) * formData.size,
formData.current * formData.size
),
}),
500
)
);
}
//其他配置...
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# 单组件配置策略
使用方法:初始化时返回构造配置对象
- 1
# 数据流向
有两种方式为本组件提供数据,
# api 属性注入请求标记 通用
注意
api 属性仅仅是一个标记,理论上来说你可以传入任何值,具体实现要由 fetch 方法实现
例:
| api 属性传入 | fetch 中实现 | 备注 |
|---|---|---|
'/user/list' | axios.post(this.api, data) | 传入地址直接引入 axios 发出请求 |
'userList' | app.post[this.api](data) | 传入某个方法名并由自定义的 app.post 类集中控制发出请求 |
# data 属性接管表格数据 慎用
注意
当你使用了 data 属性,fetch 方法将失效,所有数据流都需要由外部接管
- 1
- 1
# 按钮和内容的依赖注入
前置知识学完,终于可以向你介绍本组件最为强大的功能:依赖注入
依赖可以是你的按钮,文本,表单,自定义组件或者其他
- 1
# 按钮注入能力
你可以在 init 函数的返回对象中定义 action 或 header 对象,其中的每一项都会生成对应的按钮
| Action | Header | |
|---|---|---|
| 位置 | 表格上方 | 表格中每一行右侧 |
| 配置语法 | action 对象{按钮名字:触发方法} | header 对象{按钮名字:触发方法} |
| 方法接收参数 | {row, column, value, $index} | 已选行数组(仅在多选模式生效) |
| 一般用于 | 当前行的编辑,删除,详情 | 当前列表的添加,导入,下载,批量删除(开启多选模式) |
| 修改样式 | 使用 actionStyle 对象 | 使用 headerStyle 对象 |
actionStyle 和 headerStyle 对象中,key 值是正则字符串,value 是一个对象,其中的值会被绑定到 el-button 组件上 action 和 header 对象中每一项的 value 值除了可以传一个函数作为触发方法外,你也可以传递完整的配置属性用于更复杂的判断:
| 参数 | 说明 | 类型 |
|---|---|---|
| fn() | 按钮点击事的触发方法 | Function=>void |
| show() | 返回一个布尔值,当前按钮是否显示 | Function=>boolean |
| size | 尺寸 | medium / small / mini |
| type | 类型 | primary / success / warning / danger / info |
| plain | 是否朴素按钮 | boolean |
| icon | 图标类名 | string |
fn 和 show 方法都接收一个参数:{row, column, value, $index}(action 时)或已选行数组(header 并开启多选模式时)
- 1
# 文本,表单,自定义组件注入能力
通俗的来讲,我们为每个 UniList 组件内置了弹窗和浮层的调用接口,也就是 UniList 实例中的 view 和 dialog 方法
- 它们接收 同样 的 option 参数,用于向其中注入文本,表单和自定义组件
- 你可以通过 refs 或者 init 函数的第一个参数取得 UniList 的实例
- 它们均返回标准 Promise 对象,这意味着你可以使用
.then或await运算符取得文本,表单和自定义组件的返回值
| 参数 | 说明 | 类型 |
|---|---|---|
| title | 标题,留空默认为按钮的名字 | string |
| text 三选一 | 注入文本 | string |
| form 三选一 | 注入表单json,需要通过表单生成器 (opens new window)生成 | jsonObject |
| component 三选一 | 注入组件,可以直接传全局组件的名字,或者直接传组件 | string | VueComponent |
| data 表单 | 将数据传入表单中,一般用于编辑时。 | Record<string,any> |
| use 表单 | 用 UniCell 替换表单中某些字段,详见 UniCell | object |
| props 组件 | 组件的绑定属性 | Record<string,any> |
- 如果你注入了组件,除了传进去的 props, 你还可以在组件 props 中接收到
close(关闭本 view 或 dialog) 和resolve(关闭并回传数据)两个函数,resolve 方法中传入的第一个参数会在 view 或 dialog 方法的 then 中接收到,直接关闭则不执行 then
- 1
# 筛选功能和 UniCell 通用表单管理器
UniList 组件支持内建的筛选功能,使用了一种全新的模式。
你可能已经使用过我上面说的表单生成器 (opens new window)了,但他针对一种常见情况却无从下手
以角色管理列表举例,你需要在添加或编辑角色时提供可用的权限,那么你得先使用接口获取相应权限数据,再渲染到下拉选择框中。
但表单生成器提供的下拉选择框没有你需要的数据
那么有没有一种方法可以让你既享受到生成器的快感,又保留自己自由定制表单的能力?
请使用 UniCell™ 通用表单管理器
我敢打赌你会喜欢这种由策略模式驱动的表单的,它会让你的表单复用率达到最高,并且永远易于管理,易于移植
提示
在我们继续之前,请先阅读 UniCell™ 通用表单管理器的文档
UniList 组件中对 UniCell 和表单生成器进行了深层次的兼容,甚至会根据表单 label 自动绑定字段名
# 筛选
和 UniCell 一样,你需要在组件上写入要调用执行的策略,其中的值将会绑定到 UniList 组件实例的 params 变量中
这样在 custom.ts 的 fetch 方法中你可以使用this.params得到筛选表单的记录。
- 1
# 替换表单
回到最初的问题,当我们使用表单生成器时该如何使用自定义的表单呢?
- 1
← 快速上手 通用表单管理器 UniCell →