4、万能表格.md 14.5 KB
Newer Older
VK1688's avatar
初始  
VK1688 已提交
1 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
## 万能表格

### 核心思想:通过 JSON 配置渲染规则

### 基础用法
```html
<vk-data-table :data="table1.data" :columns="table1.columns"></vk-data-table>
```
```js
export default {
  data() {
    // 页面数据变量
    return {
      table1:{
        // 表格数据
        data:[],
        // 表格字段显示规则
        columns:[
          { key:"_id" , title:"用户ID" , type:"text" , width:200 },
          { key:"username" , title:"用户名" , type:"text" , width:200 },
          { key:"nickname" , title:"用户昵称" , type:"text" , width:200 },
          { key:"mobile" , title:"手机号" , type:"text" , width:200 },
          { key:"comment" , title:"备注" , type:"text" , minWidth:200 },
        ]
      }
    };
  }
};
```

### 进阶用法

### 请直接看示例文件 `/pages_template/components/table/table-easy`

## API

### 属性

| 参数             | 说明                           | 类型    | 默认值  | 可选值 |
|------------------|-------------------------------|---------|--------|-------|
| action           | 动态模式 - vk框架下的云函数地址            | String | 无      | - |
| auto-action       | 动态模式 - 是否组件加载完毕后自动运行action | Boolean  | 无 | -  |
| query-form-param   | 动态模式 - 请求参数(表格查询参数) | Object  | {} | -  |
VK1688's avatar
1.2.2  
VK1688 已提交
44
| dataPreprocess          | 动态模式 - 云函数返回的数据进行预处理 | function(list)  | - | -  |
VK1688's avatar
初始  
VK1688 已提交
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| data             | 静态模式 - 列表数据 | Array  | 无 | -  |
| total            | 静态模式 - 总记录数 | Number  | 无 | -  |
| columns          | 通用 - 字段显示规则 | Array  | [] | 看下方详细说明  |
| height           | 通用 - table的高度 | Number  | 无 | -  |
| max-height        | 通用 - table的最大高度 | Number  | 无 | -  |
| row-height        | 通用 - 行高 | Number  | 无 | -  |
| top          | 通用 - margin-top的高度 | Number  | 10 | -  |
| selection          | 通用 - 显示多选框 | Boolean  | false | true |
| rowNo          | 通用 - 显示序号 | Boolean  | false | true |
| pagination     | 通用 - 显示分页器 | Boolean  | false | true |
| page-size       | 通用 - 每页显示数量 | Number  | 10 | - |
| page-sizes      | 通用 - 每页显示数量选择列表 | Array  | [1, 5, 10, 20, 50, 100, 1000] | - |
| right-btns      | 通用 - 右侧显示的按钮列表 | Array  | [] | 看下方详细说明 |
| right-btns-type      | 通用 - 右侧显示的按钮列表 | String  | "button" | "text" |
| right-btns-more      | 通用 - 右侧更多按钮 | Array  | [] | 看下方详细说明 |
| custom-right-btns      | 通用 - 自定义右侧按钮 | Array  | [] | 看下方详细说明 |
| row-key      | 通用 - 行数据的 Key | Function,String  | "_id" | - |
| empty-text      | 通用 - 空数据时显示的文本内容 | String  | "暂无数据" | - |
| default-expand-all      | 通用 - 是否默认展开所有行,当 Table 包含展开行存在或者为树形表格时有效 | Boolean  | false | true |
| tree-props      | 通用 - 渲染嵌套数据的配置选项 | Object  | {children: 'children', hasChildren: 'hasChildren'} | - |
| border     | 通用 - 是否带有纵向边框 | Boolean  | false | true |
| stripe     | 通用 - 是否为斑马纹 | Boolean  | false | true |
| size     | 通用 - Table 的尺寸 | String  | 无 | medium / small / mini |
| show-header     | 通用 - 是否显示表头 | Boolean  | true | false |
| highlight-current-row     | 通用 - 是否要高亮当前行 | Boolean  | true | false |
| detail-dialog-width     | 通用 - 详情弹窗的宽度 | Number,String  | "830px" | - |
| multiple     | 通用 - 可多选 |Boolean  | true | false |
VK1688's avatar
1.1.4  
VK1688 已提交
72
| default-sort     | 默认排序规则 |Object  | - | - |
VK1688's avatar
初始  
VK1688 已提交
73

VK1688's avatar
1.1.4  
VK1688 已提交
74 75 76 77 78
#### default-sort 详情
| 参数             | 说明                           | 类型    | 默认值  | 可选值 |
|------------------|-------------------------------|---------|--------|-------|
| name           | 需要排序的字段名            | String | -      | - |
| type           | 排序类型            | String | asc(升序)  | desc(降序) |
VK1688's avatar
初始  
VK1688 已提交
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109

