视频内容

customRef

  • 作用:创建一个自定义的 ref,并对其依赖项跟踪和更新触发进行显式控制。

  • 实现防抖效果:

  <template>
    <input type="text" v-model="keyWord">
    <h3>{{keyWord}}</h3>
</template>

<script>
    import {ref,customRef} from 'vue'
    export default {
        name: 'App',
        setup() {


            //自定义一个ref(), 名为:myRef()
            // ref() ∈ 精装房, customRef() ∈ 毛坯房
            //参数:
            //    value 
            //    delay
            function myRef(value,delay){
                let timer

                //customRef(函数(),该函数必须返回一个对象)
                //    track 追踪 
                //    trigger
                return customRef((track,trigger)=>{
                    return { //返回一个对象
                        get(){
                            console.log(`有人从myRef这个容器中读取数据了,我把${value}给他了`)

                            track() //通知Vue追踪value的变化(提前(获取value之前)和get商量一下,让他认为这个value是有用的)

                            return value
                        },
                        set(newValue){
                            console.log(`有人把myRef这个容器中数据改为了:${newValue}`)

                            clearTimeout(timer)

                            //等 delay(ms) 再调用 trigger()
                            timer = setTimeout(()=>{
                                //将 设置的新值 赋值给 调用myRef()传递过来的参数value
                                value = newValue

                                trigger() //通知 Vue 去重新 解析模板
                            },delay)
                        },
                    }
                })
            }

            // let keyWord = ref('hello') //使用Vue提供的ref
            let keyWord = myRef('hello',500) //使用程序员自定义的ref

            return {keyWord}
        }
    }
</script>