Elementui 使用
# Elementui 使用
[TOC]
- 源码查看:参考教程-element-ui 的组件源码还能这么看 (opens new window)
- packages里的每一个文件夹就是一个组件,主要看script部分的props、event和slot。
# 一、日期时间相关
# 1.1 日期选择器
# 1.1.1 最长日期跨度 7 天
<el-date-picker
v-model="dateRange"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
:picker-options="pickerOptions"
@change="changeDate"
format="yyyy-M-d" <!-- 只能用这个属性来格式化时间 -->
:clearable="false"
></el-date-picker>
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
let timeRange = 3600 * 1000 * 24 * 6;
pickerOptions: {
onPick(val) {
if (val.minDate && val.maxDate) {
_minDate = null;
_maxDate = null;
} else if (val.minDate) {
_minDate = val.minDate.getTime() - timeRange;
_maxDate = val.minDate.getTime() + timeRange;
} else {
_minDate = val.maxDate.getTime() - timeRange;
_maxDate = val.maxDate.getTime() + timeRange;
}
},
disabledDate(val) {
// onPick后触发
// 该方法会轮询当3个月内的每一个日期,返回false表示该日期禁选
if (_minDate && _maxDate) {
return val.getTime() < _minDate || val.getTime() > _maxDate;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 1.1.2 指定默认的时间段
changeDateRange(val) {
let timeRange;
switch (val) {
case "month":
// 返回当月的天数 - 1
let month = 29;
// 时间段默认一个月
timeRange = 3600 * 1000 * 24 * month;
this.dateRange = [new Date().getTime() - timeRange, new Date()];
break;
case "week":
timeRange = 3600 * 1000 * 24 * 6;
this.dateRange = [new Date().getTime() - timeRange, new Date()];
break;
case "today":
this.dateRange = [new Date(), new Date()];
break;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 二、select
# 2.1 标签名称过长省略显示
.el-select__tags {
flex-wrap: nowrap !important;
}
.el-select__tags-text {
max-width: 80px !important;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
vertical-align: bottom;
display: inline-block;
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 2.2 去掉三角箭头并贴近处理
.el-popper {
margin: 0 !important;
.popper__arrow {
display: none !important;
&::after{
display: none !important;
}
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 2.3 树状下拉框
<template>
<el-select ref="select" id="tree-select" v-model="valueLabel" :clearable="clearable" @clear="clearHandle">
<el-option class="options" v-model="value">
<el-tree
id="tree-option"
ref="selectTree"
:accordion="accordion"
:data="options"
:props="props"
:node-key="props.value"
:default-expanded-keys="[]"
@node-click="nodeClick"
></el-tree>
</el-option>
</el-select>
</template>
<script>
export default {
name: 'treeSelect',
props: {
// 配置项
props: {
type: Object,
default: () => {
return {
value: 'value', // ID字段名
label: 'label', // 显示名称
children: 'children' // 子级字段名
}
}
},
// 选项列表数据(树形结构的对象数组)
options: {
type: Array,
default: () => []
},
// 初始值
value: {
defalut: null,
twoWay: true // 需要双向绑定
},
// 可清空选项
clearable: {
type: Boolean,
default: true
},
// 自动收起
accordion: {
type: Boolean,
default: false
},
placeholder: {
type: String,
default: '请选择'
}
},
data () {
return {
valueLabel: ''
}
},
mounted () {
this.initHandle()
this.initScroll()
},
watch: {
value () {
this.initHandle()
}
},
methods: {
// 初始化滚动条
initScroll () {
this.$nextTick(() => {
let scrollWrap = document.querySelector(
'.el-scrollbar .el-select-dropdown__wrap'
)
let scrollBar = document.querySelector(
'.el-scrollbar__bar.is-vertical .el-scrollbar__thumb'
)
// 避免顶部的数据没出来
scrollWrap.style.cssText =
'margin: 0px; max-height: none; overflow: hidden;'
scrollBar.style.cssText = 'width: 0 !important;'
})
},
// 初始化值
initHandle () {
if (this.value) {
this.valueLabel = this.$refs.selectTree.getNode(this.value).data[
this.props.label
]
this.$refs.selectTree.setCurrentKey(this.valueId) // 设置默认选中
this.defaultExpandedKey = [this.valueId] // 设置默认展开
}
},
nodeClick (data, node, el) {
console.log('nodeClick', data, node, el)
this.valueLabel = data[this.props.label]
this.$emit('update:value', data[this.props.value])
this.$emit('change')
},
// 清除选中
clearHandle() {
this.$emit('update:value', null)
this.defaultExpandedKey = []
this.$emit('change')
},
}
}
</script>
<style lang="scss" scoped>
.el-scrollbar__view.el-select-dropdown__list {
.el-select-dropdown__item {
height: auto;
max-height: 274px;
padding: 0;
overflow: hidden;
overflow-y: auto;
}
}
</style>
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
44
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
72
73
74
75
76
77
78
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# 三、notification
# 3.1 绑定点击事件
let notify = this.$notify({...})
notify.$el.querySelector('.read').onclick = () => {
_this.setDialogAllRead(notify)
}
notify.close() // 关闭弹窗
1
2
3
4
5
6
2
3
4
5
6
# 四、tooltip
<template>
<div class="text-tooltip">
<el-tooltip
class="item"
effect="dark"
:disabled="isShowTooltip"
:content="content"
placement="bottom"
>
<p :class="{ 'over-flow': isOverFlow }" @mouseover="onMouseOver(refName)">
<span :ref="refName">{{ content || '-' }}</span>
</p>
</el-tooltip>
</div>
</template>
<script>
export default {
name: 'textTooltip',
props: {
// 显示的文字内容
content: {
type: String,
default: () => {
return ''
}
},
// 为页面文字标识(如在同一页面中调用多次组件,此参数不可重复)
refName: {
type: String,
default: () => {
return ''
}
}
},
data () {
return {
isShowTooltip: true,
isOverFlow: false,
parentWidth: undefined,
contentWidth: undefined
}
},
mounted () {
this.parentWidth = this.$refs[this.refName].parentNode.offsetWidth
this.contentWidth = this.$refs[this.refName].offsetWidth
if (this.contentWidth > this.parentWidth) {
this.isOverFlow = true
}
},
methods: {
onMouseOver (str) {
// 判断是否开启tooltip功能
if (this.contentWidth > this.parentWidth) {
this.isShowTooltip = false
} else {
this.isShowTooltip = true
}
}
}
}
</script>
<style lang="scss" scoped>
.text-tooltip {
white-space: nowrap;
}
.over-flow {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
</style>
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
44
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
72
73
74
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# 五、Cascader 级联选择器
# 5.1 点击label选中
// Cascader 级联选择器 点击label选中
.el-cascader-node {
padding: 0 !important;
}
.el-cascader-node__label {
padding: 0 30px !important;
}
// 单选
.el-cascader-panel .el-radio {
width: 100%;
height: 100%;
z-index: 10;
position: absolute;
padding: 10px;
}
// 多选
.el-cascader-node .el-checkbox {
width: 100%;
height: 100%;
z-index: 10;
position: absolute;
padding: 0 10px;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 六、Table 表格
# 6.1 合并表格
参考链接:https://www.cnblogs.com/steamed-twisted-roll/p/9244846.html
# 6.1.1 自定义的合并表头
# 6.1.2 自定义多级表格的导出
# 6.2 表头渲染
# 6.2.1 添加注释
renderHeader (h, { column, $index }, item) {
// console.log('渲染表头', h, column, $index, item)
if (item.remark) {
return [
column.label,
h(
'el-tooltip',
{
props: {
content: item.remark,
placement: 'top',
'popper-class': 'table-header-tooltip'
}
},
[
h('span', {
class: {
'el-icon-question': true,
'table-tooltip-icon': true
}
})
]
)
]
} else {
return [column.label]
}
}
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
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
# 6.2.2 传自定义参数
// 这里的index是自定义参数
:render-header="(h,obj) => renderLastHeader(h,obj,index)"
renderLastHeader (h, { column, $index },index) {
console.log(index)
}
1
2
3
4
5
6
2
3
4
5
6
# 七、其他
# 7.1无限滚动
- 在要实现滚动加载的列表上上添加
v-infinite-scroll
,并赋值相应的加载方法,可实现滚动到底部时自动执行加载方法。
# 7.2 表格动态合并
教程:https://juejin.cn/post/6844903792282959885