### 事件

| 事件名   | 说明                    | 回调参数 |
|----------|------------------------|------|
| selection-change     | 多选框状态发生变化时   |  rows  |
| current-change    | 点击(高亮)某一行          |  row    |
| row-click | 单击某一行 |   row, column, event  |
| row-dblclick  | 双击某一行 |    row, column, event     |
| row-contextmenu | 鼠标右键某一行 |   row, column, event  |
| cell-click | 单击某一个单元格 |    row, column, cell, event     |
| cell-dblclick | 双击某一个单元格 |    row, column, cell, event     |
| header-click | 某一列的表头被点击时 |    column, event     |
| header-contextmenu | 某一列的表头被鼠标右键点击时 |    row, btn    |
| custom-right-btns | 自定义右侧按钮点击事件 |    column, event     |
| 其他 | 其他element自带的事件大部分也支持 |    -     |


### 方法

#### 通过 this.$refs.table1.xxx(); 方式调用
| 方法名   | 说明                    |
|----------|------------------------|
| refresh     | 刷新 |
| search     | 查询(搜索) |
| getCurrentRow     | 获取当前选中的行的数据 |
| getTableData     | 获取整个表格数据 |
| getMultipleSelection     | 获取多选框的数据 |
| showDetail     | 显示详情页 |
| closeDetailInfoDialog     | 关闭详情页 |
| exportExcel     | 导出xls表格文件 |
VK1688's avatar
1.0.7  
VK1688 已提交
110 111 112
| deleteRows     | 删除指定的行(不删数据库数据) |
| updateRows     | 更新指定的行数据(不更新据库数据) |

VK1688's avatar
1.1.8  
VK1688 已提交
113
#### 删除指定的行(不删数据库数据)
VK1688's avatar
1.0.7  
VK1688 已提交
114 115 116 117 118 119 120
```js
that.$refs.table1.deleteRows({
  ids:["60acf6248a69dc00018d8520"],
  success:function(){
    
  }
});
VK1688's avatar
1.1.8  
VK1688 已提交
121 122 123
```
#### 更新指定的行数据(不更新据库数据)
```js
VK1688's avatar
1.0.7  
VK1688 已提交
124 125 126 127 128 129 130 131 132 133
that.$refs.table1.updateRows({
  mode:"update", // update 局部字段更新 set 覆盖字段更新
  rows:[
    { _id:"60acf6248a69dc00018d8520", remark:"被修改了", money:10000 }
  ],
  success:function(){
    
  }
});
```
VK1688's avatar
初始  
VK1688 已提交
134

VK1688's avatar
1.1.8  
VK1688 已提交
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
#### 导出表格显示的数据
```js
that.$refs.table1.exportExcel();
```
#### 自定义导出表格数据
```js
that.$refs.table1.exportExcel({
  fileName : "表格数据",
  original : false,
  columns: [
    { key:"_id", title:"id", type:"text" },
    { key:"money", title:"金额", type:"money" },
  ]
});
```
VK1688's avatar
1.2.0  
VK1688 已提交
150 151 152 153 154 155 156 157 158 159 160 161 162 163
#### 导出自定义数据
```js
that.$refs.table1.exportExcel({
  fileName:"文件名称",
  data:[
    { a:1,b:2},
    { a:11,b:22}
  ],
  columns:[
    { key:"a", title:"标题a", type:"text" },
    { key:"b", title:"标题b", type:"text" },
  ]
});
```
VK1688's avatar
1.1.8  
VK1688 已提交
164

VK1688's avatar
1.2.0  
VK1688 已提交
165
        
VK1688's avatar
初始  
VK1688 已提交
166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
### 插槽
#### columns中的每一个key都是插槽的名称
#### 如重写`gender`字段的渲染
```html
<template  v-slot:gender="{ row, column, index }">
  <view>{{ row.gender }}</view>
</template>

```

### 详细说明

#### columns是一个数组,数组内每个元素有以下属性

