在ElmentUI的Table表格组件中,也许你会使用type为selection值的多选框功能,但是此时设置的label属性不生效,不能设置标题名称;有时候我们的需求就是要添加标题名称,那该如何处理呢?当然你可以对其样式做特殊处理,也可以自定义标题,本文将描述如何利用自定义标题来添加多选框和标题名称,特别是在该过程的踩过的雷和填补过的坑。

  (一)需求:在Table表格中新增一列用于批量操作当前页的该列,例如:通过多选框来对批量设置该列的两种属性状态,选中时表示全部隐藏,不选中时表示全部显示,若部分隐藏、部分显示时多选框呈现第三种样式状态,一般是短横线表示。

  (二)方案:利用Table表格column的header属性。

  1. 利用插槽进行设置,即slot="header",这样就可以在表头中自定义样式来;若不设置该属性,那么是对列内容进行设置。
  2. 具体的代码如下:
    首先在工程目录下安装element,通过npm i element-ui -S命令安装即可;
    然后在工程中引入element,在main.js文件中添加这样两条语句:
    import ElementUI from 'element-ui';
    Vue.use(ElementUI);
    接着,我们在App.vue文件中进行测试,添加如下代码:
    <template>
        <div id="app">
        <img src="./assets/logo.png">
        <el-table :data="tableData" style="width: 100%">
           <el-table-column
               label="姓名"
               prop="name">
           </el-table-column>
           <el-table-column
               label="性别"
               prop="sex">
           </el-table-column>
           <el-table-column align="right">
           <template slot="header" slot-scope="scope">
               <el-checkbox :indeterminate="isIndeterminate" v-model="checkAll"
                @change="handleCheckAllChange">隐藏</el-checkbox>
           </template>
           <template slot-scope="scope">
               <el-checkbox v-model="scope.row.checked" @change="handleCheckOneChange">隐藏</el-checkbox>
           </template>
           </el-table-column>
        </el-table>
        <router-view/>
    </div>
    </template>
    <script>
    export default {
        name: 'App',
        data () {
          return {
            tableData: [{
               name: '李时珍',
               sex: '男',
               checked: false
            }, {
               name: '花木兰',
               sex: '女',
               checked: true
            }],
            checkAll: false,
            isIndeterminate: true
         }
       },
       methods: {
           handleCheckAllChange (val) {
               console.info('check all change is ', val)
               this.isIndeterminate = false
               this.tableData.forEach(item => {
                   item.checked = val
               })
           },
           handleCheckOneChange (val) {
               console.info('check one change is ', val)
               let totalCount = this.tableData.length
               let someStatusCount = 0
               this.tableData.forEach(item => {
                   if (item.checked === val) {
                        someStatusCount++
                   }
               })
               this.checkAll = totalCount === someStatusCount ? val : !val
               this.isIndeterminate = someStatusCount > 0 && someStatusCount < totalCount
           }
       }
    }
    </script> 
  3. 运行后的效果图如下: 

  在上图中,我们可以通过表头的隐藏多选框来批量设置列表数据,当我们选中上图“表头隐藏”多选框时,列表中的两个“隐藏”多选框都会被选中;当我们取消“表头隐藏”多选框时,列表中的两个“隐藏”多选框会同时被取消选中;当我们同时选中列表中的两个“隐藏”多选框时表头的“表头隐藏”多选框也会被选中;当我们同时取消列表中两个“隐藏”多选框时表头的“表头隐藏”多选框也会被取消选中;当列表中的两个“隐藏”多选框,一个被选中,另外一个没有被选中时表头的“表头隐藏”多选框会呈现第三种状态,样式本应该会是一条短横线,但是在上图中却没有显示预期的效果,这是在safari浏览器的效果,但是在chrome浏览器中会表现预期的第三种状态效果的。

  4.  挖坑说明:

  

  其实之初在添加这个功能的时候我是没有添加slot-scope="scope"属性,因为在开发工具中提示红色的波浪形,表示

  “[vue/no-unused-vars]
  'scope' is defined but never used.eslint-plugin-vue
  No quick fixes available”,其实这只是eslint插件的语法检查,当时我就去掉了;此外,当时还没有添加v-model="checkAll"属性,只是添加@change事件响应,此此时操作界面时表头多选框的状态能够正常切换;但是当我把v-model="checkAll"属性添加后,操作界面时发现表头的多选框的状态只跟初始值checkAll有关,若checkAll初始值为false,那么表头的多选框就会一直是取消选中的状态;若checkAll初始值为true,那么表头的多选框就会一直是选中的状态。纳闷了很久,最后我无意中添加上slot-scope="scope"这个属性,操作界面,结果表头的多选框能够正常切换状态了。这就是我给自己挖的一个坑,在这里我对Vue中的插槽功能还不是很熟悉吧,需要补一补这方面的知识。不过,最后还是自己把这个坑给填上了。

  5. 拓展

  在自定义其它类型的表头时可以参考上述流程,框架是类似的,千万不要把插槽属性省略了,否则的话会有奇怪的坑出现。

