自定义表格表头----element(疑难杂症一)
尽管element 表格有相关属性方法的说明,但是总有那么几个是难以理解的。这篇主要针对自定义表格表头的 render-header 方法。
例子:
(1)基础表格
<template>
<el-table :data="tableData" style="width: 100%">
<el-table-column prop="date" label="日期" width="180"></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>
</template>
<script>
export default {
data() {
return {
tableData: [{
date: '2016-05-02',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}, {
date: '2016-05-04',
name: '王小虎',
address: '上海市普陀区金沙江路 1517 弄'
}, {
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1519 弄'
}, {
date: '2016-05-03',
name: '王小虎',
address: '上海市普陀区金沙江路 1516 弄'
}]
}
}
}
</script>
(2)添加单选列
<el-table-column align="center" label="选择">
<template slot-scope="scope">
<el-radio v-model="couponId" :label="scope.row.id" > </el-radio>
</template>
</el-table-column>
效果
(3)表格之间的单选:
<el-radio v-model="couponId" :label="scope.row.id" @change="selectChecked(scope.$index,scope.row)">
</el-radio>
只要couponId == id ;就选中
selectChecked(index,row){
this.couponId = row.id ;
}
到此,表格之间的单选已经实现
单选列表头是不是感觉选择有点不合时宜,更想要和下面的单选按钮一样那就OK了。没错,是时候大展身手了:render-header
(3)render-header 登场 在选择列添加以下方法
<el-table-column align="center" :render-header="modifiedCaption"></el-table-column>
在methods:编写方法
modifiedCaption(h, { column, $index }){
return h('span', [
h('span',column.label),
h('div',
{
class:this.couponId==0?'red-star-icon':'red-star-icon-select',
on: {
click: this.change
}
}),
]);
},
css 是随便写的,仅供参考
.red-star-icon{
position: relative;
width:14px;
height:14px;
border:1px solid #ccc;
border-radius:100%;
padding-right:0;
padding-left:0px !important;
margin-top:8px;
margin-left:-13px;
background:#fff
}
.red-star-icon::after,.red-star-icon-select::after{
width: 4px;
height: 4px;
border-radius: 100%;
background-color: #fff;
content: "";
position: absolute;
left: 50%;
top: 50%;
margin-top: -2px;
margin-left: -2px;
}
.red-star-icon-select{
position: relative;
width:14px;
height:14px;
border:1px solid #ccc;
border-radius:100%;
padding-right:0;
padding-left:0px !important;
margin-top:8px;
margin-left:-13px;
background:red;
border-color: #409EFF;
background: #409EFF;
}
效果如下:
果真是想要的效果。但是希望只有选中,她也被选中,在class运用三元运算符即可,
(4) 点击头部按钮取消选中,只需要初始化就OK
change(val) {
if(this.couponId !== '' || this.couponId != null){
this.couponId = 0 ;
}
},
想要的效果已经实现:附全码
html
<script src="//unpkg.com/vue/dist/vue.js"></script>
<script src="//unpkg.com/[email protected]/lib/index.js"></script>
<div id="app">
<template>
<el-table :data="tableData" style="width: 100%">
<el-table-column align="center" :render-header="modifiedCaption">
<template slot-scope="scope">
<el-radio v-model="couponId" :label="scope.row.id" @change="selectChecked(scope.$index,scope.row)"> </el-radio>
</template>
</el-table-column>
<el-table-column prop="date" label="日期" width="180">
</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>
</template>
</div>
js
var Main = {
data() {
return {
couponId:0,
tableData: [{
id:1,
date: '2016-05-02',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}, {
id:2,
date: '2016-05-04',
name: '王小虎',
address: '上海市普陀区金沙江路 1517 弄'
}, {
id:3,
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1519 弄'
}, {
id:4,
date: '2016-05-03',
name: '王小虎',
address: '上海市普陀区金沙江路 1516 弄'
}]
}
},
methods:{
change(val) {
if(this.couponId !== '' || this.couponId != null){
this.couponId = 0 ;
}
},
modifiedCaption(h, { column, $index }){
return h('span', [
h('span',column.label),
h('div',
{
class:this.couponId==0?'red-star-icon':'red-star-icon-select',
on: {
click: this.change
}
}),
]);
},
selectChecked(index,row){
this.couponId = row.id ;
}
}
}
var Ctor = Vue.extend(Main)
new Ctor().$mount('#app')
css
.red-star-icon{
position: relative;
width:14px;
height:14px;
border:1px solid #ccc;
border-radius:100%;
padding-right:0;
padding-left:0px !important;
margin-top:8px;
margin-left:-13px;
background:#fff
}
.red-star-icon::after,.red-star-icon-select::after{
width: 4px;
height: 4px;
border-radius: 100%;
background-color: #fff;
content: "";
position: absolute;
left: 50%;
top: 50%;
margin-top: -2px;
margin-left: -2px;
}
.red-star-icon-select{
position: relative;
width:14px;
height:14px;
border:1px solid #ccc;
border-radius:100%;
padding-right:0;
padding-left:0px !important;
margin-top:8px;
margin-left:-13px;
background:red;
border-color: #409EFF;
background: #409EFF;
}
直接在elm 官网例子中把各个部分复制黏贴就可以看到效果。https://jsfiddle.net/hzq8240a/1/