← 返回首页
Vue3基础教程(三十一)
发表时间:2021-08-13 17:05:17
customRef

1.customRef

实例: 使用 customRef 实现防抖效果的示例。

<template>
    <h2>customRef效果</h2>
    <input v-model="keyword" placeholder="搜索关键字"/>
    <p>{{keyword}}</p>
</template>

<script lang="ts">
    /*
    customRef:
      创建一个自定义的 ref,并对其依赖项跟踪和更新触发进行显式控制

    需求:
      使用 customRef 实现 debounce 的示例
    */

    import {
        ref,
        customRef
    } from 'vue'

    export default {
        setup () {
            const keyword = useDebouncedRef('', 300)
            console.log(keyword)
            return {
                keyword
            }
        },
    }

    /*
    实现函数防抖的自定义ref
    value:要监测的数据
    delay:默认延时200毫秒
    */
    function useDebouncedRef<T>(value: T, delay = 200) {
        let timerId: number  //定时器对象
        return customRef((track, trigger) => {
            return {
                get() {
                    // 告诉Vue追踪数据
                    track()
                    return value
                },
                set(newValue: T) {
                    clearTimeout(timerId)
                    timerId = setTimeout(() => {
                        value = newValue
                        // 告诉Vue去触发界面更新
                        trigger()
                    }, delay)
                }
            }
        })
    }
</script>