vue+elementui v-for 循环卡片列表

画面效果(先上效果图)

v-for维护原则

当 Vue 正在更新使用 v-for 渲染的元素列表时,它默认使用“就地更新”的策略。如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序,而是就地更新每个元素,并且确保它们在每个索引位置正确渲染。这个类似 Vue 1.x 的 track-by="$index"。

当我使用时发现,因为使用的是ajax获得列表数据,所以组件开始实例化的时候,数据值是没有的,v-for的维护原则是在原有的基础上更新,当你值为0时组件已经实例化了,当你ajax获得数据后,因为它的维护原则,你无法更新你的列表,即使有数据也没用

所以我最后使用了v-if这个指令,它是根据值注销整个组件,并重新实例化整个组件,您可以自己查以下v-if,v-show的区别。watch监听数据变化,在数据更新周期结束后重新实例化组件

组件代码

<template>  
<div v-if="reset">
//该div的子组件的child1的远程查询可以参考我之前的一篇文章,剩下2个子组件您请无视    
<div>      
    <child1 v-on:setMajor="setMajor"></child1>      
    <child2 v-on:setGrade="setGrade"></child2>      
    <child3 v-on:setClassnum="setClassnum"></child3>      
    <el-button type="primary" round @click="selectClassData">查询班级数据</el-button>          
</div>
//该div是循环卡片列表    
<div style="margin-left:1%;margin-right:1%">        
    <el-row>            
        <el-col :span="4" v-for="(item) in tabledata" :key="item.classId" :offset="1" >                
        <div style="margin-top:15px">                    
            <el-card :body-style="{ padding: '0px'}" shadow="hover">                    
            <img src="https://shadow.elemecdn.com/app/element/hamburger.9cf7b091-55e9-11e9-a976-7f4d0b07eef6.png" class="image">                    
            <div>                    
            <span>{{item.classGrade}}级{{item.classMajor}}系{{item.classNumber}}班</span><br>                    
            <div class="bottom clearfix">                    
                <time class="time"><strong>创建时间:</strong>{{item.classCreatetime}}</time>                    
                <el-button type="text" class="button" @click="add(item)">查看</el-button>                    
            </div>                
            </div>                
            </el-card>                
        </div>            
        </el-col>        
        </el-row>        
    <div style="margin-left:35%">
//该div是做分页的          
<div class="block">            
    <el-pagination            
    @size-change="handleSizeChange"            
    @current-change="handleCurrentChange"            
    :current-page="current_page"            
    :page-sizes="[4,8, 12, 16]"             
    :page-size="pagesize"                     
    layout="total, sizes, prev, pager, next"            
    :total="total">                
    </el-pagination>          
</div>        
</div>
    
    </div>  
</div>
</template>

数据格式

data() {    
    return {   
        //循环卡片列表的数据源     
        tabledata:null,        
        current_page:1,       
        total:null,        
        pagesize:8,        
        listdata:{        }, 
        //v-if根据它重新实例化组件       
        reset:false,        
        //专业的值        
        major:null,        
        //年级的值        
        grade:null,        
        //班级数字        
        classnum:null,    
        }  
}

获取数据

该方法获得后端数据,将数据赋值给tabledata

allAjax(){        
this.axios.get('http://localhost:8080/studentManagementSystem/selectTclassAll',{            
    params:{              
    limit:this.pagesize,              
    now_page:this.current_page            
    }          
    }).then((response)=>{              
        var thiz=this;                
        thiz.listdata=response.data;            
        this.$set(this.$data,'tabledata',response.data);                   
    }).catch((response)=>{          
    console.log(response);        
    })    
    },

监听数据变化

监听数据变化,数据变化就将reset赋值为true,让组件重新实例化

watch:{      
tabledata:function(){          
    this.$nextTick(function(){          
    /*现在数据已经渲染完毕*/          
    //console.log(this.tabledata);          
    this.reset=true;        
    })      
}  
}

