自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

2025了,Vue3 中做輪詢的幾種最新方式

開發(fā) 前端
在 Vue3 中實(shí)現(xiàn)輪詢請(qǐng)求,以下是幾個(gè)值得推薦的解決方案和庫(kù)(包含原生方案和第三方庫(kù))。

在 Vue3 中實(shí)現(xiàn)輪詢請(qǐng)求,以下是幾個(gè)值得推薦的解決方案和庫(kù)(包含原生方案和第三方庫(kù)),我根據(jù)實(shí)際開發(fā)經(jīng)驗(yàn)為你整理推薦清單:

方案

特點(diǎn)

適用場(chǎng)景

包大小

文檔評(píng)級(jí)

vue-request

功能全面的請(qǐng)求庫(kù),內(nèi)置輪詢

需要完整請(qǐng)求管理

5.2kb

????

axios + 自封裝

靈活可控,需自行處理

簡(jiǎn)單輪詢需求

0kb

??

rxjs

響應(yīng)式編程庫(kù)

復(fù)雜輪詢邏輯

32kb

???

@vueuse/core

組合式API工具庫(kù)

組合式API項(xiàng)目

12kb

????

具體實(shí)現(xiàn)方案

(1) 推薦首選:vue-request(專為Vue3設(shè)計(jì))

npm install vue-request
<script setup>
import { useRequest } from 'vue-request';

// 輪詢獲取數(shù)據(jù)示例
const { data, loading } = useRequest(
  () => axios.get('/api/data'),
  {
    // 每3秒輪詢一次
    pollingInterval: 3000,
    // 錯(cuò)誤重試策略
    pollingWhenHidden: false, // 頁面隱藏時(shí)暫停
    pollingErrorRetryCount: 3
  }
);
</script>

<template>
  <div v-if="loading">加載中...</div>
  <div v-else>{{ data }}</div>
</template>

(2) 原生方案:使用 Composition API 封裝

// utils/usePolling.ts
import { ref, onUnmounted } from'vue';

exportfunction usePolling<T>(fn: () => Promise<T>, interval: number) {
const data = ref<T>();
const error = ref<Error>();
const isPolling = ref(true);

let timer: number;

const execute = async () => {
    try {
      data.value = await fn();
    } catch (err) {
      error.value = err asError;
    } finally {
      if (isPolling.value) {
        timer = setTimeout(execute, interval);
      }
    }
  };

const stop = () => {
    isPolling.value = false;
    clearTimeout(timer);
  };

// 自動(dòng)開始
  execute();

// 組件卸載時(shí)自動(dòng)清理
  onUnmounted(stop);

return { data, error, stop };
}
<script setup>
import { usePolling } from './utils/usePolling';

const { data, stop } = usePolling(
  () => fetch('/api/data').then(r => r.json()),
  5000
);
</script>

(3) 輕量級(jí)方案:@vueuse/core(推薦組合式API項(xiàng)目)

npm install @vueuse/core
<script setup>
import { useIntervalFn } from '@vueuse/core';

const data = ref();
const error = ref();

// 每5秒執(zhí)行一次
const { pause, resume } = useIntervalFn(async () => {
  try {
    data.value = await axios.get('/api/data');
  } catch (err) {
    error.value = err;
    pause(); // 出錯(cuò)時(shí)暫停
  }
}, 5000, { immediate: true });
</script>

(4) RxJS 方案(適合復(fù)雜場(chǎng)景)

npm install rxjs
<script setup>
import { interval, switchMap } from 'rxjs';
import { useObservable } from '@vueuse/rxjs';

const poll$ = interval(3000).pipe(
  switchMap(() => from(axios.get('/api/data')))
);

const data = useObservable(poll$);
</script>

選型建議

簡(jiǎn)單場(chǎng)景:

  • 使用 @vueuse/core 的 useIntervalFn
  • 優(yōu)點(diǎn):無需額外依賴,組合式API友好
  • 注意:需自行處理錯(cuò)誤和清理

完整請(qǐng)求管理:

  • 選擇 vue-request
  • 優(yōu)點(diǎn):內(nèi)置錯(cuò)誤重試、緩存、節(jié)流等高級(jí)功能

復(fù)雜輪詢邏輯:

  • 采用 RxJS
  • 優(yōu)點(diǎn):處理競(jìng)態(tài)條件、重試策略等復(fù)雜場(chǎng)景得心應(yīng)手

需要精細(xì)控制:

  • 自行封裝(推薦 usePolling 方案)
  • 優(yōu)點(diǎn):完全可控,適合特殊業(yè)務(wù)需求
責(zé)任編輯:趙寧寧 來源: 前端之神
相關(guān)推薦

2021-12-08 09:09:33

Vue 3 Computed Vue2

2021-08-23 13:25:25

Vue3CSS前端

2021-01-20 14:25:53

Vue3CSS前端

2022-03-24 20:42:19

Vue3API 設(shè)計(jì)Vue

2021-12-01 08:11:44

Vue3 插件Vue應(yīng)用

2025-02-25 08:51:19

2024-05-24 08:37:46

2025-03-26 10:29:22

Vue3前端API

2025-02-18 08:10:00

Vue 3JavaScrip開發(fā)

2021-11-30 08:19:43

Vue3 插件Vue應(yīng)用

2023-11-28 09:03:59

Vue.jsJavaScript

2022-07-20 11:13:05

前端JSONVue3

2024-07-01 13:45:18

2011-06-20 10:36:29

SEO

2021-12-02 05:50:35

Vue3 插件Vue應(yīng)用

2020-09-19 21:15:26

Composition

2024-03-21 08:34:49

Vue3WebSocketHTTP

2024-03-22 08:57:04

Vue3Emoji表情符號(hào)

2022-11-01 11:55:27

ReactVue3

2022-03-11 12:31:04

Vue3組件前端
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)