使用vue的v-for生成table , 給table加上序號


現在有一個使用mybatis的分頁插件生成的table,table中數據是通過vue獲得的 , 前台顯示使用<tr v-for="item in items">

后台vue獲取數據使用分頁插件進行查詢然后使用回調,將結果返回給vue的一個model

/**
 * 分頁控件加載
 * @param data
 */
function aspnetPagerInfoIM(pageDataShow,pageModule,resource, modelCallBack) {

    var pageDataShow = $("#"+pageDataShow);
    var pageModule = $("#"+pageModule);
    pageDataShow.empty();
    pageModule.empty();

    resource.get({
        page: '0'
    }).then(function(response){
        initLaypage(pageDataShow,pageModule,response.data, resource, modelCallBack);
        modelCallBack(response.data.content);
    })
}

/**
 * 初始化分頁組件
 * @param page 查詢出來的數據包括分頁信息
 * @param resource vue的resource對象
 * @param modelCallBack 每次頁面跳轉回調方法 modelCallBack(response.data.content)
 */
function initLaypage(pageDataShow,pageModule,page, resource, modelCallBack) {

    var singleInvoke = false
    laypage({
        cont : pageModule,
        pages : page.totalPages, //總頁數
        skin : '#fff', //加載內置皮膚
        skip: true,       //是否開啟跳頁
        groups : 5,       //連續顯示分頁數
        hash : true,      //開啟hash
        jump : function(obj) {
            if(!singleInvoke) {
                singleInvoke = true;
            }else {
                resource.get({
                    page: obj.curr -1
                }).then(function(response){
                    modelCallBack(response.data.content);
                })
            }
            pageDataShow.empty();
            if(page.totalElements>0){
                $("<p>共"+page.totalElements+"條記錄,"
                    +"每頁"+page.size+"條,"
                    +"當前第 "+obj.curr +"/"+page.totalPages+"頁"
                    +"</p>").appendTo(pageDataShow);
            }
        }
    });
}

 

需求是:給生成的table添加序號

剛開始使用js的函數

function rownum(){
  //首先拿到table中tr的數量 得到一共多少條數據
var len = $("#tableId table tbody tr").length;
//使用循環給每條數據加上序號
for(var i = 1;i<len+1;i++){ $('#tableId table tr:eq('+i+') span:first').text(i); } }

將上面的方法放在點擊生成table的事件上 , 可以顯示序號,接着點擊分頁的下一頁或者頁數,跳轉到下一頁的時候,序號消失了,

很自然的想到在點擊下一頁后也應該有添加序號的操作,於是找到顯示下一頁數據的方法,加上上面的js方法,結果沒有生效,

個人覺得是查出數據后rownum方法在dom沒刷新前進行了添加,然后dom更新后,序號消失了

通過查找資料最終像下面這樣使用解決了問題 , 在每個出現分頁查詢的地方都加上 Vue.nextTick(function(){})方法

 
         
var model={
object[]
}
spnetPagerInfoIM(electricalPageDataShow, electricalPageModule, electricalResource, function(result) {
model.object = result;
Vue.nextTick(function(){
rownum();
});
});
 
        

 

一、vm.$nextTick( [callback] )

 

image.png

 

 

 

二、Vue.nextTick( [callback, context] )

 

image.png

 

三、異步更新隊列

 

image.png

 

 實例

<ul id="demo">
    <li v-for="item in list">{{item}}</div>
</ul>
 
new Vue({
    el:'#demo',
    data:{
        list=[0,1,2,3,4,5,6,7,8,9,10]
    },
    methods:{
        push:function(){
            this.list.push(11);
            this.nextTick(function(){
                alert('數據已經更新')
            });
            this.$nextTick(function(){
                alert('v-for渲染已經完成')
            })
        }
    }})

或者

this.$http.post(apiUrl)
    .then((response) => {
    if (response.data.success) {
        this.topFocus.data = response.data.data;
        this.$nextTick(function(){
                    //渲染完畢
        });
        }
    }).catch(function(response) {
        console.log(response);
    });

 

 

什么時候需要用的Vue.nextTick()

 

  1. 你在Vue生命周期的created()鈎子函數進行的DOM操作一定要放在Vue.nextTick()的回調函數中。原因是什么呢,原因是在created()鈎子函數執行的時候DOM 其實並未進行任何渲染,而此時進行DOM操作無異於徒勞,所以此處一定要將DOM操作的js代碼放進Vue.nextTick()的回調函數中。與之對應的就是mounted鈎子函數,因為該鈎子函數執行時所有的DOM掛載和渲染都已完成,此時在該鈎子函數中進行任何DOM操作都不會有問題 。

  2. 在數據變化后要執行的某個操作,而這個操作需要使用隨數據改變而改變的DOM結構的時候,這個操作都應該放進Vue.nextTick()的回調函數中。

Vue是異步執行dom更新的,一旦觀察到數據變化,Vue就會開啟一個隊列,然后把在同一個事件循環 (event loop) 當中觀察到數據變化的 watcher 推送進這個隊列。如果這個watcher被觸發多次,只會被推送到隊列一次。這種緩沖行為可以有效的去掉重復數據造成的不必要的計算和DOm操作。而在下一個事件循環時,Vue會清空隊列,並進行必要的DOM更新。
當你設置 vm.someData = 'new value',DOM 並不會馬上更新,而是在異步隊列被清除,也就是下一個事件循環開始時執行更新時才會進行必要的DOM更新。如果此時你想要根據更新的 DOM 狀態去做某些事情,就會出現問題。。為了在數據變化之后等待 Vue 完成更新 DOM ,可以在數據變化之后立即使用 Vue.nextTick(callback) 。這樣回調函數在 DOM 更新完成后就會調用。

 

總結:

* `Vue.nextTick(callback)`,當數據發生變化,更新后執行回調。
* `Vue.$nextTick(callback)`,當dom發生變化,更新后執行的回調。

 

具體可以參考: http://www.flowerboys.cn/VueJs/2017/0614/99.html

 

另外一種簡單方法:

 

 <tr v-for="(index,item) in demo">
     <td>
<
input type="checkbox" name="Checkbox" class="check" value="{{item.id}}" style="float:none;height:auto;"> <span style="float: right;">{{$index + 1}}</span> </td>
</tr>

 

給每個循環的對象加上index , 使用{{$index}}獲取該對象所在位置, 從0開始, 然后加1, 變成{{$index + 1}},這就是顯示在頁面的內容了

效果如下:

             

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM