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

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

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

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

方案

特點

適用場景

包大小

文檔評級

vue-request

功能全面的請求庫,內(nèi)置輪詢

需要完整請求管理

5.2kb

????

axios + 自封裝

靈活可控,需自行處理

簡單輪詢需求

0kb

??

rxjs

響應(yīng)式編程庫

復(fù)雜輪詢邏輯

32kb

???

@vueuse/core

組合式API工具庫

組合式API項目

12kb

????

具體實現(xiàn)方案

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

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

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

// 自動開始
  execute();

// 組件卸載時自動清理
  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) 輕量級方案:@vueuse/core(推薦組合式API項目)

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(); // 出錯時暫停
  }
}, 5000, { immediate: true });
</script>

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

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>

選型建議

簡單場景:

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

完整請求管理:

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

復(fù)雜輪詢邏輯:

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

需要精細控制:

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

2021-12-08 09:09:33

Vue 3 Computed Vue2

2021-01-20 14:25:53

Vue3CSS前端

2022-03-24 20:42:19

Vue3API 設(shè)計Vue

2021-08-23 13:25:25

Vue3CSS前端

2021-12-01 08:11:44

Vue3 插件Vue應(yīng)用

2025-02-25 08:51:19

2024-05-24 08:37:46

2021-11-30 08:19:43

Vue3 插件Vue應(yīng)用

2023-11-28 09:03:59

Vue.jsJavaScript

2025-03-26 10:29:22

Vue3前端API

2025-02-18 08:10:00

Vue 3JavaScrip開發(fā)

2022-07-20 11:13:05

前端JSONVue3

2021-12-02 05:50:35

Vue3 插件Vue應(yīng)用

2024-07-01 13:45:18

2022-11-01 11:55:27

ReactVue3

2024-03-22 08:57:04

Vue3Emoji表情符號

2011-06-20 10:36:29

SEO

2024-03-21 08:34:49

Vue3WebSocketHTTP

2020-09-19 21:15:26

Composition

2022-03-11 12:31:04

Vue3組件前端
點贊
收藏

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