欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue3?響應(yīng)式高階用法之customRef()的使用

 更新時間:2024年09月24日 09:42:21   作者:訾博ZiBo  
customRef()是Vue3的高級工具,允許開發(fā)者創(chuàng)建具有復(fù)雜依賴跟蹤和自定義更新邏輯的ref對象,本文詳細介紹了customRef()的使用場景、基本用法、功能詳解以及最佳實踐,包括防抖、異步更新等用例,旨在幫助開發(fā)者更好地理解和使用這一強大功能

一、簡介

在 Vue3 中,響應(yīng)式系統(tǒng)是其核心特性之一。customRef() 是 Vue3 提供的一種高級工具,允許開發(fā)者創(chuàng)建自定義的 ref 對象。這些對象可以包含更復(fù)雜的依賴跟蹤和更新邏輯,滿足特定的業(yè)務(wù)需求。本文將詳細介紹 customRef() 的使用場景、基本用法以及一些最佳實踐。

二、使用場景

customRef() 適用于以下場景:

  • 復(fù)雜的依賴跟蹤:需要對依賴關(guān)系進行精細控制。
  • 自定義更新邏輯:需要在更新值時執(zhí)行特定邏輯,如防抖、節(jié)流等。
  • 異步操作:需要在異步操作完成后更新值。

三、基本使用

3.1 customRef() 的基本概念

customRef() 接收一個工廠函數(shù),該函數(shù)返回一個包含 get 和 set 方法的對象。這些方法用于讀取和修改引用值,并且可以在內(nèi)部顯式地控制依賴關(guān)系的跟蹤和響應(yīng)式更新。

3.2 代碼示例

以下是一個實現(xiàn)防抖功能的 ref 示例:

<script lang="ts" setup>
import { customRef } from 'vue';

function debouncedRef(initialValue, delay) {
  let timeoutId;
  return customRef((track, trigger) => ({
    get() {
      // 使用 track 函數(shù)標(biāo)記依賴
      track();
      return initialValue;
    },
    set(newValue) {
      clearTimeout(timeoutId);
      timeoutId = setTimeout(() => {
        initialValue = newValue;
        // 使用 trigger 函數(shù)觸發(fā)依賴更新
        trigger();
      }, delay);
    }
  }));
}

// 使用自定義的ref
const myDebouncedRef = debouncedRef('Hello World', 500);
</script>

在上述例子中,debouncedRef 是一個自定義的 ref 工廠函數(shù),它接收兩個參數(shù):初始值和延遲時間。當(dāng) set 方法被調(diào)用時,會清除之前的計時器并設(shè)置一個新的計時器,在延遲時間結(jié)束后更新值并觸發(fā)依賴更新。

四、功能詳解

4.1 防抖功能詳解

防抖(Debounce)是一種在指定時間內(nèi)忽略多次觸發(fā),只在最后一次觸發(fā)后的一段時間內(nèi)執(zhí)行的技術(shù)。上面的 debouncedRef 實現(xiàn)了這一功能,當(dāng)我們頻繁更新 ref 的值時,只有在最后一次更新后的延遲時間結(jié)束后,值才會被真正更新。

4.2 關(guān)鍵函數(shù) track 和 trigger

  • track:用于標(biāo)記依賴,告訴 Vue 這個 ref 的值被讀取了。
  • trigger:用于觸發(fā)依賴更新,告訴 Vue 這個 ref 的值被修改了。

五、最佳實踐及案例

5.1 異步更新

以下是一個異步更新 ref 的示例:

<script lang="ts" setup>
import { customRef } from 'vue';

function asyncRef(initialValue, asyncFunction) {
  return customRef((track, trigger) => ({
    get() {
      track();
      return initialValue;
    },
    async set(newValue) {
      initialValue = await asyncFunction(newValue);
      trigger();
    }
  }));
}

// 使用自定義的ref
const myAsyncRef = asyncRef('Initial Value', async (value) => {
  // 模擬異步操作
  await new Promise(resolve => setTimeout(resolve, 1000));
  return value.toUpperCase();
});
</script>

在這個示例中,asyncRef 接收一個初始值和一個異步函數(shù)。當(dāng) set 方法被調(diào)用時,會執(zhí)行異步函數(shù)并在完成后更新值。

