美文网首页
VUE多选删除列表遇到的坑

VUE多选删除列表遇到的坑

作者: 努力做个全栈 | 来源:发表于2022-09-07 09:29 被阅读0次

    页面效果

    450fac086a7442c6873bcc9bc2e1872f.png

    数据结构

            list: [{
              name: '名称1',
              indexs: [{
                tag: '标签1'
              },{
                tag: '标签2'
              },{
                tag: '标签3'
              },{
                tag: '标签4'
              }]
            },{
              name: '名称2',
              indexs: [{
                tag: '标签11'
              },{
                tag: '标签22'
              },{
                tag: '标签33'
              },{
                tag: '标签44'
              },{
                tag: '标签55'
              },{
                tag: '标签66'
              }]
            },{
              name: '名称3',
              indexs: [{
                tag: '标签111'
              },{
                tag: '标签222'
              }]
            },{
              name: '名称4',
              indexs: [{
                tag: '标签1111'
              },{
                tag: '标签2222'
              },{
                tag: '标签3333'
              }]
            },{
              name: '名称5',
              indexs: [{
                tag: '标签1'
              }]
            }]
    

    实现功能

    右侧多选框选中后批量删除,无接口对接本地实现,

    遇到问题

    一开始一直想的是foreach循环如果选中就删除,使用的foreach+splice(),然后遇到如下问题,选中四个只删除了两个(当时脑子不知道咋想的。。。)
    [图片上传失败...(image-44b5f3-1662600608087)]

    // 最开始写的删除方法
          deleteBtn() {
            this.list.forEach((i) =>{
              i.indexs.forEach((c,cIndex) =>{
                if(c.checked == true) {
                  console.log(c.checked);
                  i.indexs.splice(cIndex,1)
                }
              });
            });
           }
    

    解决办法

            this.list.forEach((i) =>{
              // 删除选中对象
              i.indexs = i.indexs.filter(item => {
                return !item.checked
              });
            });
            // 该名称下标签为空删除名称
            this.list = this.list.filter(item2 => {
              return item2.indexs.length > 0;
            });
    

    页面全部代码如下

    <template>
      <div style="width: 50%;margin: 0 auto">
        <div align="right">
          <button @click="deleteBtn()">删除指标</button>
        </div>
        <ul class="bq-title">
          <li>名称</li>
          <li>标签</li>
        </ul>
        <ul class="bq-con" v-for="(item,index) in list" :key="index">
          <li :style="{lineHeight:`${30*item.indexs.length}px`}">
            <span>{{item.name}}</span>
          </li>
          <li>
            <div v-for="(iItem,iIndex) in item.indexs" :key="iIndex">
              <span class="mb-5" :title="iItem.tag">{{iItem.tag}}</span>
              <el-checkbox v-model="iItem.checked" class="checkbox" ref="checkbox"></el-checkbox>
            </div>
          </li>
        </ul>
      </div>
    </template>
    
    <script>
      export default {
        name: 'home',
        data() {
          return {
            list: [{
              name: '名称1',
              indexs: [{
                tag: '标签1'
              },{
                tag: '标签2'
              },{
                tag: '标签3'
              },{
                tag: '标签4'
              }]
            },{
              name: '名称2',
              indexs: [{
                tag: '标签11'
              },{
                tag: '标签22'
              },{
                tag: '标签33'
              },{
                tag: '标签44'
              },{
                tag: '标签55'
              },{
                tag: '标签66'
              }]
            },{
              name: '名称3',
              indexs: [{
                tag: '标签111'
              },{
                tag: '标签222'
              }]
            },{
              name: '名称4',
              indexs: [{
                tag: '标签1111'
              },{
                tag: '标签2222'
              },{
                tag: '标签3333'
              }]
            },{
              name: '名称5',
              indexs: [{
                tag: '标签1'
              }]
            }]
          }
        },
        methods:{
          deleteBtn() {
            // 最开始的写法
            // this.list.forEach((i) =>{
            //   i.indexs.forEach((c,cIndex) =>{
            //     if(c.checked == true) {
            //       i.indexs.splice(cIndex,1)
            //     }
            //   });
            // });
            this.list.forEach((i) =>{
              // 删除选中对象
              i.indexs = i.indexs.filter(item => {
                return !item.checked
              });
            });
            // 该名称下标签为空删除名称
            this.list = this.list.filter(item2 => {
              return item2.indexs.length > 0;
            });
            // 取消多选框选中
            this.$refs.checkbox.forEach((i) =>{
              if(i.model == true) {
                i.model =false;
              }
            })
          },
        },
      }
    </script>
    <style lang="less" scoped>
    button{
      background: red;
      color: white;
      border: none;
      padding: 10px 30px;
      border-radius: 10px;
      margin-bottom: 20px;
    }
      .bq-title {
        overflow: hidden;
        background: #849f9c;
        height: 30px;
        line-height: 30px;
        color: white;
      li{
        float: left;
        width: 45%;
        text-align: center;
      }
      }
      .bq-con{
        background: #eff9f8;
        border-radius: 5px;
        padding: 5px;
        margin-top: 15px;
        overflow: hidden;
        .checkbox{
          margin-left: 3px;
        }
        li{
          float: left;
          width: 45%;
          text-align: center;
          div{
            height: 28px;
            margin: 0 auto 5px auto;
          }
          span{
            font-size: 14px;
            border-radius: 5px;
            height: 28px;
            line-height: 28px;
            width: 80%;
            background: #c5dad8;
            display: inline-block;
          }
          .mb-5{
            margin: 0 auto 5px auto;
          }
        }
      }
    </style>
    
    

    相关文章

      网友评论

          本文标题:VUE多选删除列表遇到的坑

          本文链接:https://www.haomeiwen.com/subject/rpannrtx.html