vue v-for循環渲染完畢在加載事件


在做項目時,我們經常要用到for循環渲染dom,常用到的主要時一些for循環的圖片

然而jv-for循環是有時就需要做些等待for循環渲染后在執行的事件,例如(項目中用到的滑動組件,圖片加載完后要重定向,或者是一些需要等待渲染完后才觸發的事件)

解決方法一

主要是用到vue中的 watch + vm.nextTick

watch是 監聽某一個data數據發生變化就執行方法

nextTich: 在下次 DOM 更新循環結束之后執行延遲回調。在修改數據之后立即使用這個方法,獲取更新后的 DOM。

下面是例子代碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<! DOCTYPE  html>
< html  lang="en">
< head >
     < meta  charset="UTF-8">
     < title >Title</ title >
</ head >
< body >
< setion >
     < option  value="1" v-for="(item,key) in arr" :key="key">{{ item }}</ option >
</ setion >
</ body >
< script  type="text/javascript">
     vm = new Vue({
         el:'.app',
         data: {
             arr: [],
         },
         wathc:{
             arr: function() {
                 this.$nextTick(function(){
                     /*現在數據已經渲染完畢*/
                 })
             }
         },
         mounted:function() {
             var that = this;
             axios.get('url',{
                 params:{
                     link: '',
                 }
             }).then(function(res){
                 that.arr = res;
             })
         }
     })
</ script >
</ html >

  



不過有時還有一種情況就是
wathc監聽數組的變化,用nextTick觸發事件,正常來講是for循環渲染后只觸發一次nextTick事件。然而本人試過在使用微信js-sdk做微信打開相冊上傳圖片功能時,需要等他選擇完圖片渲染完在做別的操作
本人當時就用到了wathc+nextTick,發現一個問題就是for中每次加一個數據就觸發一次nextTick,(就是例如for添加了2個數據,就觸發兩次nextTick),不是本人要求的那個,需求應該時渲染完后只觸發一次
nextTick,也就時等最后一個數據渲染完成后觸發,,(主要是他觸發了多次wathc,造成多個nextTick事件)
這時就要用到 setInterval 定時器 設置了, 
代碼是
復制代碼
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<setion>
    <option value="1" v-for="(item,key) in arr" :key="key">{{ item }}</option>
</setion>
</body>
<script type="text/javascript">
    vm = new Vue({
        el:'.app',
        data: {
            arr: [],
            imgSetInterval:null,
        },
        wathc:{
            arr: function() {
                clearInterval(this.imgSetInterval)
                this.$nextTick(function(){
                    this.imgSetInterval=setInterval(function () {
                        console.log('img定時器')
                        clearInterval(that.imgSetInterval)
                    },1000)
                })
            }
        },
        mounted:function() {
            var that = this;
            axios.get('url',{
                params:{
                    link: '',
                }
            }).then(function(res){
                that.arr = res;
            })
        }
    })
</script>
</html>
復制代碼

 


上面是針對vue的v-for循環渲染完畢在加載事件,本人覺得是比較好的解決辦法
還有一種是js的定期器
使用setTimeout中的事件差來解決,不過本人不推薦,主要是有個時間的不確定性,(不知道v-for循環渲染完畢的時間,不同設備的時間也是不一樣的)

 


免責聲明!

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



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