dc-search-table
如何使用
npm install element-ui --save
npm install axios --save
安装
nrm use dc
npm install dc-search-table --save
sudo npm install dc-search-table --save
更新
npm install dc-search-table@latest
组件列表
- dc-search-table [表单+表格+页码]搜索表格组件
- dc-form [表单]表单组件,可单独使用
- dc-table [表格]表格组件,可单独使用
引用
import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(ElementUI)
import SearchTable from 'dc-search-table'
import 'dc-search-table/npm/css/main.css'
Vue.use(SearchTable, {
token: {
name: 'dc-access-token',
value: '',
headers: '',
storage: 'LocalStorage' // 存储方式:Cookies/LocalStorage/SessionStorage, 默认是SessionStorage
}
});
<template>
<div class="demo">
<search-table
:option="option"
v-model="formData"
ref="SearchTable"
@on-operation="handleOperation"
@request-done="requestDone"
@request-error="requestError"
>
</search-table>
</div>
</template>
<script>
import option from './option';
export default {
name: 'demo',
// components: { SearchTable },
data() {
return {
// ...option,
option: option.data.call(this),
formData: {}
};
},
methods: {
// 请求结束
requestDone() {
// let iframeHeight = document.getElementsByClassName('search-table')[0].offsetHeight;
// this.$framework.messager.init(null, res => {
// console.log(res.event, res.data);
// });
},
// 表格最后一列的操作
handleOperation({ value }, ...arg) {
if (value === 'handle') {
this.handle(...arg);
}
},
handle(...arg) {
console.log(...arg);
},
// 请求错误,如token过期
requestError(res){
if(res.resultCode===1030102){
this.$router.push('/login')
}
}
}
};
</script>
使用示例
【与[page].vue同级建立option.js文件】
// let proxyPrefix = process.env.NODE_ENV === 'development' ? 'api' : '';
import baseUrl from '@/services/http/apiRoot.js';
import permission from './permission';
let proxyPrefix = baseUrl;
export default {
data() {
return {
permission: permission.data.call(this),
request: {
url: proxyPrefix + '/student/web/student/enroll/list',
method: 'get', //非必填
paramMap: { //非必填
index: 'pageIndex',
size: 'pageSize'
},
paramInit: {}, // 初始值, 对象或者function
// paramInit: ()=>{
// return {
// a:1
// }
// }
page:{
index: 0, //选填,若后端index是0开始的得调整
size: 10 //非必填
},
resultMap: { //非必填
total: 'total',
data: 'pageData'
}
},
formItemSize: '', // medium/mini/small, 默认medium
labelWidth: 90,
submitBtn: true, // 搜索按钮,默认true,非必填
submitText: '查询', // 搜索按钮的文字,默认查询,非必填
clearBtn: true, // 重置按钮,默认true
clearSize: 'small', // medium/mini/small, 默认medium
clearText: '重置', // 重置按钮的文字,默认重置,非必填
tabs: // 顶部选项卡
{
label: '审核状态',
prop: 'authorityStatus',
dicUrl: proxyPrefix + '/health/admin/user/getAuthorityCount', // 非必填项
list: [
{
label: '待审核',
value: 2,
number: 2 //显示数量
},
{
label: '已通过',
value: 1,
name: 'pass',
number: 0 //可通过调接口映射
},
{
label: '未通过',
value: 3
name: 'fail',
number: 0
}
]
},
buttons: { // 搜索顶部按钮
placement: 'top',
isSink: true, //是否下沉
size: 'small',
list: [
{
label: '导出',
value: 'click',
type: 'primary', // success,info,warning,danger
style: 'plain',
icon: 'el-icon-delete',
callback: function() {
console.log(this);
}
}
]
},
columns: [
{
slotType: 'selection',
buttons: [
{
label: '批量删除',
value: 'click',
type: 'danger',
style: 'plain',
icon: 'el-icon-delete',
callback: function() {
//
}
}
]
},
{
props: ['name', 'auditor', 'telephone'], // 根据下面属性就行自动筛选
searchType: 'input-with-select',
hide: true,
canSearch: true
},
{
prop: 'headPicFileName',
label: '头像',
slotType: 'avatar',
width: 61
},
{
prop: 'keyword',
label: '学员/家长',
canSearch: true, // searchType不写默认为input类型
hide: true
},
{
prop: 'name',
label: '学员'
},
{
prop: 'telephone',
label: '家长手机号',
width: 130
},
{
prop: 'sheng',
param: 'id',
label: '省市区',
isLazyload: true,
showAllValues: true,
searchType: 'cascader',
dicUrl: proxyPrefix + '/health/admin/check/getArea',
dicMethod: 'post',
dicLevel: 3,
dicMap: {
label: 'name',
value: 'code'
},
canSearch: true
},
{
prop: 'departments',
param: 'deptId',
label: '科室',
canSearch: true,
searchType: 'cascader',
dicUrl: proxyPrefix + '/health/admin/check/getDepts',
dicMethod: 'post',
dicData: [],
dicMap: {
label: 'name',
value: 'id'
}
},
{
prop: 'type',
label: '报名类型',
minWidth: 90, // 注意与width的区别
canSearch: true,
searchType: 'select',
slotType: 'text',
slotArray: [{
label: '新报',
value: 1
},
{
label: '续报',
value: 2
}],
// 当上属性与下属性相同时,下方可省略
// dicData: [{
// label: '新报',
// value: 1
// },
// {
// label: '续报',
// value: 2
// }]
},
{
prop: 'auditor',
label: '报名老师',
canSearch: true,
param: 'teacherId', // 修正请求参数名
searchType: 'select',
dicUrl: proxyPrefix + '/org/web/org/user/list/teacher',
dicMap: {
label: 'userName',
value: 'id'
},
dicData: [],
dicInit: [ // 初始值
{label: '不限', value:0}
]
},
{
prop: 'courseFee',
label: '缴费金额',
// showWordLimit: true,
// showOverflowTooltip: true,
slotType: 'format',
slotRender: (row)=>{
if(row.status===1){
return row.courseFee + '元'
}else{
return row.courseFee + '美金'
}
}
},
{
prop: 'profCheckTime',
label: '审核时间',
param: 'startTime,endTime',
searchType: 'daterange',
// format: 'yyyy年MM月dd日,hh点mm分',
// valueFormat: 'timestamp',
canSearch: true,
width: 195,
slotType: 'format',
slotRender: dt => {
if (dt.authorityStatus == 1 && dt.profCheckTime) {
// 已通过
return dt.profCheckTime;
} else if (dt.authorityStatus == 2 && dt.profSubmitTime) {
// 待审核
return dt.profSubmitTime;
} else {
return '';
}
}
},
{
prop: 'status',
label: '报名状态',
slotType: 'tag',
width: 110,
slotArray: [{
type: 'warning',
label: '待审核',
value: 1
},
{
type: 'danger',
label: '审核不通过',
value: 3
},
{
type: 'success',
label: '审核通过',
value: 2
}]
},
{
prop: 'operation',
label: '操作',
width: 80,
slotType: 'operation',
slotArray: [
{
label: '方法一',
value: 'handle'// 监听on-operation方法
},
{
label: '方法二',
value: 'handle2',
filter: ({status}) => { //显示条件
return status === 1
},
callback: function(callback, row){
console.log('这里注意不要使用箭头函数',this)
}
}
]
}
]
}
}
}
【与option.js同级建立permission.js文件】
import baseUrl from '@/http/apiRoot.js';
let telephone = router.app.$route.query.telephone;
let proxyPrefix = baseUrl;
let onlineHospitalService = 'online-hospital';
export default {
data() {
return {
// 更改
update: {
url: proxyPrefix + onlineHospitalService + '/doctor/doctor/saveOrUpdate',
method: 'post', // 非必填
paramInit: function() {
return {
telephone: this.$route.query.telephone
};
}, // 初始值
resultMap: {
// 非必填
total: 'total',
data: 'pageData'
}
},
insert: {
url: proxyPrefix + onlineHospitalService + '/doctor/doctor/onlineRegisterStatus/' + telephone,
method: 'get', // 非必填
headers: {
isJson: true
},
paramInit: function() {
return {
// id: 881976,
telephone: this.$route.query.telephone
};
}, // 初始值
resultMap: {
// 非必填
data: 'doctor'
},
callback(res) {}
},
detail: {
url: function() {
return proxyPrefix + onlineHospitalService + '/doctor/doctor/onlineRegisterStatus/' + this.$route.query.telephone;
},
method: 'get', // 非必填
headers: {
isJson: true
},
paramInit: function() {
return {
telephone: this.$route.query.telephone
};
}, // 初始值
resultMap: {
// 非必填
data: 'doctor'
},
resultData: function(res){ // 当返回值为null时formData的初始化
return {
title: '',
titleTag: '',
imageInfoVO: {
docCer: []
}
}
},
callback(res) {}
}
};
}
};
参数说明
Variables
| 参数 |
说明 |
类型 |
可选值 |
默认值 |
| options |
组件配置属性,详情见下面options属性 |
Object |
- |
- |
Events
| 事件名 |
说明 |
参数 |
| on-search |
点击搜索后触发该事件,非必填 |
- |
| on-page |
切换页面时触发该事件,非必填 |
- |
| on-selection |
当选择项发生变化时会触发该事件,非必填 |
- |
| on-select |
当搜索选择列表发生变化时会触发该事件,非必填 |
- |
| on-clear |
重置时,触发该事件,非必填,常用于自己写组件 |
- |
| on-operation |
当"操作"(包括'switch-change')发生变化时会触发该事件 |
属性slotArray[{value}] |
| request-done |
请求结束触发该事件,非必填 |
- |
| request-error |
请求接口错误时,触发该事件,非必填,常用户token失效跳登录页面 |
- |
Methods [this.$refs.SearchTable]
| 方法名 |
说明 |
参数 |
| setOptionData |
获取select选项数据接口后塞入的字段 |
{result: res.data,label: 'name',value: 'id',target: 'courseName'} |
| getTableData |
重新请求该页面事件 |
- |
| setTabsData |
通过接口获取tabs各选项的number值后塞入的字段 |
{result: res.data} |
Data [this.$refs.SearchTable]
| 常用值 |
说明 |
| searchData |
请求的参数 |
| formData |
表单的参数 |
| tableData |
表格的参数 |
Options Attributes
| 参数 |
说明 |
类型 |
可选值/例子 |
默认值 |
| request.url |
请求地址,必填项 |
String |
/student/web/audition/list |
- |
| request.method |
请求方法,可不填 |
String |
get/post |
get |
| request.headers |
请求头,可不填 |
Object |
{isJson: false} |
{isJson: true} |
| request.paramMap.index |
请求映射index参数 |
String |
pageIndex |
pageIndex |
| request.paramMap.size |
请求映射size参数 |
String |
pageSize |
pageSize |
| request.paramInit |
请求初始化参数 |
Object/Function |
{} / ()=>{ return {a:1}} |
{} |
| request.resultMap.total |
请求映射total参数 |
String |
total |
total |
| request.resultMap.data |
请求映射data参数 |
String |
pageData |
pageData |
| request.params |
初始参数值 |
String |
- |
- |
| dialogWidth |
弹窗宽度 |
Number |
- |
600 |
| formItemSize |
表单组件的大小 |
String |
medium/mini/small |
mini |
| labelWidth |
label的宽度 |
Number |
- |
70 |
| submitBtn |
是否显示搜索按钮 |
Boolean |
true/false |
true |
| submitText |
搜索文本 |
String |
- |
查询 |
| clearBtn |
是否显示清空按钮 |
Boolean |
true/false |
true |
| clearText |
清空文本 |
String |
- |
重置 |
| tabs |
选项卡配置属性,详情见下方Tabs属性 |
Object |
- |
[ ] |
| columns |
表格配置属性,详情见下面Columns属性 |
Array |
- |
[ ] |
| buttons |
顶部按钮配置属性,详情见下面Buttons属性 |
Object |
- |
[ ] |
Tabs Attributes
| 参数 |
说明 |
类型 |
可选值 |
默认值 |
| prop |
字段参数 |
String |
- |
- |
| canSearch |
字段参数是否参与请求 |
Boolean |
- |
true |
| list |
tab列表 |
Array |
Array:object[{label,value,number}] |
true |
Buttons Attributes
| 参数 |
说明 |
类型 |
可选值 |
默认值 |
| placement |
按钮摆放的位置 |
String |
top/bottom |
top |
| isSink |
是否下层,当搜索右边有大量位置时,顶部的按钮因为美观会选择下沉位置 |
Boolean |
true/false |
false |
| size |
按钮大小 |
String |
medium/mini/small |
mini |
| list |
按钮列表 |
Array |
Array[Object]:[{label,value,type,style,icon,callback}] |
false |
Columns Attributes
| 参数 |
说明 |
类型 |
可选值 |
默认值 |
| prop |
字段参数 |
String |
- |
- |
| param |
当请求参数与字段不同时,可用该参数修正,多参用逗号隔开,非必填 |
String |
'beginTime,endTime'/'teacherId' |
- |
| width |
th 宽度,非必填 |
String |
- |
- |
| labelWidth |
label宽度,非必填 |
String |
- |
- |
| hideSearchLabel |
全部隐藏搜索的label,非必填 |
Boolean |
true/false |
false |
| minWidth |
对应列的最小宽度,minWidth会把剩余宽度按比例分配给设置了minWidth的列,非必填 |
String |
- |
- |
| imageWidth |
图片宽度,非必填, 当slotType='image'时生效 |
Number |
- |
100 |
| imageHeight |
图片高度,非必填, 当slotType='image'时生效 |
Number |
- |
50 |
| fixed |
列是否固定在左侧或者右侧,true 表示固定在左侧,非必填 |
string, boolean |
true, left, right |
— |
| format |
type=daterange时,'yyyy 年 MM 月 dd 日' |
String |
yyyy 年 MM 月 dd 日 |
- |
| valueFormat |
type=daterange时,值的显示格式 |
String |
timestamp |
timestamp |
| label |
字段名称 |
String |
- |
- |
| searchLabel |
搜索字段名称,若不想要搜索名称,请赋值" ", 注意双引号内是空格,非必填 |
String |
- |
" " |
| hide |
隐藏字段,仅搜索表单显示,表格不显示的字段 |
Boolean |
- |
- |
| filter |
根据tab条件,是否显示,接收的参数是this |
Boolean |
- |
this |
| event |
触发事件,如click |
String |
click |
- |
| callback |
event事件的回调 |
Function |
- |
- |
| cansSearch |
是否是搜索字段 |
Boolean |
true/false |
- |
| searchType |
搜索表单组件类型, 当canSearch=true时才有效 |
String |
tabs/select/input/daterange/cascader/input-with-select |
input |
| dicData |
select选项的值 |
Array |
[{label:'',value:''}] |
[] |
| dicUrl |
select选项的请求地址 |
String |
- |
- |
| dicLevel |
select显示几级,例如省市区为3级,则为3 |
String |
2/3 |
2 |
| dicMap.label |
label字段映射 |
String |
- |
- |
| dicMap.value |
value字段映射 |
String |
- |
- |
| dicMap.other |
当映射的值不止一个时,字符串值时,为label值的参数,对象为多参数 |
String/Objecy |
- |
- |
| slot |
table字段是否使用插槽 |
Boolean |
true/false |
false |
| slotType |
table插槽类型 |
String |
selection/tag/image/avatar/text/button |
- |
| slotArray |
表格插槽显示字段的各种值,详情见下面SlotArray属性,注意callback的this指向 |
Array[Object] |
- |
- |
| slotFilter |
表格插槽显示的条件 |
Function[Object] |
({roles}) => {roles!==1} |
- |
| searchRight |
表格头部(搜索)右侧内容插槽显示字段的各种值 |
Array[Object] |
[{type:'',label:'',value:'',filter:({s})=>{}}] |
- |
SlotArray Attributes
| 参数 |
说明 |
类型 |
可选值 |
默认值 |
| type |
类型 |
String |
info/primary/success/warning/danger |
primary |
| label |
显示文本 |
String |
- |
- |
| value |
值 |
Any |
- |
- |
| filter |
显示条件 |
Function |
filter: ({ status }) => {return status != 1} |
- |
| append |
显示在文本之后的字段 |
Function |
({successCount})=>{return <br/>成功${successCount}条;} |
- |
| preppend |
显示在文本之前的字段 |
Function |
同上 |
- |
Scoped Slot
默认插槽, 用以处理复杂字段和场景
| 参数 |
说明 |
| 列的名称 |
列自定义列的内容,参数为{row,label,dic,$index} |
| searchTop |
表格头部(搜索)上侧内容 |
| searchBottom |
表格头部(搜索)下侧内容 |
| search-列的名称 |
表格头部(搜索)的插槽,searchSlot:true, this.$refs.SearchTable.searchData[列的名称]='值'设置请求参数 |
| detail-列的名称 |
详情页面的插槽,slot: true, this.$refs.SearchTable.formData[列的名称]='值'设置请求参数 |
版本升级
- [0.0.0] 项目初始化
- [0.0.1] 文档编写
- [0.0.2] 组件编写迁移
- [0.0.3] 增加setTabsData方法
- [0.0.4] 组件样式的生效引入
- [0.0.5] loading效果优化
- [0.0.6] 封装了省市区接口搜索,增加dicLevel参数
- [0.0.7] 添加request.paramInit参数, 可以初始化参数与搜索字段进行合并
- [0.0.8] 修改this的指向值为上级$parent
- [0.0.13] 修改样式所属
- [0.0.17] 解决正则表达式影响打包问题兼容safari浏览器问题
- [0.0.21] 增加是否显示字段filter参数
- [0.0.22] 增加tabs请求完成标识
- [0.0.24] 增加tabs返回结果的处理resultFormat
- [0.0.25] 保存route信息
- [0.0.26] 添加request.paramInit参数的类型为function
- [0.0.27] 增加el-table-column的fixed属性
- [1.0.0] 版本升级重构组件的按需加载方式结构改动较大
- [1.0.68] 在request.headers增加hideLoading字段隐藏loading
- [1.0.72] 增加hideSearchLabel字段全部隐藏SearchLabel
更多内容,请参考官网
See dc-search-table.
See jenkins.
See dev.
See gitlab.