穿梭框带分页(element-ui)

穿梭框带分页(element-ui)

因为在项目中,穿梭框带有分页,使用elementui的时候,切换分页的时候,右侧的数据也跟着变化,于是自己手写了一个带分页的穿梭框,并且切换分页的时候,右侧数据不变化
<template>
    <div class="transfer">
        <div class="leftTransfer">
            <div class="leftTransfer_title">
                <el-checkbox :indeterminate="left.isIndeterminate" v-model="left.checkAll" @change="leftHandleCheckAllChange">{{left.title}}</el-checkbox>
                <span>{{left.transferDataChecked.length}}/{{left.transferData.length}}</span>
            </div>
            <div style="margin: 15px 0;"></div>
            <el-checkbox-group v-model="left.transferDataChecked" @change="leftHandleCheckedCitiesChange">
                <el-checkbox v-for="item in left.transferData" :label="item" :key="item.id">{{item.name}}</el-checkbox>
            </el-checkbox-group>
             <el-pagination
                class="pagination"
                @current-change="handleCurrentChange"
                layout="prev, pager, next"
                :total="page.total"
                >
            </el-pagination>
        </div>
        <div class="transferButton">
            <el-button type="primary" @click="push"></el-button>
            <el-button type="primary" @click="del"></el-button>
        </div>
        <div class="rightTransfer">
            <div class="rightTransfer_title">
                <el-checkbox :indeterminate="right.isIndeterminate" v-model="right.checkAll" @change="rightHandleCheckAllChange">{{right.title}}</el-checkbox>
                <span>{{right.transferDataChecked.length}}/{{right.transferData.length}}</span>
            </div>
            <div style="margin: 15px 0;"></div>
            <el-checkbox-group v-model="right.transferDataChecked" @change="rightHandleCheckedCitiesChange">
                <el-checkbox v-for="item in right.transferData" :label="item" :key="item.id">{{item.name}}</el-checkbox>
            </el-checkbox-group>
        </div>
    </div>
</template>

<script>
    export default {
        name:'transfer',
        data(){
            return {
                left:{
                    isIndeterminate:false,//半选按钮
                    checkAll:false,//是否点击全选
                    title:'left',
                    transferData:[],//穿梭框左侧全部数据
                    transferDataChecked:[]//穿梭框左侧选中数据
                },
                right:{
                    isIndeterminate:false,//半选按钮
                    checkAll:false,//是否点击全选
                    title:'right',
                    transferData:[],//穿梭框右侧全部数据
                    transferDataChecked:[]//穿梭框右侧选中数据
                },
                page:{
                    total:0,
                    pageNo:1,
                }
            }
        },
        created(){
            this.initTransferData(0,10)
        },
        methods:{
            // 初始化数据
            initTransferData(numstart,numend){
                for (let i = 0; i<=20; i++) {
                    this.left.transferData[i]='成都'+i
                }
                this.page.total=this.left.transferData.length
                this.left.transferData=this.left.transferData.map((item,index)=>{
                    return{
                        id:index,
                        name:item,
                        pageNo:this.page.pageNo
                    }
                }).slice(numstart,numend)
            },
            // 左侧是否点击全选
            leftHandleCheckAllChange(val){
                this.left.transferDataChecked = val ? this.left.transferData : [];
                this.left.isIndeterminate = false;
            },
            // 左侧勾选数据
             leftHandleCheckedCitiesChange(value) {
                let checkedCount = value.length;
                this.left.checkAll = checkedCount === this.left.transferData.length;
                this.left.isIndeterminate = checkedCount > 0 && checkedCount < this.left.transferData.length;
            },
             // 左侧是否点击全选
            rightHandleCheckAllChange(val){
                this.right.transferDataChecked = val ? this.right.transferData : [];
                this.right.isIndeterminate = false;
            },
            // 左侧勾选数据
            rightHandleCheckedCitiesChange(value) {
                let checkedCount = value.length;
                this.right.checkAll = checkedCount === this.right.transferData.length;
                this.right.isIndeterminate = checkedCount > 0 && checkedCount < this.right.transferData.length;
            },
            // 穿梭框选中数据
            push(){
                // 数据移到右侧
                this.right.transferData=[...this.right.transferData,...this.left.transferDataChecked].sort((a,b)=>{
                    return a.id-b.id
                })
                // 获得一个右边的数据,只有纯id
                let checkedIdArr = this.right.transferData.map((item) => {
                    return item.id
                })
                // 左侧数据删除
                this.left.transferData=this.left.transferData.filter(item=>{
                    if(!(checkedIdArr.includes(item.id))){
                        return item
                    }
                })
                // 每次推送完之后,重置选中框
                this.left.transferDataChecked=[]
                this.left.isIndeterminate = false;
                this.left.checkAll=false
            },
            // 穿梭框删除数据 回显的时候根据pageno回显到当前
            del(){
            	//过滤当前页选中的数据
                let arr = this.right.transferDataChecked.filter(item=>{
                    if(this.page.pageNo==item.pageNo){
                        return item
                    }
                })
                // 数据移到左侧
                this.left.transferData=[...this.left.transferData,...arr].sort((a,b)=>{
                    return a.id-b.id
                })
                // 获得一个右边的数据,只有纯id
                let checkedIdArr = this.right.transferDataChecked.map((item) => {
                    return item.id
                })
                // 删除选中的数据
                this.right.transferData=this.right.transferData.filter(item=>{
                    if(!(checkedIdArr.includes(item.id))){
                        return item
                    }
                })
                // 每次推送完之后,重置选中框
                this.right.transferDataChecked = []
                this.right.isIndeterminate = false;
                this.right.checkAll=false
            },
            handleCurrentChange(val){
                this.page.pageNo=val
                if(val==1){
                this.initTransferData(0,10)
                }else if(val==2){
                this.initTransferData(10,20)
                }else{
                this.initTransferData(20,30)
                }
                let rightId = this.right.transferData.map((item) => {
                    return item.id
                })
                this.left.transferData = this.left.transferData.filter(item => {
                    if (!(rightId.includes(item.id))) {
                        return item
                    }
                })
            }
        }
    }
</script>

<style lang="less" scoped>
.transfer{
    width: 60%;
    display: flex;
    justify-content: space-between;
    align-items: center;
    .transferButton{
        .el-button{
            display: block;
            margin: 10px 0;
        }
    }
    .leftTransfer,.rightTransfer{

        position: relative;
        width: 34%;
        height: 300px;
        border: 1px solid #000;
        .el-checkbox{
            display: block;
        }
        .pagination{
            position: absolute;
            bottom: 0;
        }
        .leftTransfer_title,.rightTransfer_title{
            display: flex;
            justify-content: space-between;
        }
    }
}


</style>

效果图片


版权声明:本文为Amy_dan520原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。