您好,登錄后才能下訂單哦!
這篇文章主要介紹了Vue中的customRef函數(shù)如何使用的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇Vue中的customRef函數(shù)如何使用文章都會(huì)有所收獲,下面我們一起來看看吧。
ref
是Vue
官方提供的componsition API
,將一個(gè)非響應(yīng)式數(shù)據(jù)轉(zhuǎn)變?yōu)轫憫?yīng)式數(shù)據(jù)的函數(shù),至于底層怎么實(shí)現(xiàn)數(shù)據(jù)的收集與響應(yīng)式
使用者無需去關(guān)注,相當(dāng)于就是精裝電腦,然而有時(shí)候,針對(duì)一些復(fù)雜特殊的需求,我們需要自己造輪子,自己手動(dòng)原生的去實(shí)現(xiàn)內(nèi)部結(jié)構(gòu)。
實(shí)現(xiàn)基礎(chǔ)的功能的同時(shí),還要進(jìn)行額外的拓展,那么這時(shí)候就需要自定義ref
了的,它就相當(dāng)于是組裝式的電腦,內(nèi)部結(jié)構(gòu)需要自己去組裝、實(shí)現(xiàn)。
而非直接從商城里購買,用一些現(xiàn)成的零部件組裝一個(gè)類似精裝的電腦,甚至還可以進(jìn)行拓展,在實(shí)現(xiàn)一個(gè)定制化復(fù)雜的功能需求時(shí),這個(gè)自定義ref
就很有用。
想要在input
中實(shí)現(xiàn)一個(gè)數(shù)據(jù)的實(shí)時(shí)收集與實(shí)時(shí)展示,需要使用v-model
指令
<template>
<input type="text" v-model="keyword" />
<h4>{{keyword}}</h4>
</template>
<script setup>
import { ref } from "vue";
let keyword = ref("itclanCoder"); // Vue官方提供的ref函數(shù),返回一個(gè)響應(yīng)式數(shù)據(jù)
</script>
現(xiàn)在不能用官方提供的ref
函數(shù),也就是自己要自頂一個(gè)類似ref
函數(shù),如下所示
<template>
<input type="text" v-model="keyword" />
<h4>{{keyword}}</h4>
</template>
<script setup>
import { customRef } from 'vue';
// 自定義的一個(gè)ref,名為myRef,自定義ref就是一個(gè)函數(shù)
function myRef(value) {
// 自定義,自己得寫邏輯,customRef必須要傳入一個(gè)函數(shù),而且函數(shù)里面必須要返回一個(gè)對(duì)象
return customRef((track,trigger) => { // 第一個(gè)return 是把自定義的內(nèi)容返回出去,第二個(gè)return 是返回里面的邏輯,返回get,和set
return {
get() { // 讀取數(shù)據(jù),這個(gè)value是初始化傳遞過來的數(shù)據(jù)
console.log('get',`${value}`);
track(); // 追蹤一下數(shù)據(jù)的改變,通知vue最終value數(shù)據(jù)的變化,提前和get溝通一下,讓value是有作用的
return value
},
set(newValue) { // 設(shè)置數(shù)據(jù),新的值,修改數(shù)據(jù)
value = newValue;
trigger(); // customRef函數(shù)內(nèi)接收兩個(gè)參數(shù),一個(gè)是track,另一個(gè)就是trigger,通知vue去重新解析模板
}
}
});
}
let keyword = myRef("itclanCoder"); // 自己定義一個(gè)ref
</script>
通過上面的方式就可實(shí)現(xiàn)自定義數(shù)據(jù)的收集和展示,如果想要等待幾秒后,觸發(fā),那么只需要在set
加一個(gè)定時(shí)器就夠了的,其他不變
set(newValue) {
setTimeout(() => {
value = newValue;
trigger(); // 通知vue去重新解析模板
},500)
}
解決持續(xù)回顯,誤觸發(fā)的問題,定時(shí)器一直開通的問題
<template>
<input type="text" v-model="keyword" />
<h4>{{keyword}}</h4>
</template>
<script setup>
import { customRef } from 'vue';
// 自定義的一個(gè)ref,名為myRef,自定義ref就是一個(gè)函數(shù)
function myRef(value) {
let timer; // 開啟一個(gè)定時(shí)器
// 自定義,自己得寫邏輯,customRef必須要傳入一個(gè)函數(shù),而且函數(shù)里面必須要返回一個(gè)對(duì)象
return customRef((track,trigger) => { // 第一個(gè)return 是把自定義的內(nèi)容返回出去,第二個(gè)return 是返回里面的邏輯,返回get,和set
return {
get() { // 讀取數(shù)據(jù),這個(gè)value是初始化傳遞過來的數(shù)據(jù)
console.log('get',`${value}`);
track(); // 追蹤一下數(shù)據(jù)的改變,通知vue最終value數(shù)據(jù)的變化,提前和get溝通一下,讓value是有作用的
return value
},
set(newValue) { // 設(shè)置數(shù)據(jù),新的值,修改數(shù)據(jù)
clearInterval(timer); // 先清除定時(shí)器,在開
timer = setTimeout(() => {
value = newValue;
trigger(); // customRef函數(shù)內(nèi)接收兩個(gè)參數(shù),一個(gè)是track,另一個(gè)就是trigger,通知vue去重新解析模板
},500)
}
}
});
}
let keyword = myRef("itclanCoder"); // 自己定義一個(gè)ref
</script>
這個(gè)customRef
比較難以理解的是,它需要在自定義ref
函數(shù)中返回出去,同時(shí),接收一個(gè)工廠函數(shù)作為參數(shù),這個(gè)工廠函數(shù)接受track
和trigger
兩個(gè)函數(shù)
作為參數(shù),并返回一個(gè)帶有g(shù)et和set方法的對(duì)象
一般來說,track()
在get()
方法中的返回值前進(jìn)行調(diào)用,追蹤一下數(shù)據(jù)的改變,通知vue
最終數(shù)據(jù)的變化,而trigger()
函數(shù)則應(yīng)該在set()
函數(shù)的末尾調(diào)用
通知vue
去重新解析模板,更新頁面數(shù)據(jù)
最后就是實(shí)現(xiàn)等待多長時(shí)間,稍后顯示,使用一個(gè)定時(shí)器去實(shí)現(xiàn),解決頻繁誤觸發(fā)的問題,常規(guī)的解決辦法,先清除定時(shí)器,然后在開啟定時(shí)器。
關(guān)于“Vue中的customRef函數(shù)如何使用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“Vue中的customRef函數(shù)如何使用”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。