js全部代码(因为我写了关于判断专业年级班级的功能,所以代码比较多,我懒得把其中的代码剥离出去了,您看着复制黏贴

<script>
import grade from './grade'
import classnum1 from './classnum'
import major from './major'

export default {  
name: 'classList',  
components:{    
    'child1':major,    
    'child2':grade,    
    'child3':classnum1,  
},  
data() {    
return {        
tabledata:null,        
current_page:1,        
total:null,        
pagesize:8,        
listdata:{ },        
reset:false,        
//专业的值       
major:null,        
//年级的值        
grade:null,        
//班级数字        
classnum:null,    
}  
},  methods: {    
refresh(){      
location.reload();    
},    
add(item){      
console.log("add");        
console.log(item);        
this.$router.push({name:'classInfo',params:{classInfo:item}});    
},    
handleSizeChange: function (size) {                
this.pagesize = size;                
//console.log(this.pagesize)                
this.judge();    
},    
handleCurrentChange: function(currentPage){                
this.current_page = currentPage;                
this.judge();    
},    
allAjax(){        
this.axios.get('http://localhost:8080/studentManagementSystem/selectTclassAll',{           
 params:{              
 limit:this.pagesize,              
 now_page:this.current_page            
 }          
 }).then((response)=>{              
 var thiz=this;                
 thiz.listdata=response.data;                       
 this.$set(this.$data,'tabledata',response.data);            
 //console.log(this.tabledata);        
 }).catch((response)=>{          
 console.log(response);        
 })    
 },    
 pageNumAjax(){      
 this.axios.get('http://localhost:8080/studentManagementSystem/selectNumByAll',{            
 params:{            }         
  }).then((response)=>{              
  this.total=response.data;              
  //console.log("一共有"+this.total+"条");        
  }).catch((response)=>{          
  console.log(response);        
  })    
  },    
  majorClassnumGradeAjax(){        
  let postData = this.$qs.stringify({                
  class_major:this.major,                
  class_grade:this.grade,                
  class_number:this.classnum                
  });            
  this.axios({            
  method: 'post',                  
  url:'http://localhost:8080/studentManagementSystem/selectTClassByMajorGradeNumber',            
  data:postData            
  }).then((res)=>{                
  if(res.data!='error')                    
  this.tabledata=res.data                
  // console.log(this.states);            
  });    
  },    
  majorAjax(){        
  let postData = this.$qs.stringify({                
  class_major:this.major,                
  limit:this.pagesize,                
  now_page:this.current_page,                
  });            
  this.axios({            
  method: 'post',            
  url:'http://localhost:8080/studentManagementSystem/selectTclassByMajor',            
  data:postData            
  }).then((res)=>{                
  if(res.data!='error')                    
  this.tabledata=res.data                
  // console.log(this.states);            
  });    
  },    
  classnumAjax(){        
  let postData = this.$qs.stringify({                
  class_number:this.classnum,                
  limit:this.pagesize,                
  now_page:this.current_page,                
  });            
  this.axios({            
  method: 'post',            
  url:'http://localhost:8080/studentManagementSystem/selectTclassByNum',            
  data:postData            
  }).then((res)=>{                
  if(res.data!='error')                    
  this.tabledata=res.data                
  // console.log(this.states);            
  });    },    
  gradeAjax(){        
  let postData = this.$qs.stringify({                
  class_grade:this.grade,                
  limit:this.pagesize,                
  now_page:this.current_page,                
  });           
   this.axios({            
   method: 'post',            
   url:'http://localhost:8080/studentManagementSystem/selectTclassByGrade',            
   data:postData            
   }).then((res)=>{                
   if(res.data!='error')                    
   this.tabledata=res.data                
   // console.log(this.states);            
   });    },    
   pageMajorClassnumGradeAjax(){        
   this.total=1    },    
   pageMajorAjax(){        
   let postData = this.$qs.stringify({                
   class_major:this.major                
   });            
   this.axios({           
    method: 'post',            
    url:'http://localhost:8080/studentManagementSystem/selectNumByMajor',            
    data:postData            
    }).then((res)=>{                
    if(res.data!='error')                    
    this.total=res.data;                
    // console.log(this.states);           
     });    
     },    
     pageClassnumAjax(){      
     this.axios.get('http://localhost:8080/studentManagementSystem/selectNumByNum',{            
     params:{              
     class_number:this.classnum            
     }          
     }).then((response)=>{              
     this.total=response.data;                            
     //console.log("一共有"+this.total+"条");        
     }).catch((response)=>{          
     console.log(response);        
     })    
     },    
     pageGradeAjax(){      
     this.axios.get('http://localhost:8080/studentManagementSystem/selectNumByGrade',{           
      params:{              
      class_grade:this.grade            
      }          
      }).then((response)=>{              
      this.total=response.data;              
      //console.log("一共有"+this.total+"条");        
      }).catch((response)=>{          
      console.log(response);        
      })    },    
      setGrade(value){      
      this.grade=value;      
      //console.log('setGrade:'+this.grade);    
      },    setClassnum(value){      
      this.classnum=value.value;      
      //console.log(value.value);      
      //console.log('setClassnum:'+this.classnum);    
      },    
      setMajor(value){      
      this.major=value;      
      //console.log(this.major);    
      },    
      judgeClassData(){      
      if(this.major&&this.classnum&&this.grade){        
      console.log('major num grade not null');        
      this.majorClassnumGradeAjax();        
      this.pageMajorClassnumGradeAjax();      
      }else if(this.major){        
      console.log('major not null');        
      this.majorAjax();        
      this.pageMajorAjax();      
      }else if(this.grade){        
      console.log('grade not null');        
      this.gradeAjax();        
      this.pageGradeAjax();      
      }else if(this.classnum){        
      console.log('classnum not null');        
      this.classnumAjax();        
      this.pageClassnumAjax();      
      }else{         
      this.$message('请选择班级||专业||班级序号');      
      }    
      },    
      judge(){      
      if(this.major&&this.classnum&&this.grade){        
      console.log('major num grade not null');        
      this.majorClassnumGradeAjax();      
      }else if(this.major){        
      console.log('major not null');        
      this.majorAjax();      
      }else if(this.grade){        
      console.log('grade not null');        
      this.gradeAjax();      
      }else if(this.classnum){        
      console.log('classnum not null');        
      this.classnumAjax();      
      }else{         
      this.allAjax();      
      }    
      },    
      selectClassData(){        
      this.judgeClassData();    
      }      
      },  
      beforeMount() {      
      this.allAjax();      
      this.pageNumAjax();        
      },  
      mounted() {        
      }, 

    watch:{      
    tabledata:function(){          
    this.$nextTick(function(){          
    /*现在数据已经渲染完毕*/          
    //console.log(this.tabledata);          
    this.reset=true;        
    })      
    }  
    }
}
</script>
<style scoped>
.time {    
font-size: 13px;    
color: #999;  
}    
.bottom {    
margin-top: 13px;    
line-height: 12px;  
}
  .button {   
   padding: 0;    
   float: right;  
   }
  .image {    
  width: 100%;    
  display: block;  
  }
  .clearfix:before,  
  .clearfix:after {      
  display: table;     
   content: "";  
   }    
   .clearfix:after {      
   clear: both  }
   </style>

初步实现需求

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值