基于[email protected]
二次封装一些小组件,提高插拔性,便于多项目使用
npm i tbl-custom-components;
main.js
中注册,依赖于 element-ui,因此注册的时候得同步注册 element-ui
import ElementUI from 'element-ui';
Vue.use(ElementUI, { size: 'small', zIndex: 3000 }); // 声明使用ElementUI
import 'element-ui/lib/theme-chalk/index.css'; // element-ui样式表
import TblCustomComponents from 'tbl-custom-components'; // 引入自定义组件
Vue.use(TblComponents); // 声明使用TblComponents自定义组件
import 'tbl-custom-components/lib/tbl-custom-components.css'; // 自定义组件样式表
import { TblDaterangePicker,TblTooltipOver } from 'tbl-custom-components'; // 按需引入自定义组件(也可以不加大括号引入)
Vue.use(TblDaterangePicker); // 声明使用TblComponents自定义组件
Vue.use(TblTooltipOver); // 声明使用TblComponents自定义组件
import 'tbl-custom-components/lib/tbl-custom-components.css'; // 自定义组件样式表
// 全局配置
import TblCustomComponents from 'tbl-custom-components'; // 引入自定义组件
import locale from 'tbl-custom-components/lib/locale/lang/en'; // 全局配置自定义组件的国际化
Vue.use(TblCustomComponents,{ locale }); // 声明使用TblComponents自定义组件并配置国际化
import 'tbl-custom-components/lib/tbl-custom-components.css'; // 自定义组件样式表
基于element-ui
,二次封装 DateTimePicker组件,继承 该组件的所有属性、事件和方法
添加了昨日、今日、上周、本周、上月、本月、过去 7 天、过去 30 天、过去 90 天等快捷按钮
<tbl-daterange-picker
lang="en"
v-model="defaultValue"
align="left"
format="yyyy-MM-dd HH:mm:ss"
value-format="yyyy-MM-dd HH:mm:ss"
:btnOption="btnOption"
:picker-options="pickerOptions"
@change="onChange"
></tbl-daterange-picker>
export default {
name: 'App',
data() {
return {
defaultValue: [this.$moment(new Date()).format('YYYY-MM-DD HH:mm:ss'),this.$moment(new Date()).format('YYYY-MM-DD HH:mm:ss')],
btnOption: {
isYesterday: true, // 显示 昨日 按钮
isToday: true, // 今日
isPreWeek: true, // 上周
isThisWeek: true, // 本周
isPreMonth: true, // 上月
isThisMonth: true, // 本月
isLast7days: true, // 过去7天
},
pickerOptions: {
shortcuts: [],
disabledDate(date) {
return date.getTime() > Date.now();
},
},
}
},
methods:{
onChange(val) {
console.log(val, '获取到绑定的时间范围值');
this.defaultValue = val;
},
},
}
-
btnOption 不配置的话默认所有按钮都显示,配置为{}空对象时 所有按钮钧不显示
参数 说明 类型 可选值 默认值 isYesterday 是否显示 昨日 的按钮 boolean false/true true isToday 是否显示 今日 的按钮 boolean false/true true isPreWeek 是否显示 上周 的按钮 boolean false/true true isThisWeek 是否显示 本周 的按钮 boolean false/true true isPreMonth 是否显示 上月 的按钮 boolean false/true true isThisMonth 是否显示 本月 的按钮 boolean false/true true isLast7days 是否显示 过去 7 天 的按钮 boolean false/true true isLast30days 是否显示 过去 30 天 的按钮 boolean false/true true isLast90days 是否显示 过去 90 天 的按钮 boolean false/true true -
如使用 picker-options 来限制日期选择范围,或者设置周起始日 firstDayOfWeek,或者设置日期的类名 cellClassName 时,当需要显示快捷按钮,则必须加上 shortcuts: [],否则无快捷按钮; 不配置 picker-options 时,默认是有快捷按钮的
-
picker-options 所有属性和参数 详见 picker-options 参考地址;
-
继承 DateTimePicker 的所有属性、事件和方法
-
activeShortcut 属性:
参数 说明 类型 可选值 默认值 activeShortcut 默认高亮的快捷项按钮 string 0/1/2/3/4/5/6/7/8 '' 0-8 分别对应 btnOption 中的 9 个按钮
-
方法 getActiveShortcut(index,picker) 参数为快捷项下标和快捷项本身
-
lang 国际化配置,当前组件设置了 lang 属性,可重新覆盖全局国际化的配置
参数 说明 类型 可选值 默认值 lang 国际化配置 string cn/en cn
基于element-ui
,二次封装Tooltip组件,继承Tooltip 的所有属性和方法
当文本超出既定宽度显示 ... ,并自动提示 tooltips 的小组件
<div style="width:500px;margin-left: 15px">
<p>2.1 无slot:</p>
<tbl-tooltip-over :content="content" refName="tooltipOver" effect="dark" placement="top-start" popper-class="test-tooltip"></tbl-tooltip-over>
<p>2.1 有slot:</p>
<tbl-tooltip-over refName="tooltipOver" effect="dark" popper-class="test-tooltip">
<span slot="contentTip" style="color:#00f;">{{ content2 }}</span>
<span slot="contentOver" style="color:#f00;font-size: 40px">{{ content1 }}</span>
</tbl-tooltip-over>
</div>
export default {
name: 'App',
data() {
return {
content: `他找来半张红纸和一支毛笔,让村里的一名小学老师为他写了一张告示。告示的大概内容是:因收入微薄无法承担太多应酬,除丧葬、嫁娶之外`,
content1: `恶风读wùfēng。指病人遇风觉冷,避风则缓解之症。外感内伤俱可见恶风之证。指病邪,《素问·脉要精微论》:“来徐去疾,上虚下实`,
content2: 112233445566,
}
},
}
-
继承 Tooltip 的所有属性和方法
-
content 显示文字
参数 说明 类型 可选值 默认值 content 文本显示 string/number - - -
lang 国际化配置,当前组件设置了 lang 属性,可重新覆盖全局国际化的配置
参数 说明 类型 可选值 默认值 lang 国际化配置 string cn/en cn -
slot 插槽
参数 说明 类型 可选值 默认值 contentTip 具名插槽,可用来显示 tooltip 的弹出层 string/number - - contentOver 具名插槽,用来页面显示(即有省略号的那部分) string/number - -
基于element-ui
,使用Input 组件和Popover 组件,将 2.15.14 版本的所有图标+自定义的 TBL 图标库 阿里图标做成选择器,用于图标选择。
<tbl-icon-picker v-model="iconValue" placeholder="请选择图标"></tbl-icon-picker>
export default {
name: 'App',
data() {
return {
iconValue: '',
}
},
}
-
引入
/* 引入自定义tbl图标(在线引用,项目中还是推荐下载下来使用) */ @import '//at.alicdn.com/t/c/font_4403618_ujpcwclle8.css';
-
可配参数
参数 说明 类型 可选值 默认值 placeholder 占位字符,继承 Input string - - disabled 是否禁用,继承 Input boolean false/true false placement 弹出框位置,继承 Popover string top/top-start/top-end/bottom/bottom-start/bottom-end/left/left-start/left-end/right/right-start/right-end bottom -
lang 国际化配置,当前组件设置了 lang 属性,可重新覆盖全局国际化的配置
参数 说明 类型 可选值 默认值 lang 国际化配置 string cn/en cn
基于element-ui
,使用Input 组件、Table 组件以及 Pagination 组件,组合成一个带分页的表格穿梭框。
<tbl-table-transfer
class="eltTransfer"
ref="eltTransfer"
:show-query="true"
:show-pagination="true"
:pagination-call-back="paginationCallBack"
:left-columns="leftColumns"
:title-texts="['全部设备', '已绑设备']"
:query-texts="['筛选', '筛选']"
:table-row-key="row => row.id"
maxHeight="900px"
minHeight="470px"
v-model="tableData"
>
<!-- 可以使用插槽获取到列信息和行信息,从而进行数据的处理 -->
<template v-slot:default="{ scope }">
<div>
<span v-if="scope.col.id === 'state'">
<span v-if="scope.row.state == 0">离线</span>
<span v-if="scope.row.state == 1">在线</span>
</span>
<span v-else>{{ scope.row[scope.col.id] }}</span>
</div>
</template>
<template v-slot:leftCondition="{ scope }">
<el-form-item label="">
<el-input v-model="scope.deviceName" clearable placeholder="请输入设备名称"></el-input>
</el-form-item>
</template>
<template v-slot:rightCondition="{ scope }">
<el-form-item label="">
<el-input v-model="scope.deviceName" clearable placeholder="请输入设备名称"></el-input>
</el-form-item>
</template>
</tbl-table-transfer>
export default {
name: 'App',
data() {
return {
// 表头
leftColumns: [
{ label: '设备名称', id: 'deviceName' },
{ label: '设备编号', id: 'deviceCode' },
{ label: '网络状态', id: 'state', width: '80px' },
],
// 已绑定数据
tableData: [
{
id: 1,
deviceName: '设备1',
deviceCode: '0001',
state: 0,
},
{
id: 2,
deviceName: '设备2',
deviceCode: '0002',
state: 1,
},
],
// 全部数据
allDeviceData: [
{
id: 1,
deviceName: '设备1',
deviceCode: '0001',
state: 0,
},
{
id: 2,
deviceName: '设备2',
deviceCode: '0002',
state: 1,
},
{
id: 3,
deviceName: '设备3',
deviceCode: '0003',
state: 0,
},
{
id: 4,
deviceName: '设备4',
deviceCode: '0004',
state: 1,
},
],
}
},
methods:{
// 未选数据加载和检索
paginationCallBack(obj) {
let abcData;
var filtersObj = {
deviceName: obj.deviceName,
};
// 如果筛选条件全为空,查全部;否则按条件筛选
var objIsEmpty = true;
for (var key in filtersObj) {
if (typeof filtersObj[key] != 'undefined' && typeof filtersObj[key] != 'null' && filtersObj[key] != null && filtersObj[key] != '') {
objIsEmpty = false;
break;
}
}
if (objIsEmpty) {
abcData = this.allDeviceData;
} else {
// 拿到有值的参数
let tempFilter = {};
for (var key in filtersObj) {
if (typeof filtersObj[key] != 'undefined' && typeof filtersObj[key] != 'null' && filtersObj[key] != null && filtersObj[key] != '') {
tempFilter[key] = filtersObj[key];
}
}
abcData = this.allDeviceData.filter(item => {
let flag = false;
for (key in tempFilter) {
// console.log(key,'输出key')
if (item[key].toString().indexOf(tempFilter[key].toString()) >= 0) {
flag = true;
} else {
flag = false;
break;
}
}
if (flag) {
return item;
}
});
}
let newData = abcData.filter((item, index) => {
if (index >= (obj.pageIndex - 1) * obj.pageSize && index < obj.pageIndex * obj.pageSize) {
return true;
}
return false;
});
return new Promise((resolve, reject) => {
try {
resolve({ total: abcData.length, data: newData });
} catch (e) {
reject();
}
});
},
}
}
-
可配参数:
参数 说明 类型 可选值 默认值 maxHeight 表格最大高度 string - '500px' maxHeight 表格最小高度 string - '300px' tableStripe 表格斑马线 string false/true false tableBorder 表格边框 boolean false/true false tableRowKey 表格行数据的 key string/number - row.id showQuery 显示查询条件 boolean false/true false showPagination 显示分页 boolean false/true false paginationCallBack 左侧分页回调 Function(obj) // obj-参数为查询条件的返回值 - - titleTexts 标题文本 Array[string] - ['待选项', '已选项'] buttonTexts 按钮文本 Array[string] - [] queryTexts 查询按钮文本 Array[string] - ['查询', '筛选'] leftColumns 左侧参数 Array[{}] - [] rightColumns 右侧参数 Array[{}] - [] -
lang 国际化配置,当前组件设置了 lang 属性,可重新覆盖全局国际化的配置
参数 说明 类型 可选值 默认值 lang 国际化配置 string cn/en cn
基于element-ui
,参考vue-cron 组件进行重新开发和改造。
<!-- cron表达式输入框 -->
<el-input v-model="form.cronExpression" placeholder="请输入运行周期" clearable>
<el-tooltip slot="append" effect="dark" content="打开表达式配置" placement="top">
<el-button icon="el-icon-thumb" @click="openCronDialog(form.cronExpression)"></el-button>
</el-tooltip>
</el-input>
<!-- cron表达式选择器 -->
<el-dialog title="cron表达式" :visible.sync="showCronBox" width="40%" :append-to-body="true" :before-close="closeCron" destroy-on-close>
<tbl-cron v-model="cronVal" lang="cn"></tbl-cron>
<span slot="footer" class="dialog-footer">
<el-button @click="closeCron">取 消</el-button>
<el-button type="primary" @click="cronConfirm(cronVal)">确 定</el-button>
</span>
</el-dialog>
export default {
name: 'App',
data() {
return {
showCronBox: false,
form: {
cronExpression: '',
},
cronVal: '',
}
},
}
-
lang 国际化配置,当前组件设置了 lang 属性,可重新覆盖全局国际化的配置
参数 说明 类型 可选值 默认值 lang 国际化配置 string cn/en cn
基于element-ui
,二次封装Table+Pagination 组件,实现表格+分页的封装,另外配置了动态表头,使表格能根据自定义选择的表头动态渲染。
将列表、分页三者的交互逻辑封装到组件中,节省开发者代码量 配置化的表格项,跟 el-table-column 的配置属性类似 配置化的分页,跟 el-pagination 的配置属性类似 自定义是否显示搜索和分页 自定义工具栏 丰富的插槽提供功能扩展
<tbl-dynamic-tables
:request="getList"
:columns="columns"
:pagination="paginationConfig"
:dynamicColumns="true"
storageKey="testTableColumns"
lang="cn"
@columns-change="columnsChange"
>
<template #isEnable="scope">
<el-switch v-model="scope.row.isEnable" :active-value="1" :inactive-value="0"></el-switch>
</template>
<template #operate="scope">
<el-button size="mini" type="primary">编辑{{ scope.row.index }}</el-button>
<el-button size="mini" type="danger">删除</el-button>
</template>
</tbl-dynamic-tables>
export default {
name: 'App',
data() {
return {
// 表格
columns: [
{ label: '', type: 'selection', show: true },
{ label: '序号', type: 'index', show: false },
{ label: '角色名称', prop: 'nickName', show: true, required: true },
{ label: '邮箱', prop: 'userEmail', show: true },
{ label: '电话', prop: 'tel', show: true },
{
label: '性别',
prop: 'sex',
show: true,
formatter: function(row, column, cellValue, index) {
if (cellValue == '男') {
return (
<span>
<i style='background-color:#f00;display: inline-block;border-radius: 50%;width:6px;height:6px;margin-right:3px'></i>
{cellValue}
</span>
); // 此处注意jsx的语法规则
} else {
return (
<span>
<i style='backgroundColor:#0f0;display: inline-block;border-radius: 50%;width:6px;height:6px;margin-right:3px'></i>
{cellValue}
</span>
); // 此处注意jsx的语法规则
}
},
},
{
label: '启用',
prop: 'isEnable',
show: true,
tdSlot: 'isEnable', // 自定义单元格内容的插槽名称
},
{
label: '操作',
fixed: 'right',
width: 180,
align: 'center',
tdSlot: 'operate', // 自定义单元格内容的插槽名称
},
],
dynamicTableData: {
list: [
{
nickName: '李逍遥',
userEmail: '[email protected]',
tel: '15189764540',
sex: '男',
isEnable: 1,
},
{
nickName: '赵灵儿',
userEmail: '[email protected]',
tel: '15189764541',
sex: '女',
isEnable: 1,
},
{
nickName: '林月如',
userEmail: '[email protected]',
tel: '15189764542',
sex: '女',
isEnable: 0,
},
],
total: 3,
},
// 分页配置
paginationConfig: {
layout: 'total, prev, pager, next, sizes', // 分页组件显示哪些功能
pageSize: 5, // 每页条数
pageSizes: [5, 10, 20, 50],
background: true,
},
}
},
}
// 请求函数
async getList(params) {
// console.log(params, 'params');
// params是从组件接收的,包含分页字段。
// 1.静态数据
const _dynamicTableData = this.dynamicTableData;
// 必须要返回一个对象,包含data数组和total总数
return {
data: _dynamicTableData.list,
total: _dynamicTableData.total,
};
// 2.动态数据
await this.$api
.listUser({
page: params.pageNum,
limit: params.pageSize,
searchName: this.filters[0].value,
phone: this.filters[1].value,
})
.then(data => {
if (data.code == 0) {
this.dynamicTableData.list = data.data;
this.dynamicTableData.total = data.count;
} else {
this.$message.error(data.msg);
}
});
// 必须要返回一个对象,包含data数组和total总数
return {
data: this.dynamicTableData.list,
total: this.dynamicTableData.total,
};
},
// 表头改变
columnsChange(columns1, columns2) {
console.log(columns1, columns2);
},
-
request,请求列表数据的函数:组件加载的时候会自动执行 request 函数
-
函数接收参数:包含搜索表单的所有字段和分页的 pageNum 和 pageSize
-
函数必须返回一个对象,包含:
-
data: 列表数据的数组(数组 Array)
-
total:总数,用于分页(数值 Number)
// 请求函数 async getList(params) { // console.log(params, 'params'); // params是从组件接收的,包含分页字段。 // 1.静态数据 const _dynamicTableData = this.dynamicTableData; // 必须要返回一个对象,包含data数组和total总数 return { data: _dynamicTableData.list, total: _dynamicTableData.total, }; // 2.动态数据 await this.$api .listUser({ page: params.pageNum, limit: params.pageSize, searchName: this.filters[0].value, phone: this.filters[1].value, }) .then(data => { if (data.code == 0) { this.dynamicTableData.list = data.data; this.dynamicTableData.total = data.count; } else { this.$message.error(data.msg); } }); // 必须要返回一个对象,包含data数组和total总数 return { data: this.dynamicTableData.list, total: this.dynamicTableData.total, }; },
-
-
-
table 表格配置:支持Table的所有属性
-
columns 列配置(数组 Array)
参数 说明 类型 可选值 默认值 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 }] - - formatter 对应 el-table-column 的 formatter Function(row, column, cellValue, index) - - ... ... ... ... ... 以上 ↑↑↑ 支持el-table-column的所有属性 ↑ ↑ ↑ 新增 ↓↓↓ ↓ ↓ ↓ ↓ tdSlot 单元格要自定义内容时,可以通过此属性配置一个插槽名称,并且是作用域插槽,可以接收 scope 数据 string - - labelSlot 表头要自定义内容时,可以通过此属性配置一个插槽名称,并且是作用域插槽,可以接收 scope 数据 string - - show 设置动态表头时,是否显示该列 boolean false/true true required 设置动态表头时,某列必选,不可在下拉中隐藏 boolean false/true 当 columns 中都不填写 required 或者 required 都为 false 时,默认除 type=index/section/expend 后的第一列为 required=true -
pagination 分页配置(对象 Object),如果不想显示分页,将 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] background 是否为分页按钮添加背景色 boolean - false -
dynamicColumns 显示动态表头
参数 说明 类型 可选值 默认值 dynamicColumns 是否显示动态表头 boolean false/true true -
storageKey 表头存储到 localStorage 的键值
参数 说明 类型 可选值 默认值 storageKey 将当前设置好的表头存入 localStorage,防止页面刷新后,恢复到初始表头。如果 storageKey 不传值,则无法存储 localStorage,表格恢复至初始表头。配合组件内部方法** getColumns() 、setColumns()
**string - - -
lang 国际化配置,当前组件设置了 lang 属性,可重新覆盖全局国际化的配置
参数 说明 类型 可选值 默认值 lang 国际化配置 string cn/en cn -
工具栏配置,工具栏默认是空的,提供一个具名插槽 toolbar,来自定义工具栏的内容
-
事件 columns-change,表头动态修改后的返回函数,函数返回两个值 column1:改变后的所有表头数据、column2:改变后的当前显示的表头数据
columnsChange(columns1, columns2) { console.log(columns1, columns2); },
-
组件内部方法
-
getColumns()
tips: 必须先配置 storageKey 属性,给存储表头数据一个键值
配置 ref 属性,可以通过 ref 获取组件后调用组件内部的**
getColumns()
**方法获取存储到 localStorage 的表头信息 -
setColumns()
tips: 必须先配置 storageKey 属性,给存储表头数据一个键值
配置 ref 属性,可以通过 ref 获取组件后调用组件内部的**
setColumns()
**方法重新设置表格的表头信息// 页面初始化的时候,在mounted中重载表格的表头 mounted() { var newColumns = this.$refs.dynamicTable.getColumns(); this.$refs.dynamicTable.setColumns(newColumns); },
-
reSet()
配置 ref 属性,可以通过 ref 获取组件后调用组件内部的**
reSet()
**方法,将表格分页信息初始化reSet(){ this.$refs.dynamicTable.reSet(); this.getList(); },
-