60.实现elementUI表格点击某一行选中勾选框

前言:

项目中需要做到除了勾选表格第一列勾选框去选中数据外,还要通过点击某一行任何地方,都可以勾选到这条数据,并且要做到选中的数据不能重复,记录一下:

(全选和选中勾选框的方法就不写了 这里只写通过点击行选中勾选框)

1.首先给<el-table>添加 ref='multipleTable' 和 @row-click="handleClickTableRow"

<el-table 
    ...... 
    ref="multipleTable" 
    @row-click="handleClickTableRow">
    ......
</el-table>

2.在handleClickTableRow方法里,通过判断结果数组里是否存在这条数据而决定是否添加进去

// 点击行勾选数据
handleClickTableRow(row,event,column){
    // checkNum和isCheck是批量操作按钮和已选几条展示的依据
    this.checkNum = 0
    this.isCheck = false
    // 如果status为无效不让勾选
    if(row.status == '0'){
        return
    }else{
        // 选中这行数据 勾选框会勾选上
        this.$refs.multipleTable.toggleRowSelection(row)
        if(this.batchDeleteArr.length > 0){
            // 如果结果数组不为空,判断所选的这条是否在结果数组里
            if(JSON.stringify(this.batchDeleteArr).indexOf(JSON.stringify(row)) == -1){
                this.batchDeleteArr.push(row)
            }else{
                // 所选数据在结果数组里,那就要清除掉它,不然会造成数据重复
                this.batchDeleteArr.map((item,index) =>{
                    if(item.id == row.id){
                        this.batchDeleteArr.splice(index,1)
                    }
                })
            }
        }else{
            this.batchDeleteArr.push(row)
        }
    }
    // 这里几行代码是根据结果数组是否有值判断批量操作按钮和已选几条展示是否需要解除置灰和展示
    if(this.batchDeleteArr.length > 0){
        this.checkNum = this.batchDeleteArr.length
        this.isCheck = true
    }else{
        this.isCheck = false
    }
}

3.又发现一个问题,就是在全选后取消全选,之后再通过点击行,就不能勾选上数据了,解决方法就是:

(1)data里设置allCheck:false,

(2)在全选方法里设置 this.allCheck = true

(3)在上边的点击行勾选数据方法里,在this.$refs.multipleTable.toggleRowSelection(row) 这行代码前,添加判断,通过判断allCheck是否为true,从而设置结果数组为空:

if(this.allCheck == true){
    this.batchDeleteArr = []
    this.allCheck = false
}

4.按照第3条更改之后,发现,全选后取消全选,之后通过点击行,是能勾选上数据,但是,这样一来,全选后,不取消全选的情况,如果点击行,就没办法取消勾选了,经过一系列操作后,有了以下解决方法:

(1)取消第3条添加的代码

(2)在handleClickTableRow方法里,更改代码如下:

// 点击行勾选数据
handleClickTableRow(row,event,column){
    // checkNum和isCheck是批量操作按钮和已选几条展示的依据
    this.checkNum = 0
    this.isCheck = false
    // 如果status为无效不让勾选
    if(row.status == '0'){
        return
    }else{
        if(this.batchDeleteArr.length > 0){
            // 如果结果数组不为空,判断所选的这条是否在结果数组里
            if(JSON.stringify(this.batchDeleteArr).indexOf(JSON.stringify(row)) == -1){
                this.batchDeleteArr.push(row)
                this.$refs.multipleTable.toggleRowSelection(row,true)
            }else{
                // 所选数据在结果数组里,那就要清除掉它,不然会造成数据重复
                this.batchDeleteArr.map((item,index) =>{
                    if(item.id == row.id){
                        this.batchDeleteArr.splice(index,1)
                        this.$refs.multipleTable.toggleRowSelection(row,false)
                    }
                })
            }
        }else{
            this.batchDeleteArr.push(row)
            this.$refs.multipleTable.toggleRowSelection(row,true)
        }
    }
    // 这里几行代码是根据结果数组是否有值判断批量操作按钮和已选几条展示是否需要解除置灰和展示
    if(this.batchDeleteArr.length > 0){
        this.checkNum = this.batchDeleteArr.length
        this.isCheck = true
    }else{
        this.isCheck = false
    }
}

5.还有一点需要改的就是,点击操作列,也会勾选上数据,这显然是不对的,需要在判断status是否为0之前 先判断event.label是否等于“操作”,如果等于“操作”,就return。

handleClickTableRow方法里,更改代码如下:

// 点击行勾选数据
handleClickTableRow(row,event,column){
    // checkNum和isCheck是批量操作按钮和已选几条展示的依据
    this.checkNum = 0
    this.isCheck = false
    if(event.label == '操作'){
        return
    }else{
        // 如果status为无效不让勾选
        if(row.status == '0'){
            return
        }else{
            if(this.batchDeleteArr.length > 0){
                // 如果结果数组不为空,判断所选的这条是否在结果数组里
                if(JSON.stringify(this.batchDeleteArr)
                 .indexOf(JSON.stringify(row)) == -1){
                    this.batchDeleteArr.push(row)
                    this.$refs.multipleTable.toggleRowSelection(row,true)
                }else{
                    // 所选数据在结果数组里,那就要清除掉它,不然会造成数据重复
                    this.batchDeleteArr.map((item,index) =>{
                        if(item.id == row.id){
                            this.batchDeleteArr.splice(index,1)
                            this.$refs.multipleTable.toggleRowSelection(row,false)
                        }
                    })
                }
            }else{
                this.batchDeleteArr.push(row)
                this.$refs.multipleTable.toggleRowSelection(row,true)
            }
        }
    }
    // 这里几行代码是根据结果数组是否有值判断批量操作按钮和已选几条展示是否需要解除置灰和展示
    if(this.batchDeleteArr.length > 0){
        this.checkNum = this.batchDeleteArr.length
        this.isCheck = true
    }else{
        this.isCheck = false
    }
}

Element UI是一个基于Vue 2.0的桌面端组件库,它提供了一套完整的组件来帮助开发者快速搭建优雅的页面。在Element UI的表格组件中,如果你想要隐藏某些行的勾选框,可以通过自定义列模板的方式来实现。 这里有一个简单的例子来说明如何隐藏部分勾选框: ```vue <template> <el-table :data="tableData" style="width: 100%"> <el-table-column type="selection" width="55"></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 label="操作"> <template slot-scope="scope"> <!-- 判断当前行是否需要显示勾选框 --> <el-checkbox v-if="showCheck(scope.$index)" v-model="scope.row.checked"></el-checkbox> </template> </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 弄' }] } }, methods: { // 根据条件判断是否显示勾选框 showCheck(index) { // 这里可以根据实际需求返回true或false // 例如,我们可以决定每隔一行显示一个勾选框 return index % 2 === 0; } } } </script> ``` 在上面的代码中,我们通过`<el-table-column>`的自定义模板`slot-scope="scope"`来控制勾选框的显示。`showCheck`方法用于决定是否显示某一行勾选框。这里以简单的方式举例,实际应用中你可以根据实际的数据条件来决定是否显示。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值