Vue3:自定义响应式数据-customRef(面试常问,重点!!!)

一、情景说明

我们知道,Vue的响应式数据效果就是,页面和变量的关联效果
页面一修改变量值,引用变量的地方就会同时更新

那么,假设我们有这样一个需求,就是,让响应式变量在页面修改后,过2秒,才进行更新展示
这个事后,就要用到customRef来实现功能

二、案例

hooks写法

import { customRef } from "vue";

export default function(initValue:string,delay:number){
  // 使用Vue提供的customRef定义响应式数据
  let timer:number
  // track(跟踪)、trigger(触发)
  let msg = customRef((track,trigger)=>{
    return {
      // get何时调用?—— msg被读取时
      get(){
        track() //告诉Vue数据msg很重要,你要对msg进行持续关注,一旦msg变化就去更新
        return initValue
      },
      // set何时调用?—— msg被修改时
      set(value){
        clearTimeout(timer)
        timer = setTimeout(() => {
          initValue = value
          trigger() //通知Vue一下数据msg变化了
        }, delay);
      }
    }
  })
  return {msg}
}

重点分析

1、customRef的基本结构

const initValue
customRef((track,trigger)=>{
    return {
      get(){
        track() // 告诉Vue数据msg很重要,要对msg持续关注,一旦变化就更新
        return initValue
      },
      set(value){
          initValue = value
          trigger() //通知Vue数据msg变化了
      }
    }
  }) 

2、track,trigger参数
我们会发现
track要在get函数业务逻辑的第一行
trigger要在set函数业务逻辑的最后一行

它们的作用类似订阅与发布,是对数据的一种监视!
这样,才能实现数据的响应式

比喻理解:

ref是直接去4S车店买车,一手交钱一手交货
customRef,是去工厂定制一辆车:造车
track就是订购人,要实时跟踪造车的过程,相当于监工
trigger就是造车的技术员,造好了通知一下购车人

3、延迟更新展示
主要是在set函数里面,用到了定时器
但是,这里会发现,结合了clearTimeout一起使用
这样,是为了防止,快速输入,导致set频繁调用出现的bug

相关推荐

  1. vue3 学习笔记07 -- 定义响应数据

    2024-04-13 01:38:03       25 阅读
  2. 数据库面试3

    2024-04-13 01:38:03       26 阅读
  3. Vue3响应数据

    2024-04-13 01:38:03       53 阅读
  4. VUE3-响应

    2024-04-13 01:38:03       55 阅读
  5. 数据库面试

    2024-04-13 01:38:03       36 阅读
  6. Vue 3响应 API 总结

    2024-04-13 01:38:03       19 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-13 01:38:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-13 01:38:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-13 01:38:03       82 阅读
  4. Python语言-面向对象

    2024-04-13 01:38:03       91 阅读

热门阅读

  1. P2678 [NOIP2015 提高组] 跳石头

    2024-04-13 01:38:03       38 阅读
  2. Golang 为什么需要用反射

    2024-04-13 01:38:03       36 阅读
  3. Leetcode56_合并区间

    2024-04-13 01:38:03       39 阅读
  4. Latex中todonotes超出页面范围及其他参数说明

    2024-04-13 01:38:03       39 阅读
  5. 第十三届蓝桥杯省赛C&C++ 研究生组2.0

    2024-04-13 01:38:03       38 阅读
  6. Ajax跨域请求

    2024-04-13 01:38:03       36 阅读
  7. pytorch 45 使用自己的数据对groundingdino进行微调

    2024-04-13 01:38:03       33 阅读