vue 局部数据刷新 setInterval/setTimeout

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

<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>
<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,我们很有可能捕捉不到停用的条件而无法停用。
请根据具体情况,选择一个。

参考资料: