vue3 定时刷新

2,052 阅读2分钟

前言

页面上很多地方我们会用到定时刷新,比如定时获取账户余额,或者定时获取列表信息,特别是商城一类的网站用的格外多,今天项目里面正好用到了,就来捋一下思路,大家有需要可以参考呀~

实现

大家在实战项目中,可能会有封装组件的现象,或者等等情况使数据涉及多个页面,如果是这种情况的话,大家可以把用到的数据写在vuex里面,不管在哪个页面就都能获取到最新值啦,今天把数据放在一个页面里给大家讲解,因为多个页面的话,写起来可能会比较乱。

第一步:设置变量

页面

<div v-if="loading" class="refresh-con">
  <a-space>
    <loading-outlined />
  </a-space>
</div>
<div v-else>refresh</div>
//我页面上的loading样式 是用的vue ant-design里面的 用的话不要忘记引入哦 也可以换成别的loading图标
import { LoadingOutlined } from '@ant-design/icons-vue'

export default defineComponent({
  components: { LoadingOutlined },
})

我们来设置几个我们会用到的变量

//定时器变量 方便在页面销毁的时候清楚定时器
const timer = ref<any>(null)
//页面在刷新的时候可以加loading显示 方便页面展示
const loading = ref(false)
//使countdown定时增加 如果增加到我们想要的时间 也就是变量autoRefreshTime 执行刷新
const countdown = ref(0)
//定时刷新的时间 现在设置的为6 也就是6秒刷新一次数据
const autoRefreshTime = ref(6)

第二步:关键代码 逻辑

onMounted(() => {
  timer.value = window.setInterval(() => {
    console.log(countdown.value, 'countdown')
    //不loading的时候才会执行
    if (!loading.value) {
    //countdown小于我们想要的定时时间的时候 定时器也是一秒执行一次 就继续+1 
      if (countdown.value < autoRefreshTime.value) {
        countdown.value = countdown.value + 1
        //当定时器到时间的时候 去干我们想干的事情 refresh()
        if (countdown.value === autoRefreshTime.value) {
          refresh()
        }
      }
    }
  }, 1000)
})

const refresh = () => {
    loading.value = true
    //当然这里面可以重新获取你想要的数据,我就打印了一下
    console.log('refresh')
    //然后这个定时器可以不加,拿到想要的值后执行便可,即拿到数据后我们需要做的善后工作,重置初始值
    setTimeout(() => {
        loading.value = false
        countdown.value = 0
    }, 2000)
}

第三步:清除定时器

//千万别忘了在页面销毁前清楚定时器!!对应vue2 beforeDestroy钩子
onBeforeUnmount(() => {
  window.clearInterval(walletTimer)
})

总结

代码是不是非常简单,注释写的非常详细都在里面了,可以结合gif看代码,快写起来吧!如果涉及多个页面的话,除了定时器timer变量,另外三个可以集中管理状态!