【element-ui】使用el-checkbox完成el-table表格数据的全选操作

这篇具有很好参考价值的文章主要介绍了【element-ui】使用el-checkbox完成el-table表格数据的全选操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求:表格有一列为勾选框列,表格下面有单独的按钮本页勾选和全部勾选,跨页状态可以保存回显,如下图所示:

【element-ui】使用el-checkbox完成el-table表格数据的全选操作

思路:使用一个数组[]存储每一页是否全选的状态,再使用{}来存储数据的所有选中状态,其中key为对应的页码,value为每一页的选中数据【核心❗】

1、el-table表格每一行绑定状态,这里没有使用el-table自带的type为selection的多选框

<el-table-column
         label="选择"
         width="60"
         align="center"
   >
       <template slot-scope="scope">
       <el-checkbox v-model="scope.row.isSelect" :label="scope.row"  @change="(val) => handleSelect(val, scope.row)"><br></el-checkbox>
       </template>
 </el-table-column>

 <div style="float: left; line-height: 28px" class="ml15">
        <el-checkbox v-model="currentCheck" @change="chooseCurrent">本页全选</el-checkbox>
       <el-checkbox v-model="allCheck" @change="chooseAll" >全部选择</el-checkbox>(已选 <span class="txt_primary">{{sum}}</span> 条)
</div>

2、初始化准备好各种数据

data() {
        return {
        tableData: [], // 表格
        allCheckedList:{}, // 所有选中数据
        currentChecked:[], // 每页状态
        tablePage:[10, 1, 500],
        currentCheck:false,
        allCheck:false,
        pageSum:0,
       sum:0,
      };
   },

methods:{
           // 加载表格并初始化各项数据
            loadTable() {
                axios({
                    method: "post",
                    url: "",
                    data: {
                        ajax: true,
                        act: "", 
                    },
                }).then((response) => {
                    let resp = response.data;
                    if (resp.success) {
                        this.tableData = resp.list;
                        this.tablePage =  resp.pagging;
                        this.tableData.forEach(item=>{
                            this.$set(item, 'isSelect', false)
                        });
                        this.currentChecked = [];
                        if(this.tablePage[2]%this.tablePage[0] !=0 ){
                            this.pageSum = parseInt(this.tablePage[2]/this.tablePage[0]) + 1 ;
                        } else {
                            this.pageSum = parseInt(this.tablePage[2]/this.tablePage[0]);
                        }
                        for(let i=0; i<this.pageSum;i++){
                            this.currentChecked.push('false');
                        }
                        for(let i=1; i<=this.pageSum; i++){
                            this.allCheckedList[i] = [];
                        }
                    } else {}
                }).catch(error=> {});
            },}

3、主要的全选、单选、取消勾选等联动逻辑

   methods:{            
            // 本页全选
            chooseCurrent(){
                if(this.currentCheck){
                    this.currentChecked[(this.tablePage[1]-1)] = 'true';
                    this.tableData.forEach(item=>{
                        this.$set(item, 'isSelect', true);
                    });
                    for(let key in this.allCheckedList){
                        if(key == this.tablePage[1]){
                            this.allCheckedList[this.tablePage[1]] = deepclone(this.tableData);
                        }
                    }
                } else {
                    this.currentChecked[(this.tablePage[1]-1)] = 'false';
                    this.tableData.forEach(item=>{
                        this.$set(item, 'isSelect', false);
                    });
                    for(let key in this.allCheckedList){
                        if(key == this.tablePage[1]){
                            this.allCheckedList[this.tablePage[1]]= [];
                        }
                    }
                }
            },
            // 全部全选
            chooseAll(){
                if(this.allCheck){
                    this.currentChecked = [];
                    for(let key in this.allCheckedList){
                        this.allCheckedList[key] = [];
                    }
                    if(this.tablePage[2]%this.tablePage[0] !=0 ){
                        this.pageSum = parseInt(this.tablePage[2]/this.tablePage[0]) + 1 ;
                    } else {
                        this.pageSum = parseInt(this.tablePage[2]/this.tablePage[0]);
                    }
                    for(let i=0; i<this.pageSum;i++){
                        this.currentChecked.push('true');
                    }
                    for(let key in this.allCheckedList){
                        if(key == this.tablePage[1]){
                            this.allCheckedList[this.tablePage[1]] = deepclone(this.tableData);
                        }
                    }
                } else {
                    this.currentChecked = [];
                    for(let key in this.allCheckedList){
                        this.allCheckedList[key] = [];
                    }
                    for(let i=0; i<this.pageSum;i++){
                        this.currentChecked.push('false');
                    }
                }
            },
            // 单行选择
            handleSelect(val,row){
                if(val){
                    for (let key in this.allCheckedList){
                        if(key == this.tablePage[1]){
                            let hasObj = false;
                            this.allCheckedList[this.tablePage[1]].forEach(item =>{
                                if (item.durrec_id == row.durrec_id) {
                                    hasObj = true;
                                }
                            })
                            if (!hasObj) {
                                this.allCheckedList[this.tablePage[1]].push(row);
                            }
                        }
                    }
                } else {
                    for ( let key in this.allCheckedList){
                        if(key == this.tablePage[1]){
                            for(let i = 0; i < this.allCheckedList[this.tablePage[1]].length;i++){
                                if(row.durrec_id == this.allCheckedList[this.tablePage[1]][i].durrec_id){
                                    this.allCheckedList[this.tablePage[1]].splice(i,1)
                                }
                            }
                        }
                    }
                }
                for(let key in this.allCheckedList){
                    if(key == this.tablePage[1]){
                        if(this.allCheckedList[this.tablePage[1]].length == this.tableData.length){
                            this.currentChecked[(this.tablePage[1]-1)] = 'true';
                        } else {
                            this.currentChecked[(this.tablePage[1]-1)] = 'false';
                        }
                    }
                }
            },

           // 计算已选数据
            checkSum(){
                this.sum = 0;
                let currentSum = [];
                for(let i = 0; i<this.currentChecked.length;i++){
                    if(this.currentChecked[i] == 'true' && (i + 1) != this.pageSum){
                        currentSum.push(this.tablePage[0]);
                    } else if(this.currentChecked[i] == 'true' && (i + 1) == this.pageSum){
                        currentSum.push(this.tablePage[2] - this.tablePage[0] * (this.pageSum -1));
                    } else {
                        currentSum.push(this.allCheckedList[i+1].length);
                    }
                }
                for(let i = 0; i< currentSum.length;i++){
                    this.sum += currentSum[i];
                }
            },
    },

