import {customRef} from "vue";
export default function(){
// 自己定义一个ref
function useDebouncedRef(value){
// 自定义的ref函数体需要符合ref规范
// 通过调用customRef来获取一个ref实例
// 调用customRef必须要给出一个回调函数作为形参factory
// 对于这个factory函数来说,有两个重要参数track,trigger
// track是追踪的意思,trigger是触发的意思
const x = customRef((track,trigger)=>{
let t;
// 这个factory回调函数必须有返回对象
// 且这个返回必须有get(set非必须)
return {
// 模板语句只要使用到该数据,get会自动调用
get(){
console.log("get执行了");
// 还要在get里面用track追踪告诉vue这个value发生的变化
track();
return value;
},
// 模板语句修改该数据会自动调用set方法
set(newValue){
console.log("set执行了");
// 如果输入较快会导致底层同时出现多个setTimeout函数
// 会导致抖动问题的出现(屏幕上内容闪烁跳动)
clearTimeout(t);
// 成功解决了防抖问题
t = setTimeout(() => {
value = newValue;
// 触发一下即通知去调用get方法
trigger();
},1000);
}
}
});
return x;
}
let name = useDebouncedRef("");
return name;
}
<template>
<input type="text" v-model="name"/>
<br>
<h1>{{ name }}</h1>
</template>
<script>
import inputName from './hooks/inputName';
export default {
name : "App",
setup(){
let name = inputName();
// 使用自定义的ref
// 创建防抖REF
return {name};
}
}
</script>
<style>
</style>
标签:VUE,return,name,自定义,get,track,框架,customRef,ref
From: https://blog.51cto.com/u_16322355/11970037