首先开局一张图

需求说明,如图所示,表格中的每一行是一个复选框,点击表头的复选框,需要吧每一行中的复选框选中,当行中的复选框全部选中时自动勾选上表头的。
在UI框架中只提供了给第一列添加多选的功能,无法实现上面的功能。所以特此写下此篇博客以供有类似需求的小伙伴借鉴。
要想实现上面功能,这里用到了ElementUI中table组件的 render-header 函数,这个方法的作用可以自定义表头渲染,返回的是一个 render 方法。具体代码如下
| 12
 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
 
 | <template><div class="curd-btn">
 <el-table
 :data="tableData"
 stripe
 style="width: 100%; margin-top: 15px"
 border
 >
 <el-table-column prop="date" label="相关业务对象名称" />
 
 
 <el-table-column :render-header="renderHeader">
 <template slot-scope="scope">
 <el-checkbox
 v-model="scope.row.ownerchecked"
 @change="changeOwen"
 />
 </template>
 </el-table-column>
 
 
 <el-table-column :render-header="renderHeader2">
 <template slot-scope="scope">
 <el-checkbox
 v-model="scope.row.memberchecked"
 @change="changeMember"
 />
 </template>
 </el-table-column>
 </el-table>
 </div>
 </template>
 <script>
 export default {
 data() {
 return {
 tableData: [
 { date: '联系人'},
 { date: '送检客户'}
 ]
 }
 },
 methods: {
 
 renderHeader(h) {
 return h('div', [
 h('input', {
 style: 'margin-right:5px',
 
 attrs: {
 id: 'check1',
 type: 'checkbox'
 },
 on: {
 change: ($event) => {
 
 
 this.tableData.forEach((item) => {
 this.$set(item, 'ownerchecked', $event.target.checked)
 })
 }
 }
 }),
 h('span', '业务对象拥有人')
 ])
 },
 
 renderHeader2(h) {
 return h('div', [
 h('input', {
 style: 'margin-right:5px',
 
 attrs: {
 id: 'check2',
 type: 'checkbox'
 },
 on: {
 change: ($event) => {
 this.tableData.forEach((item) => {
 this.$set(item, 'memberchecked', $event.target.checked)
 })
 }
 }
 }),
 h('span', '业务对象团队成员')
 ])
 },
 
 remderOwnerCheck() {
 const check = document.getElementById('check1')
 check.checked = this.tableData.every((i) => i.ownerchecked)
 },
 
 remderMemberCheck() {
 const check = document.getElementById('check2')
 check.checked = this.tableData.every((i) => i.memberchecked)
 },
 
 changeOwen() {
 this.remderOwnerCheck()
 },
 changeMember() {
 this.remderMemberCheck()
 }
 }
 }
 </script>
 
 | 
上面的代码实现了点击表头改变行选中的功能。现在我们考虑下面的需求:进入页面时根据后台返回的数据自动勾选
实现这个需求之前你可能会疑惑为什么要把 remderOwnerCheck 和 remderMemberCheck 两个方法单独抽离出来,这就是为了实现这个需求而铺路的
先手动改变一下 tableData 数组的值,模拟后台返回的数据,然后当接口响应成功后调用这两个方法
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | setTimeout(() => {
 this.tableData = [
 { date: '联系人', ownerchecked: true, memberchecked:false},
 { date: '送检客户', ownerchecked: true, memberchecked:true }
 ]
 
 this.remderOwnerCheck()
 this.remderMemberCheck()
 }, 1000)
 
 | 
效果展示