------20200112勉

ElementUI的Table表格添加自定义头CheckBox多选框的更多相关文章

  1. 表格中的checkbox复选框 全选非全选 公共方法 及提交选中结果

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  2. element-ui的table表格控件表头与内容列不对齐问题

    原文链接:点我 element-ui的table表格控件表头与内容列不对齐问题 解决方法:将以下样式代码添加到index.html.或app.vue中(必须是入口文件,起全局作用!)body .el- ...

  3. vue基于element-ui的三级CheckBox复选框

    最近vue项目需要用到三级CheckBox复选框,需要实现全选反选不确定三种状态.但是element-ui table只支持多选行,并不能支持三级及以上的多选,所以写了这篇技术博文供以后学习使用. 效 ...

  4. elementUI 学习入门之 checkbox 复选框

    CheckBox 复选框 与单选框基本类似.如:按钮样式.带边框.复选框按钮大小. eg: <template> <el-checkbox-group v-model="s ...

  5. GridPanel列头带有复选框的列

    由于工作需要,封装了ExtJS4,GridPanel列头带有复选框的列, 代码如下: /** * 列头带有复选框的列 * */ Ext.define("org.pine.widget.Che ...

  6. php获取checkbox复选框的内容

    php获取checkbox复选框的内容   由于checkbox属性,所有必须把checkbox复选择框的名字设置为一个如果checkbox[],php才能读取,以数据形式,否则不能正确的读取chec ...

  7. 转 纯CSS设置Checkbox复选框控件的样式

    Checkbox复选框是一个可能每一个网站都在使用的HTML元素,但大多数人并不给它们设置样式,所以在绝大多数网站它们看起来是一样的.为什么不把你的网站中的Checkbox设置一个与众不同的样式,甚至 ...

  8. 【转】纯CSS设置Checkbox复选框控件的样式

    Checkbox复选框是一个可能每一个网站都在使用的HTML元素,但大多数人并不给它们设置样式,所以在绝大多数网站它们看起来是一样的.为什么不把你的网站中的Checkbox设置一个与众不同的样式,甚至 ...

  9. php怎么获取checkbox复选框的内容?

    由于checkbox属性,所有必须把checkbox复选择框的名字设置为一个如果checkbox[],php才能读取,以数据形式,否则不能正确的读取checkbox复选框的值哦. <form n ...

随机推荐

  1. LAMP: 分布式 HTTP 2.4.25 + PHP 5.4.13 + MySQL 5.5.28 分离部署

    目录 A. 环境说明:B. 效果截图:C. HTTP编译安装D. MySQL二进制安装E. PHP源码编译安装F. PHP连接HTTPG. PHP支持扩展功能xcacheH. PHP连接MySQLI. ...

  2. JVM垃圾回收机制和常用算法

    由于疫情的原因,所以目前一直在家远程办公,所以很多时间在刷面试题,发现2019大厂的面试虽然种类很多,但是总结了一下发现主要是这几点:算法和数据结构. JVM.集合.多线程.数据库这几点在面试的时候比 ...

  3. Optional类包含的方法介绍及其示例

    Optional类的介绍 javadoc中的介绍 这是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回> 该对象. 使用场景 用于避免 ...

  4. Thread类的interrupted方法和isInterrupted方法的区别

    如下所示,interrupted()会改变线程的中断状态(清除),而isInterrupted()不影响线程的中断状态   /** * Tests whether the current thread ...

  5. 20200104--python学习第六天

    今日学习 集合 内存相关知识 深浅拷贝 内容回顾与补充 (1)列表: (a)reverse 反转 v1=[1,2,3111,32,13] print(v1) v1.reverse() print(v1 ...

  6. bin utilities related

    objdump -S,如果有源程序的话,将源程序与汇编代码混合在一起. 使用该选项时,输入的目标文件需要有调试信息,即用gcc -g生成的目标文件才可以,因为,调试信息中采用源程序信息. objcop ...

  7. Java第一次代码作业汇总

    练习题1:(完数问题) 求100以内的所有完数.(完数:它所有因子之和等于其本身)   方法一: /* 解体思路:1.先找出每个数的所有因子 2.比较因子之和是否与其数本身相等 */ public c ...

  8. StarUML之二、StarUML初识

    为什么用StarUML UML建模工具比较常见的PowerDesigner ROSE StarUML starUML-开源免费(1-2百M),PowerDesigner-精细和一体化(6-7百M),R ...

  9. js 预编译

    js 运行代码的时候分为几个步骤:语法分析 ==>预编译  ==>解释执行 语法解析:通篇扫描代码,查看语法是否出错 解释执行:读一行 - 解释一行 - 执行一行 预编译执行的操作: // ...

  10. ES6 - 基础学习(4): 模板字符串和字符串新增方法

    模板字符串 模板字符串:我理解为将字符串格式化.模板化,将字符串加强处理,此处的模板有动词的意思. 字符串模板基本格式: `xxxxxx`(前后都用反引号[tab键上面按键]引起来).除了作为普通字符 ...