Vue中实现轮询请求的三种主流方案详解

 更新时间:2025年07月16日 09:02:52   作者:温华从此不练剑  
这篇文章主要为大家详细介绍了使用Vue实现轮询请求的三种主流方案,包括vue-request、@vueuse/core 与 RxJS,感兴趣的小伙伴可以了解下

1. 使用 vue-request 实现轮询请求

vue-request 是一个类 React 的 ahooks 风格的 Vue 数据请求 Hook 库,非常适合 Vue 3 + Composition API 项目。

安装:

npm install vue-request

示例代码 

import { defineComponent } from 'vue'
import useRequest from 'vue-request'
import axios from 'axios'
export default defineComponent({
  setup() {
    const fetchData = async () => {
      const res = await axios.get('/api/realtime-data')
      return res.data
    }
    const { data, loading } = useRequest(fetchData, {
      pollingWhenHidden: false, // 页面隐藏时不轮询
      pollingInterval: 5000,     // 每5秒请求一次
    })
    return () => (
      <div>
        {loading.value ? '加载中...' : JSON.stringify(data.value)}
      </div>
    )
  }
})

优势:

  • 内置轮询、缓存、错误重试等功能
  • 支持自动取消请求
  • 可与 Vue 组件生命周期良好配合

2. 使用 @vueuse/core 实现轮询

@vueuse/core 提供了大量 Vue 3 的组合式函数,其中 useIntervalFn 是实现轮询的理想选择。

安装:

npm install @vueuse/core

示例代码

import { defineComponent, ref } from 'vue'
import { useIntervalFn } from '@vueuse/core'
import axios from 'axios'
export default defineComponent({
  setup() {
    const data = ref(null)
    const loading = ref(false)
    const fetchData = async () => {
      loading.value = true
      try {
        const res = await axios.get('/api/realtime-data')
        data.value = res.data
      } catch (error) {
        console.error('请求失败:', error)
      } finally {
        loading.value = false
      }
    }
    const { pause, resume, isActive } = useIntervalFn(fetchData, 5000, {
      immediate: true,
      callback: fetchData
    })
    return () => (
      <div>
        <button onClick={isActive.value ? pause : resume}>
          {isActive.value ? '暂停轮询' : '开始轮询'}
        </button>
        {loading.value ? '加载中...' : JSON.stringify(data.value)}
      </div>
    )
  }
})

优势:

  • 精细控制轮询启动/暂停
  • 支持组件卸载时自动清理定时器
  • 可与其他组合函数结合使用(如 useFetch)

3. 使用 rxjs 实现轮询

RxJS 是一个强大的响应式编程库,适合需要构建复杂异步数据流的场景。

安装:

npm install rxjs

示例代码

import { defineComponent, onMounted, onUnmounted, ref } from 'vue'
import { interval, Subscription, from } from 'rxjs'
import { switchMap } from 'rxjs/operators'
import axios from 'axios'
export default defineComponent({
  setup() {
    const data = ref(null)
    const loading = ref(false)
    const error = ref(null)
    let subscription: Subscription
    onMounted(() => {
      subscription = interval(5000).pipe(
        switchMap(() => {
          loading.value = true
          return from(axios.get('/api/realtime-data'))
        })
      ).subscribe({
        next: (res) => {
          data.value = res.data
          loading.value = false
        },
        error: (err) => {
          error.value = err.message
          loading.value = false
        }
      })
    })
    onUnmounted(() => {
      if (subscription) subscription.unsubscribe()
    })
    return () => (
      <div>
        {loading.value && <p>加载中...</p>}
        {error.value && <p style="color: red;">{error.value}</p>}
        {data.value && <pre>{JSON.stringify(data.value, null, 2)}</pre>}
      </div>
    )
  }
})

优势:

  • 构建复杂的数据流(如合并多个请求、节流、过滤)
  • 错误处理更强大
  • 支持取消订阅,避免内存泄漏

轮询请求方案

方案特点适用场景
vue-request简洁易用,基于函数式调用,内置轮询、防抖、节流等特性快速实现轮询功能
@vueuse/core基于 Composition API,与 Vue 3 深度集成,提供 useIntervalFn 等工具函数更加灵活控制轮询逻辑
rxjs强大的响应式编程库,支持复杂的数据流处理需要精细控制数据流和错误处理

轮询的应用场景分析

场景描述推荐方案
实时订单状态更新用户查看订单状态是否已支付或完成@vueuse/core 或 vue-request
后台任务进度监控如文件上传、视频转码等长时间任务rxjs(便于链式处理)
聊天应用中的新消息检测当前页面未使用 WebSocket 时vue-request(简洁高效)
数据大屏展示多个图表定期刷新数据@vueuse/core(可统一控制)

轮询的注意事项

1. 性能优化:

控制轮询频率,避免频繁请求影响性能。页面不可见时暂停轮询(如使用 visibilitychange 事件)

2. 防止内存泄漏

在组件销毁时清除定时器或取消订阅

3. 错误处理机制

请求失败时进行重试或提示用户

4. 服务器压力

尽量减少并发请求数量,合理设置间隔时间

总结

根据你的项目需求和技术栈,可以选择最适合的轮询方案。对于大多数中小型项目,推荐使用 vue-request  @vueuse/core;如果你有复杂的异步流程需求,rxjs 是更好的选择。

到此这篇关于Vue中实现轮询请求的三种主流方案详解的文章就介绍到这了,更多相关Vue轮询请求内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue下跨域设置的相关介绍

    vue下跨域设置的相关介绍

    本篇文章主要介绍了vue下跨域设置的相关介绍,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 详解element-ui动态限定的日期范围选择器代码片段

    详解element-ui动态限定的日期范围选择器代码片段

    这篇文章主要介绍了element-ui动态限定的日期范围选择器代码片段,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Vue项目如何部署到Tomcat服务器上

    Vue项目如何部署到Tomcat服务器上

    这篇文章主要介绍了Vue项目如何部署到Tomcat服务器上,Vue中自带webpack,可以通过一行命令将项目打包,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-03-03
  • Vue将el-table导出为excel文件的实现方法

    Vue将el-table导出为excel文件的实现方法

    在 Vue + Element UI 中,el-table 数据导出 Excel 文件,可以使用 xlsx(SheetJS)库进行处理,以下是详细的实现方法,包括安装依赖、代码示例和优化建议,需要的朋友可以参考下
    2025-02-02
  • vue3页面query参数变化并重新加载页面数据方式

    vue3页面query参数变化并重新加载页面数据方式

    在Web开发中,页面间的跳转及数据刷新是常见问题,通过使用$router.push和$router.replace方法,可以控制页面跳转的行为,具体操作时,若发现页面ID变更后数据未刷新,可通过给router-view标签添加key值解决,若使用keep-alive
    2024-10-10
  • vue.js element-ui tree树形控件改iview的方法

    vue.js element-ui tree树形控件改iview的方法

    这篇文章主要介绍了vue.js element-ui tree树形控件改iview的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • VUE元素的隐藏和显示(v-show指令)

    VUE元素的隐藏和显示(v-show指令)

    本篇文章主要介绍了VUE元素的隐藏和显示(v-show指令),具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • vue中使用@blur获取input val值

    vue中使用@blur获取input val值

    这篇文章主要介绍了vue中使用@blur获取input val值的实现方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • vuex2中使用mapGetters/mapActions报错的解决方法

    vuex2中使用mapGetters/mapActions报错的解决方法

    这篇文章主要介绍了vuex2中使用mapGetters/mapActions报错解决方法 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-10-10
  • Vue封装Axios请求和拦截器的步骤

    Vue封装Axios请求和拦截器的步骤

    这篇文章主要介绍了Vue封装Axios请求和拦截器的步骤,帮助大家更好的对axios进行封装并将接口统一管理,同时为请求和响应设置拦截器interceptors。,感兴趣的朋友可以了解下
    2020-09-09

最新评论