4、因为只能拿到当前分页的数据,无法拿到所有数据,使用watch监听了一下

    watch:{
            tableData:{
                handler (value) {
                    // 表格分页后的数据状态
                    if(this.currentChecked[(this.tablePage[1]-1)] == 'true'){
                        value.forEach(item=>{
                            this.$set(item, 'isSelect', true);
                        });
                        for(let key in this.allCheckedList){
                            if(key == this.tablePage[1]){
                                this.allCheckedList[this.tablePage[1]] = deepclone(value);
                            }
                        }
                        this.currentCheck = true;
                    } else {
                        for(let key in this.allCheckedList){
                            if(key == this.tablePage[1]){
                                if(this.allCheckedList[this.tablePage[1]].length !==0){
                                    this.allCheckedList[this.tablePage[1]].forEach(item =>{
                                        value.forEach(i=>{
                                           if(item.durrec_id == i.durrec_id){
                                               this.$set(i, 'isSelect', true);
                                           }
                                        })
                                    })
                                } else {
                                    value.forEach(item=>{
                                        this.$set(item, 'isSelect', false);
                                    })
                                }
                            }
                        }
                        this.currentCheck = false;
                    }
                    // 判断全选按钮
                    let allCheck = true;
                    this.currentChecked.forEach(checkFlag=>{
                        allCheck = allCheck && checkFlag == 'true'
                    })
                    this.allCheck = allCheck;
                    // 计算已选数量
                    this.checkSum();
                },
                deep:true
            },
            currentChecked:{
                handler(value){
                    if(value[(this.tablePage[1])-1] == 'true'){
                        this.tableData.forEach(item=>{
                            this.$set(item, 'isSelect', true);
                        })
                    } else {
                        this.tableData.forEach(item=>{
                            this.$set(item, 'isSelect', false);
                        })
                    }
                   this.checkSum();
                },
                deep:true
            },
        },

5、回传所有的已选数据,利用分页的请求又拿了一遍数据

          // 批量提醒
            allWarning(){
                if(this.allCheck){
                    axios({
                        method: "post",
                        url: "",
                        data: {
                            ajax: true,
                            act: "",
                            check:'T',
                        },
                    }).then((response) => {
                        let resp = response.data;
                        if (resp.success) {
                           // ...
                        } else {
                            this.$message.error(resp.message);
                        }
                    }).catch(error=> {
                    });
                } else {
                    let choosedIdT = [];
                    let choosedIdF = [];
                    for(let i=0; i<this.currentChecked.length; i++){
                        if(this.currentChecked[i] == 'true'){
                            axios({
                                method: 'post', url: '',
                                data: {
                                    ajax: true, act: '', page: i+1,
                                }
                            }).then( response => {
                                let resp = response.data;
                                if(resp.success){
                                    const pageList = deepclone(resp.list);
                                    pageList.forEach(item =>{
                                        choosedIdT.push(item.durrec_id);
                                    })
                                }else{
                                    Valert({msg:resp.message})
                                }
                            }).catch(error=> { });
                        } else {
                            this.allCheckedList[i+1].forEach(i=>{
                                choosedIdF.push(i.durrec_id);
                            })
                        }
                    }
                    setTimeout(()=>{
                        const ids = choosedIdT.concat(choosedIdF);
                        axios({
                            method: "post",
                            url: "/",
                            data: {
                                ajax: true,
                                act: "",
                                check:'F',
                                id:ids.join(","),
                            },
                            loading:{ target:".table"}
                        }).then((response) => {
                            let resp = response.data;
                            if (resp.success) {
                                // ...
                            } else {
                                this.$message.error(resp.message);
                            }
                        }).catch(error=> { });
                    },300)
                }
            },

记录一些繁琐精巧的笨方法😉文章来源地址https://www.toymoban.com/news/detail-504743.html

到了这里,关于【element-ui】使用el-checkbox完成el-table表格数据的全选操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 开发需求15-使用el-checkbox组件实现el-tree组件的父子关联关系(非全选/全不选)

    需求描述: 大家都知道el-tree可以很明显的通过选中来体现上下节点的父子选中状态,那么如果要求把后端把el-tree的数据结构,通过一个展开的list返回给你,使用el-checkbox组件渲染每一个节点,同时要求选中某一个节点,同时可以选中其父节点和子节点;取消也是一样。 思路

    2024年04月17日
    浏览(61)
  • element-ui checkbox 组件源码分享

    简单分享 checkbox 组件,主要从以下三个方面来分享: 1、组件的页面结构 2、组件的属性 3、组件的方法 一、组件的页面结构 二、组件的属性 2.1 value / v-model 属性,绑定的值,类型 string / number / boolean,无默认值。 首先讨论单个 checkbox,通过 props 接收 父组件传递过来的 va

    2024年03月24日
    浏览(90)
  • 解决el-checkbox点击文字也会选中

    最近要做一个 多选框嵌套下拉框的一个功能,在点击下拉框时,多选框一直会被选中或者取消,这里做一下解决记录 首先展示一下要做的功能 出现原因: el 的checkbox的组件整个是由lable包裹的,所以重写el-checkbox就可以了 原编码: 解决: 这里用div或者span都是可以的,div会

    2024年02月05日
    浏览(43)
  • vue 实现element-ui checkbox全选操作

    简单写法

    2024年02月15日
    浏览(44)
  • vue使用element-ui,el-table不显示

    例如:新增了一个表格,按官网代码贴过来的,结果一直不显示 代码如下一模一样,其他数据正常显示,就表格不显示 其实版本库不一致导致的,贼坑,又不提示 先卸载element-ui安装一个低版本的element-ui就可以解决``

    2024年02月11日
    浏览(66)
  • Vue, Element-UI 滚动条: el-scrollbar 基本使用

    参与修改前端项目(Vue, Element-UI),添加用户体验性需求,只涉及页面UI,未涉及数据交互 为一个窗口添加滑动栏 使用el-scrollbar 框架 注意 1,默认xy都有滑动栏,添加以下代码可以隐藏x轴的滑动栏 2,style中 1). 必须去掉scoped,否则overflow-x: hidden失效 2.)外包一个div 来减少

    2024年02月15日
    浏览(41)
  • 使用element-ui el-select 做下拉 全选+搜索 功能

    使用element-ui el-select 做下拉 全选+搜索 功能 有时候,需要用到下拉列表 全选和搜索,并且鼠标放入的时候有下拉列表展示。以前的做法是 check + el-input搜索结合做个组件,现在这个方法直接使用el-select 就能做到这个需求功能:有搜索+有全选+有取消+有确认请求+有鼠标移入自

    2024年02月11日
    浏览(58)
  • element-ui中el-progress的复杂型使用场景

    根据目前的element-ui, 无法直接使用format属性去循环动态添加多个环形进度条的指定文字内容, 因为format中限定了函数参数 ,如下: 因此采取了一些迂回的写法 如下图:

    2024年02月16日
    浏览(56)
  • vue、element-ui使用el-tooltip判断文本是否溢出

    1.需求:需要实现文本单行显示,超出时,使用省略号,划过该文本时使用tooltip显示全部文本。需要考虑数据是由接口动态获取,只有溢出文本鼠标滑过时显示全部文本,没有溢出的则不需要。 2.实现: 第一步:首先要判断文本是否溢出 这里网上可以找到很多方法,我是用

    2024年01月21日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包