在页面使用定时器实现局部刷新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,我们很有可能捕捉不到停用的条件而无法停用。
请根据具体情况,选择一个。
参考资料: