element-ui 组件二次封装

介绍

在使用 element-ui 开发的过程中,对表格的使用比较多,且在同一个系统中表格的样式基本上是固定的,功能也基本一样。若每写一个页面都要去复制一份表格的代码,就会产生大量重复的代码,既不利于后期的维护,代码也不够简洁。为此需要前端工程师对 element-ui 的原组件进行二次封装。

准备

本题已经内置了初始代码,打开实验环境,目录结构如下:

1
2
3
4
5
6
7
8
├── element-ui-2.15.10
│ ├── index.css
│ └── index.js
├── index.html
├── js
│ ├── http-vue-loader.js
│ └── vue.min.js
└── mytable.vue

其中:

  • index.html 是主页面。
  • mytable.vue 是待封装的表格组件文件。
  • js 是用于存放 Vue.js 相关文件的文件夹。
  • element-ui-2.15.10 是存放 element-ui 的文件夹。

在浏览器中预览 index.html 页面效果显示如下所示:

图片描述

目标

element-ui 官网上具有单选功能的表格 demo 为:点击表格下方的按钮可以选中指定的某行数据。效果如下:

图片描述

从上图可以看到表格的左边有一列单选组件,但是并未实现单选功能。

图片描述

现在需要我们完善 mytable.vue 文件中的 TODO 部分,实现点击某个单选组件选中该行数据的效果。效果如下:

图片描述

实现该功能所需的 api 如下:

table 参数说明

属性参数:

参数 说明 类型
data 显示的数据 array
stripe 是否为斑马纹 table boolean
highlight-current-row 是否要高亮当前行 boolean

其中如果对表格中某个字段数据呈现个性化显示效果,则可以利用 Scoped slot 获取到 rowcolumn$indexstore(table 内部的状态管理)的数据。用法参考下面示例:

1
2
3
4
5
<el-table-column label="日期" width="180">
<template slot-scope="scope">
📅<span style="margin-left: 10px">{{ scope.row.date }}</span>
</template>
</el-table-column>

radio 参数说明

属性参数:

参数 说明 类型
value / v-model 绑定值 string / number / boolean
label Radio 的 value string / number / boolean

事件参数:

事件名称 说明 回调参数
change 绑定值变化时触发的事件 选中的 Radio label

规定

  • 请严格按照考试步骤操作,切勿修改考试默认提供项目中的文件名称、文件夹路径、idclass、DOM 结构、以及函数名等,以免造成无法判题通过。

判分标准

  • 本题完全实现题目目标得满分,否则得 0 分。

总通过次数: 1205 | 总提交次数: 1283 | 通过率: 93.9%

难度: 中等 标签: 2022, 省模拟赛, Web 前端, ElementUI

题解

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
<template>
<div class="main">
<el-table
ref="singleTable"
highlight-current-row
:data="tableData"
stripe
border
style="width: 100%"
>
<el-table-column label="单选" width="80">
<!-- TODO:完善单选按钮组件,实现需求(DOM 结构不能修改) -->
<template slot-scope="scope">
<el-radio v-model="currentRow" :label="scope.row" @change="changeRadio(scope.row)">&nbsp;</el-radio>
</template>
</el-table-column>
<el-table-column label="日期" width="180">
<template slot-scope="scope">
📅<span style="margin-left: 10px">{{ scope.row.date }}</span>
</template>
</el-table-column>
<el-table-column prop="name" label="姓名" width="180"> </el-table-column>
<el-table-column prop="address" label="地址"> </el-table-column>
</el-table>
<div class="tools">
<el-button @click="setCurrent(tableData[1])">选中第二行</el-button>
<el-button @click="setCurrent()">取消选择</el-button>
</div>
</div>
</template>

<script>
module.exports = {
props: {
tableData: {
type: Array,
default: () => [],
},
},
data() {
return {
currentRow: null,
};
},
methods: {
setCurrent(row) {
this.currentRow = row
this.$refs.singleTable.setCurrentRow(row); // 设置当前选中行
},
changeRadio(row) {
this.currentRow = row
}
},
};
</script>
<style scoped>
.main {
width: 60%;
margin: 0 auto;
}
.tools {
margin-top: 20px;
text-align: center;
}
</style>