需求:我们需要连续不断地输入数据,并且只有当数据输入完成的一秒钟之后,下面的数据才会发生变化
实现响应式所用到的API有ref()与reactive()两种,若实现输入框的数据与显示的数据相一致,我们很本能的就可以想到v-model,但显示是实时变化的,与需求相悖.所以用到自定义Ref.
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/4347b0bbc3a94477aa2e12a964edadbc.gif#pic_center)
v-model实现输入即现实,代码如下:
<template>
<div class="custom-ref">
<h2>{{ msg }}</h2>
<br>
<input type="text" v-model="msg">
</div>
</template>
<script setup lang="ts" name="CustomRef">
import { ref, customRef } from 'vue'
const msg = ref('Hello')
</script>
<style scoped>
.custom-ref {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 20px;
}
</style>
实现延时1s数据显示的需求,封装在hooks中并使用 ,效果图如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/915db7601dba4c88b6b85120463fc7b8.gif#pic_center)
页面vue中使用
<template>
<div class="custom-ref">
<h2>{{ msg }}</h2>
<br>
<input type="text" v-model="msg">
</div>
</template>
<script setup lang="ts" name="CustomRef">
import useMsgRef from '@/hooks/useMsgRef'
let {msg}= useMsgRef('你好',1000)
</script>
<style scoped>
.custom-ref {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 20px;
}
</style>
src目录下新建hooks文件夹,在hooks中新建customRef.ts文件::
import { customRef } from 'vue'
export default function(initVal:string,delay:number){
let timer:number
let msg = customRef((track,trigger) => {
return {
get() {
track()
return initVal
},
set(val) {
console.log(val,'set')
clearTimeout(timer)
timer = setTimeout(() =>{
initVal = val
trigger()
},delay)
}
}
})
return {msg}
}
写在最后:
追光的人,终会光芒万丈.——《人民日报》