美文网首页
vue 局部数据刷新 setInterval/setTimeou

vue 局部数据刷新 setInterval/setTimeou

作者: Ann_l | 来源:发表于2017-10-17 11:44 被阅读0次

在页面使用定时器实现局部刷新setInterval

<div>
      <ul class="counter-board">
        <li class="num-board" v-for="item in totelNumber">
                        <span class="num u">
                            <i class="w">{{item}}</i>
                        </span>
          <span class="num b">
                            <i class="w">{{item}}</i>
                        </span>
        </li>
      </ul>
    </div>
<script>

export default {
    data(){
        return {
            totelNumber: new Array(8)
        }
    },
    beforeMount() {
         //设置定时器,每3秒刷新一次
         var self = this;
         setInterval(getTotelNumber,1000)
         function getTotelNumber() {
             for(let i=0; i < self.totelNumber.length; i++){
                  self.totelNumber[i] = Math.ceil(Math.random()*10) -1 
             }
             console.log(self.totelNumber)// 实时更新,但是dom却没有变化
         }
         getTotelNumber();      
    }
}
</script>
在代码中console会发现数据实时更新,但是dom却没有变化。之后在网上寻觅,发现在以下情况下,数据变动不触发视图更新
需要注意的是有两种情况不会触发视图更新,需要换种变通写法:

- 当你利用索引直接设置一个项时,例如: vm.items[indexOfItem] = newValue
- 当你修改数组的长度时,例如: vm.items.length = newLength

将代码更为以下

<script>

export default {
    data(){
        return {
            totelNumber: new Array(8)
        }
    },
    beforeMount() {
         //设置定时器,每3秒刷新一次
         var self = this;
         setInterval(getTotelNumber,1000)
         function getTotelNumber() {
             let newArray = new Array(8)
             for(let i=0; i < self.totelNumber.length; i++){
                newArray[i] = Math.ceil(Math.random()*10) -1
            }
            self.totelNumber = newArray
         }
         getTotelNumber();      
    }
}
</script>

还有关于清除setTimeout定时器
问题案例:a.vue 文件中触发setTimeout后,使用按钮跳转至其他页面,快速返回至a.vue页面后 发现定时器仍然在走。

created() {  
    if ( this.timeOut ) {  
        clearTimeout(this.timeOut);  
    }  
    this.getListIng();  
},  
computed: {  
    timeOut: {  
        set (val) {  
            this.$store.state.timeout.compileTimeout = val;  
        },  
        get() {  
            return this.$store.state.timeout.compileTimeout;  
        }  
    },  
},  
methods: {  
    getListIng() {  
        // 这里是一个http的异步请求  
        if ( getUrlModule() == 'aaa' ) {  
            let _this = this;  
            this.timeOut = setTimeout(() => {  
                _this.getListIng();  
            }, 5000);  
        } else {  
            this.timeOut = '';  
        }  
    },  
}  
(1)如上面代码所示,当创建页面(created执行)时,会先判断变量this.timeOut是否存在,如果存在,先clearTimeout掉。
(2)而,this.timeOut这个变量对应的是全局store里的this.$store.state.timeout.compileTimeout。并且是双向绑定的,这个
请自行搜索vue2.0中computed用法。
(3)在我们的主函数getListIng()中,会先使用函数getUrlModule()根据url判断当前页面是否是aaa页面,如果是的,就执行setTimeOut,
如果不是,就不行执行了,并且设置this.timeOut = '';

我们假设上面没有if ( getUrlModule() == 'aaa' ) 这句判断,会出现,当我们已经跳出了当前aaa页面,去了bbb页面并且一直停留在bbb页面时,
还有setTimeout在执行,就会不断有http的请求。

如果没有if ( this.timeOut ) { clearTimeout(this.timeOut); } 这句代码。当我们不断在2个页面之间切换时,且切换的频率很高。会出现多次创建
setTimeout的情况。

总结

(1)vue中$store里创建的变量,其实是全局变量,这个变量在切换页面时不会清除,当我们刷新页面时会清除掉。
(2)在前端页面中,当我们刷新页面时,会将当前页面之前创建的setTimeout以及其他定时器都清除掉。但是,切换页面(仅仅是路由切换)是不会清除的。
(3)setTimeout、setinterval有本质的不同,前者只执行一次,除非你在回调中,不断的调用,而后者是不间断调用的。但是,我在各种实践中发现,
还是setTimeout好用。因为,setTimeout可以根据条件,及时在回调中停用。如果采用setinterval,我们很有可能捕捉不到停用的条件而无法停用。
请根据具体情况,选择一个。

参考资料:

setInterval
http://www.jianshu.com/p/180957762852
setTimeout
http://blog.csdn.net/hustxiaoxian/article/details/77621823

相关文章

  • vue 局部数据刷新 setInterval/setTimeou

    在页面使用定时器实现局部刷新setInterval 在代码中console会发现数据实时更新,但是dom却没有变化...

  • vuejs入门-子路由(三)

    上次说了整页导航,这次我们说页面局部导航局部导航白话就是:页面局部刷新或是视图局部刷新 1.搭建项目:vue in...

  • vue的坑和使用总结

    路由变化页面数据不刷新问题 2.setInterval路由跳转继续运行并没有及时进行销毁 3.vue 滚动行为用法...

  • 2017拼多多前端笔试

    简答题: settimeout 与 setInterval的区别, 及对他们的内存的分析 区别 setTimeou...

  • day10-左滑删除

    数据刷新01全局刷新数据刷新02局部刷新 是什么? UITableViewDataSource 的代理方法./**...

  • vue的优势

    vue是单页面应用,页面局部刷新 ,响应的数据绑定/响应式编程,组件化,轻量级框架,简单易学,双向数据绑定,视图数...

  • day10-数据刷新02局部刷新

    数据刷新01全局刷新 reloadData - 全局刷新,屏幕能看见的cell的数据,全部再次加载. 局部刷新 :...

  • day10-滑动时自定义多个按钮

    数据刷新01全局刷新数据刷新02局部刷新左滑删除 是什么? UITableViewDelegate - 代理方法 ...

  • Vue关于局部刷新

    在Vue中,我们经常遇到对数据进行增删改查的操作之后, 希望页面显示的是我们操作之后最新的数据, 为了避免重新做a...

  • vue组件局部刷新

网友评论

      本文标题:vue 局部数据刷新 setInterval/setTimeou

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