| 参数   | 说明       | 类型    | 默认值  | 可选值 |
|------- |-----------|---------|-------|-------|
| key    |   键名    | String  | 无    | - |
| title  |   标题    | String  | 无    | -  |
| type   |   类型    | String  | 无    | 见下方详情  |
| width  |   宽度    | Number  | 无    | -  |
| minWidth  | 最小宽度(设置此值会自动填充宽度) | Number  | 无    | -  |
| alignt  |  对其方式 | String  | center    | left 、right  |
| headerAlign  |  表头对其方式 | String  | center    | left 、right  |
| sortable  |  是否是排序字段 | String  | custom  | true 、false  |
| fixed  | 列是否固定在左侧或者右侧,true 表示固定在左侧 | string, boolean  | 无  | true、left、right  |
VK1688's avatar
1.2.0  
VK1688 已提交
191
| show  | 显示规则,当为"detail" 代表只在详情弹窗时显示,"row" 代表只在表格内显示,"none" 代表均不显示 | string 、 array | ["detail","row"]  | "detail"、"row"、"none"  |
VK1688's avatar
初始  
VK1688 已提交
192
| defaultValue  |   默认值  | String  | 无  | -  |
VK1688's avatar
1.1.3  
VK1688 已提交
193
| formatter  | 自定义格式化函数 | function(val, row, column, index)  | -  | -  |
VK1688's avatar
初始  
VK1688 已提交
194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211

#### type类型
```js
table1:{
  columns:[
    { key: "nickname", title: "昵称", type: "text", width: 120, defaultValue:"未设置昵称", },
    { key: "avatar", title: "头像", type: "avatar", width: 80 },
    { key: "images", title: "图片", type: "image", width: 120 },
    { key: "rate", title: "评分", type: "rate", width: 120 },
    { key: "switch", title: "开关", type: "switch", width: 120 },
    { key: "icon", title: "图标", type: "icon", width: 120 },
    { 
      key: "type", title: "类型", type: "tag", width: 120, size: "mini",
      data:[
        { value:1, label:"收入", tagType:"success" },
        { value:2, label:"支出", tagType:"danger" }
      ]
    },
VK1688's avatar
1.1.3  
VK1688 已提交
212
    { key: "_add_time", title: "添加时间", type: "time", width: 160, valueFormat:"yyyy-MM-dd hh:mm:ss" },
VK1688's avatar
初始  
VK1688 已提交
213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256
    { key: "_add_time", title: "距离现在", type: "dateDiff", width: 120 },
    { 
      key: "nickname", title: "html渲染", type: "html", defaultValue: "未设置",
      formatter: function(val, row, column, index) {
        let str = `<text>${val}</text>(审核通过)`;
        return str;
      }
    },
    { key: "balance", title: "余额", type: "money", width: 120 },
    { key: "percentage", title: "占比", type: "percentage", width: 120 },
    { key: "address", title: "地址", type: "address", width: 120 },
    { key: "userInfo", title: "用户", type: "userInfo", width: 120 },
    { 
      key: "", title: "分组显示", type: "group", minWidth: 290, align:"left",
      columns:[
        { key: "_id", title: "ID", type: "text" },
        { key: "avatar", title: "头像", type: "avatar" },
        { key: "nickname", title: "昵称", type: "text" },
      ],
    },
    { 
      key: "object1", title: "对象字段", type: "object", width: 180, align:"left",
      columns:[
        { key: "key1", title: "对象内字段1", type: "text" },
        { key: "key2", title: "对象内字段2", type: "text" },
      ],
    },
    { 
      key: "gender", title: "性别", type: "radio", width: 120, defaultValue:0,
      data:[
        { value:1, label:"" },
        { value:2, label:"" },
        { value:0, label:"保密" },
      ]
    },
    { 
      key: "gender", title: "性别", type: "select", width: 120, defaultValue:0,
      data:[
        { value:1, label:"" },
        { value:2, label:"" },
        { value:0, label:"保密" },
      ]
    },
    { 
VK1688's avatar
1.0.5  
VK1688 已提交
257
      key: "checkbox", title: "多选字段", type: "checkbox", width: 120, defaultValue:1,
VK1688's avatar
初始  
VK1688 已提交
258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320
      data:[
        { value: 1, label: "选项1" },
        { value: 2, label: "选项2" },
      ]
    }
  ]
}
```



#### right-btns(右侧按钮列表)
```html
<vk-data-table
  :right-btns="['detail_auto','update','delete','more']"
></vk-data-table>
```
##### right-btns数组内的可选值有
| 可选值   | 说明                    |
|----------|------------------------|
| detail     | 点击后触发detail事件 |
| detail_auto     | 点击后自动弹出详情页 |
| update     | 点击后触发update事件 |
| delete     | 点击后触发delete事件 |
| more     | 与 rightBtnsMore 搭配使用|

#### right-btns-more(右侧更多按钮点击后显示的按钮列表)
```html
<vk-data-table
  right-btns="['detail_auto','update','delete','more']"
  :right-btns-more="table1.rightBtnsMore"
></vk-data-table>

```

```js
data() {
  return {
    table1:{
      rightBtnsMore:[
        {
        title:'按钮1',
          onClick:function(item){
          
          }
        },
        {
          title:'按钮2',
            onClick:function(item){
        
          }
        }
      ]
    }
  }
}

```

#### custom-right-btns (右侧自定义按钮)
```html
<vk-data-table
  :custom-right-btns="[
VK1688's avatar
1.1.4  
VK1688 已提交
321
     { title: '按钮1', type: 'primary', icon: 'el-icon-edit' }
VK1688's avatar
初始  
VK1688 已提交
322 323 324 325 326 327 328 329 330 331 332 333 334
  ]"
  @custom-right-btns="customRightBtns"
></vk-data-table>
```
```js
methods: {
  customRightBtns(item, btn){
		
  }
}

```

VK1688's avatar
1.1.1  
VK1688 已提交
335 336 337 338 339 340 341 342 343 344
### 条件查询
#### 可搭配表格搜索组件`vk-data-table-query` 进行条件查询
```html
<!-- 表格搜索组件开始 -->
<vk-data-table-query
  v-model="queryForm1.formData"
  :columns="queryForm1.columns"
  @search="search"
></vk-data-table-query>
<!-- 表格搜索组件结束 -->
VK1688's avatar
1.1.4  
VK1688 已提交
345 346 347 348 349 350 351
<!-- 表格组件开始 -->
<vk-data-table
 ...其他参数
  :query-form-param="queryForm1"
 ...其他参数
></vk-data-table>
<!-- 表格组件结束 -->
VK1688's avatar
1.1.1  
VK1688 已提交
352
```
VK1688's avatar
初始  
VK1688 已提交
353

VK1688's avatar
1.1.1  
VK1688 已提交
354 355 356 357 358 359 360 361 362 363 364 365 366 367
```js
queryForm1:{
  // 查询表单数据源,可在此设置默认值
  formData:{

  },
  // 查询表单的字段规则 fieldName:指定数据库字段名,不填默认等于key
  columns:[
    { key:"nickname", title:"昵称", type:"text", width:160, mode:"%%" },
    { key:"_add_time", title:"添加时间", type:"datetimerange", width:400, mode:"[]" },
  ]
}

```
VK1688's avatar
1.1.4  
VK1688 已提交
368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407

#### queryForm1.columns 参数说明

| 参数   | 说明       | 类型    | 默认值  | 可选值 |
|------- |-----------|---------|-------|-------|
| key    |   键名    | String  | 无    | - |
| title  |   标题    | String  | 无    | -  |
| type   |   组件类型    | String  | 无    | -  |
| width   |  组件宽度    | Number  | 无    | -  |
| placeholder   |   输入前的提示    | String  | - | -  |
| mode   |  查询模式    | String  | = | 见下方  |
| fieldName   |  数据库字段名称,默认=key的值    | String  | key的值  | -  |
| lastWhereJson   |  是否是连表后的where条件 | Boolean  | false | true  |

#### fieldName 参数的用处
##### 如余额按金额范围查询
```js
columns:[
  { 
    key:"balance1", title:"金额范围", type:"money", width:160, placeholder:"请输入最小金额", 
    mode:">=", fieldName:"balance", 
  },
  { 
    key:"balance2", title:"-", type:"money", width:160, placeholder:"请输入最大金额", 
    mode:"<=", fieldName:"balance", 
  }
]
```
#### lastWhereJson 参数的用处
##### 如userInfo是连表字段的as的值,想要根据 userInfo.mobile 进行查询
```js
columns:[
  { 
    key:"mobile", title:"手机号", type:"text", width:160,
    mode:"=", fieldName:"userInfo.mobile", lastWhereJson:true
  }
]
```


VK1688's avatar
1.1.1  
VK1688 已提交
408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425
#### queryForm1.columns 中 mode 参数详情
| 值         | 说明              
|------------|-------------------|
| =          | 完全匹配 |
| !=          | 不等于 |
| %%          | 模糊匹配 |
| %*          | 以xxx开头 |
| *%          | 以xxx结尾 |
| >          | 大于 |
| >=          | 大于等于 |
| <          | 小于 |
| <=          | 小于等于 |
| in          | 在数组里 |
| nin          | 不在数组里 |
| []          | 范围 arr[0] <= x <= arr[1] |
| [)          | 范围 arr[0] <= x <  arr[1]|
| (]          | 范围 arr[0] <  x <= arr[1] |
| ()          | 范围 arr[0] <  x <  arr[1] |