vue配合elementUI完成全选功能

14 篇文章 0 订阅

vue配合elementUI完成全选功能

  <template>
      <div class="deliverySetting">
        <div class="deliverySetting-btn">
          <div class="tabs-btn ac">
            <input type="button" value="分配派送商" @click="showSetDistributorDailog">
          </div>
          <div class="tabs-btn ac">
            <input type="button" value="取消分配" @click="showCancelDistributorDailog">
          </div>
        </div>
    
        <div class="deliverySetting-table">
          <div class="table-head">
            <div class="selection">
              <el-checkbox :indeterminate="indeterminate" v-model="ischeckAll" @change="handleCheckAllChange"></el-checkbox>
            </div>
            <div class="width185">分区名称</div>
            <div class="width265">国家</div>
            <div>派送商</div>
          </div>
          <div class="table-body" v-for="(partition,partitionIndex) in distributorsInfo" :key="partitionIndex">
            <div class="selection">
              <p><el-checkbox :indeterminate="partition.indeterminate" v-model="partition.selected" @change="handleCheckedCountryAllChange(partitionIndex,partition.partitionId,$event)" :key="partitionIndex"></el-checkbox></p>
            </div>
            <div class="width185"><p>{{ partition.partitionName }}</p></div>
            <div class="width265">
              <el-checkbox v-for="country in partition.country" v-model="country.selected" @change="handleCheckedCountryChange(partitionIndex,country.id,partition.partitionId,$event)" :label="country" :key="country.id">{{country.fieldName}}</el-checkbox>
            </div>
            <div>
              <p v-for="(item,index) in partition.country" :key="index">
                {{ item.distributors }}
              </p>
            </div>
          </div>
        </div>
    
        <!-- 分配派送商dailog -->
        <el-dialog title="分配派送商" :visible.sync="setDistributorDailog" width="480px">
          <el-form :model="distributorForm" :rules="rules" class="setDistributorDailog">
            <el-form-item label="派送代理商" label-width="120px">
              <el-input v-model="distributorForm.vendorName" auto-complete="off" placeholder="请输入供应商名称"></el-input>
            </el-form-item>
            <el-form-item label="末端派送商" prop="senderName" label-width="120px">
              <el-select v-model="distributorForm.senderName"
              filterable
              allow-create
              default-first-option
              placeholder="请选派送商名称">
                <el-option label="派送商1" value="shanghai"></el-option>
                <el-option label="派送商2" value="beijing"></el-option>
              </el-select>
            </el-form-item>
            <el-form-item label="派送商官网" prop="website" label-width="120px">
              <el-input v-model="distributorForm.website" auto-complete="off" placeholder="请输入派送商官网"></el-input>
            </el-form-item>
          </el-form>
          <div slot="footer" class="dialog-footer">
            <el-button @click="setDistributorDailog = false">取 消</el-button>
            <el-button type="primary" @click="setDistributorDailog = false">确 定</el-button>
          </div>
        </el-dialog>
    
        <!-- 取消分配派送商 -->
        <el-dialog title="停止提示" :visible.sync="cancelDistributorDailog" :modal="false" width="480px" custom-class="stop-coupon-dialog">
          <p><br></p>
          <p class="ac f16">您确定要取消对的派送分配吗?</p>
          <p><br></p>
          <span slot="footer" class="dialog-footer">
            <el-button @click="cancelDistributorDailog = false">取 消</el-button>
            <el-button type="primary" @click="cancelDistributorDailog=false">确 定</el-button>
          </span>
        </el-dialog>
      </div>
    </template>
    <script>
      export default {
        name:'deliverySetting',
        components: {
        },
        props:{
        },
        data() {
          return {
            distributorsInfo:[
              { partitionName:'1区',selected:false,partitionId:1,isIndeterminate:false,
                country:[
                {  id: "1",fieldName: "奥地利",fieldTableName: "奥地利",distributors:'UPS',selected: false},
                {  id: "2",fieldName: "芬兰",fieldTableName: "芬兰",distributors:'UPS',selected: false},
                {  id: "3",fieldName: "意大利",fieldTableName: "意大利",distributors:'UPS',selected: false},
                {  id: "4",fieldName: "葡萄牙",fieldTableName: "葡萄牙",distributors:'UPS',selected: false},
                {  id: "9",fieldName: "西班牙",fieldTableName: "西班牙",distributors:'UPS',selected: false},
                {  id: "10",fieldName: "瑞典",fieldTableName: "瑞典",distributors:'UPS',selected: false},]
              },
              { partitionName:'2区',selected:false,partitionId:2,isIndeterminate:false,
                country:[
                {  id: "5",fieldName: "丹麦",fieldTableName: "单买",distributors:'',selected: false},
                {  id: "6",fieldName: "法国",fieldTableName: "法国",distributors:'',selected: false},]
              },
              { partitionName:'3区',selected:false,partitionId:3,isIndeterminate:false,
                country:[
                {  id: "7",fieldName: "德国",fieldTableName: "德国",distributors:'YODEL',selected: false},
                {  id: "8",fieldName: "瑞士",fieldTableName: "瑞士",distributors:'DPD',selected: false}]
              }
            ],
            ischeckAll:false,//一级全选状态
            setDistributorDailog:false,
            cancelDistributorDailog:false,
            distributorForm:{
              vendorName:'',
              senderName:''
            },
            indeterminate:false,
            rules: {
              senderName: [{ required: true, message: '字段不能为空',trigger: 'blur'}],
              website: [{ required: true, message: '字段不能为空',trigger: 'blur'}],
            },
          }
        },
        computed: {
        },
        methods: {
          handleCheckAllChange(e){//一级change事件
            this.ischeckAll = e
            if(e == true){
              this.indeterminate = false
              for(var i=0,len=this.distributorsInfo.length; i<len; i++){ //二级全选反选不确定
                this.distributorsInfo[i].selected = e
                for(var j=0,len1=this.distributorsInfo[i].country.length; j<len1; j++){
                  this.distributorsInfo[i].country[j].selected = e
                }
              }
            }else{
              this.indeterminate = false
              for(var i=0,len=this.distributorsInfo.length; i<len; i++){ //三级全选反选不确定
                this.distributorsInfo[i].selected = e
                for(var j=0,len1=this.distributorsInfo[i].country.length; j<len1; j++){
                  this.distributorsInfo[i].country[j].selected = e
                }
              }
            }
          },
          handleCheckedCountryAllChange(index, topId, e){//二级change事件
            this.distributorsInfo[index].selected = e//二级勾选后,子级全部勾选或者取消
            if(e == false) this.distributorsInfo[index].indeterminate = false //去掉二级不确定状态
            var childrenArray = this.distributorsInfo[index].country
            if(childrenArray)
              for(var i=0,len=childrenArray.length; i<len; i++)
                childrenArray[i].selected = e
    
            this.getIsCheckAll()
          },
          handleCheckedCountryChange(topIndex, sonId, topId, e){//三级change事件
            var childrenArray = this.distributorsInfo[topIndex].country
            var tickCount = 0, unTickCount = 0, len = childrenArray.length
            for(var i = 0; i < len; i++){
              if(sonId == childrenArray[i].id) childrenArray[i].selected = e
              if(childrenArray[i].selected == true) tickCount++
              if(childrenArray[i].selected == false) unTickCount++
            }
            if(tickCount == len) {//三级级全勾选
              this.distributorsInfo[topIndex].selected = true 
              this.distributorsInfo[topIndex].indeterminate = false
            } else if(unTickCount == len) {//三级级全不勾选
              this.distributorsInfo[topIndex].selected = false 
              this.distributorsInfo[topIndex].indeterminate = false
            } else {
              this.distributorsInfo[topIndex].selected = false
              this.distributorsInfo[topIndex].indeterminate = true //添加二级不确定状态
            }
    
            this.getIsCheckAll()
          },
          getIsCheckAll(){
            var tickCount = 0, unTickCount = 0, ArrLength = this.distributorsInfo.length
            for(var j=0; j<ArrLength; j++){//全选checkbox状态
              if(this.distributorsInfo[j].selected == true) tickCount++
              if(this.distributorsInfo[j].selected == false) unTickCount++
            }
            if(tickCount == ArrLength) {//二级全勾选
              this.ischeckAll = true
              this.indeterminate = false
            } else if(unTickCount == ArrLength) {//二级全不勾选
              this.ischeckAll = false
              this.indeterminate = false
            } else {
              this.ischeckAll = false
              this.indeterminate = true //添加一级不确定状态
            }
          },
    
          showSetDistributorDailog(){
            this.setDistributorDailog=true
          },
          showCancelDistributorDailog(){
            this.cancelDistributorDailog=true
          }
        },
        created: function() {
        },
        mounted: function() {
          // (async() => {
        },
        watch: {
        }
      }
    </script>
    <style>
    .deliverySetting{
      padding: 20px 0;
      position: relative;
      .el-table{
        thead{
          tr{
            th{
              font-size: 14px;
            }
          }
        }
        tbody{
          tr{
            td{
              vertical-align: baseline;
              p{
                line-height: 30px;
              }
              .el-checkbox-group{
                display: flex;
                flex-direction: column;
                label{
                  line-height: 30px;
                  margin-left: 0;
                }
              }
            }
          }
        }
      }
      .deliverySetting-table{
        font-size: 14px;
        color: #333;
        .table-head,
        .table-body{
          display: flex;
          padding: 10px 0;
          .selection{
            width: 45px;
            text-align: center;
            line-height: 36px;
          }
          .width185{
            width: 185px;
          }
          .width265{
            width: 265px;
          }
        }
        .table-head{
          height: 36px;
          align-items: center;
          background-color: #E7F2FF;
        }
        .table-body{
          border-bottom: 1px solid #e4e4e4;
          color: #666;
          &:hover{
            background-color: #f5f7fa;
          }
          .width265{
            display: flex;
            flex-direction: column;
            label{
              line-height: 30px;
              margin-left: 0;
              color: #666;
            }
          }
          p{
            line-height: 30px;
          }
        }
      }
      .deliverySetting-btn{
        /*width: 100%;*/
        height: 59px;
        display: flex;
        justify-content: flex-end;
        align-items: center;
        position: absolute;
        top: -55px;
        right: -16px;
        z-index: 100;
        .tabs-btn {
          min-width: 90px;
          height: 34px;
          line-height: 32px;
          padding: 0 10px;
          color: #2387f7;
          border: solid 1px #4fa2ff;
          background-color: #e7f2ff;
          cursor: pointer;
          &:nth-of-type(2) {
            margin: 0 15px;
          }
          input {
            border: none;
            background: transparent;
            color: inherit;
            cursor: inherit;
            outline: none;
            margin: 0;
            padding: 0;
          }
          &:hover {
            color: #fff;
            background-color: #2387f7;
          }
        }
      }
      .setDistributorDailog{
        .el-input{
          width: 270px;
        }
      }
    }
    </style>