5.2 條件性更新

<script lang="ts" setup>
import { customRef } from 'vue';

function conditionalRef(initialValue, conditionFunction) {
  return customRef((track, trigger) => ({
    get() {
      track();
      return initialValue;
    },
    set(newValue) {
      if (conditionFunction(newValue)) {
        initialValue = newValue;
        trigger();
      }
    }
  }));
}

// 使用自定義的ref
const myConditionalRef = conditionalRef(0, value => value >= 0);
</script>

在這個示例中,conditionalRef 只有在滿足特定條件時才會更新值。

六、總結(jié)

customRef() 是 Vue3 中一個非常強大的工具,允許開發(fā)者根據(jù)自己的需求創(chuàng)建自定義的 ref 對象。通過合理使用 customRef(),我們可以實現(xiàn)防抖、節(jié)流、異步更新等復(fù)雜的響應(yīng)式邏輯,從而提高代碼的靈活性和可維護性。

到此這篇關(guān)于Vue3 響應(yīng)式高階用法之customRef()的使用的文章就介紹到這了,更多相關(guān)Vue3 customRef()內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • el-upload前端實現(xiàn)多文件上傳功能示例

    el-upload前端實現(xiàn)多文件上傳功能示例

    在Vue.js中可以使用Element UI庫中的<el-upload>組件來實現(xiàn)多文件上傳的功能,這篇文章主要給大家介紹了關(guān)于el-upload前端實現(xiàn)多文件上傳功能的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • Vue.js開發(fā)環(huán)境搭建

    Vue.js開發(fā)環(huán)境搭建

    Vue.js(讀音 /vju&#720;/, 類似于 view) 是一套構(gòu)建用戶界面的 漸進式框架。本文給大家介紹Vue.js開發(fā)環(huán)境搭建的詳解講解,感興趣的朋友一起看看吧
    2016-11-11
  • Vue.js學(xué)習(xí)筆記之常用模板語法詳解

    Vue.js學(xué)習(xí)筆記之常用模板語法詳解

    本篇文章主要介紹了Vue.js學(xué)習(xí)筆記之常用模板語法詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • vue 單元測試初探

    vue 單元測試初探

    這篇文章主要介紹了vue 單元測試的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下
    2021-04-04
  • 在Vue中使用echarts的實例代碼(3種圖)

    在Vue中使用echarts的實例代碼(3種圖)

    本篇文章主要介紹了在Vue中使用echarts的實例代碼(3種圖),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • Vue實現(xiàn)登錄記住賬號密碼功能的思路與過程

    Vue實現(xiàn)登錄記住賬號密碼功能的思路與過程

    最近在學(xué)習(xí)vue,發(fā)現(xiàn)了vue的好多坑,下面這篇文章主要給大家介紹了關(guān)于Vue實現(xiàn)登錄記住賬號密碼功能的思路與過程,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-11-11
  • vue防止花括號{{}}閃爍v-text和v-html、v-cloak用法示例

    vue防止花括號{{}}閃爍v-text和v-html、v-cloak用法示例

    這篇文章主要介紹了vue防止花括號{{}}閃爍v-text和v-html、v-cloak用法,結(jié)合實例形式分析了vue.js使用v-text和v-html、v-cloak防止花括號{{}}閃爍的解決方法,需要的朋友可以參考下
    2019-03-03
  • vuecli3打包后出現(xiàn)跨域問題,前端配置攔截器無效的解決

    vuecli3打包后出現(xiàn)跨域問題,前端配置攔截器無效的解決

    這篇文章主要介紹了vuecli3打包后出現(xiàn)跨域問題,前端配置攔截器無效的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • vue踩坑之backgroundImage路徑問題及解決

    vue踩坑之backgroundImage路徑問題及解決

    這篇文章主要介紹了vue踩坑之backgroundImage路徑問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Vant?如何修改van-collapse-item右側(cè)圖標(biāo)

    Vant?如何修改van-collapse-item右側(cè)圖標(biāo)

    這篇文章主要介紹了Vant?如何修改van-collapse-item右側(cè)圖標(biāo),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04

最新評論