以下是一个使用 Vue 2 和 Element UI 实现的多选全选开源项目的示例代码: ```html <template> <div> <el-checkbox v-model="allSelected" @change="selectAll">{{selectAllText}}</el-checkbox> <br /> <el-checkbox-group v-model="selectedItems"> <el-checkbox v-for="item in items" :key="item.id" :label="item">{{item.label}}</el-checkbox> </el-checkbox-group> </div> </template> <script> export default { data() { return { items: [ { id: 1, label: 'Item 1' }, { id: 2, label: 'Item 2' }, { id: 3, label: 'Item 3' }, { id: 4, label: 'Item 4' } ], selectedItems: [], allSelected: false } }, computed: { selectAllText() { return this.allSelected ? 'Deselect All' : 'Select All' } }, methods: { selectAll() { if (this.allSelected) { this.selectedItems = [...this.items] } else { this.selectedItems = [] } } } } </script> ``` 在该示例中,我们首先渲染一个“全选”复选框,并将其绑定到 `allSelected` 数据属性上。当用户更改复选框的选中状态时,我们会调用 `selectAll` 方法,该方法将根据 `allSelected` 数据属性将所有项目添加到或从 `selectedItems` 数组中删除。 接下来,我们使用 `el-checkbox-group` 组件渲染每个项目,并将其绑定到 `selectedItems` 数据属性上。最后,我们使用 `computed` 属性计算“全选”复选框的文本,该文本根据 `allSelected` 数据属性而变化。 这是一个基本示例,您可以根据需要进行扩展和定制。希望这可以帮助到您!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

情系半生e

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值