一文了解customRef 自定义ref使用

这篇具有很好参考价值的文章主要介绍了一文了解customRef 自定义ref使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概念

按照文档中的说明:customRef 可以用来创建一个自定义的 ref,并对其依赖项跟踪和更新触发进行显式控制。它需要一个工厂函数,该函数接收 tracktrigger函数作为参数,并且应该返回一个带有 getset 的对象。
其实大致意思就是,我们可以按照自己的业务需求去自定义封装一个ref对象,在其内部可以使用getset去跟踪或更新数据,有点计算属性内味了哈~

应用场景

第一个应用场景就是官网文档中所提到的:可以用来实现防抖函数。

直接上代码:

<template>
  <input
    v-model="text"
  >
</template>

<script setup lang="ts">
import { customRef } from 'vue'
function useDebouncedRef<T> (value: T, delay: number) {
  let timer: any = null
  return customRef<T>((track, trigger) => ({
    get () {
      track()
      return value
    },
    set (newValue) {
      clearTimeout(timer)
      timer = setTimeout(() => {
        value = newValue
        // ...do something
        trigger()
      }, delay)
    }
  }))
}

const text = useDebouncedRef<string>('', 2000)
</script>

代码很简单,相信大家一看就能懂~

第二个应用场景就是可以用来做一个加强型的计算属性。

在Vue3中,computed创建出来的计算属性是只读的。什么意思呢?就是 computed 创建出来的属性,只能通过自身的 get 函数去跟踪其他属性来进行自身更新,算是一个比较坑的地方吧:

一文了解customRef 自定义ref使用

所以这个时候可以用 customRef 来实现一个加强版的 computed,代码如下:

<template>
  <el-slider
    v-model="value"
    @change="handleSlider"
  />
</template>

<script setup lang="ts">
import { customRef } from 'vue'

function useDebouncedRef<T> (value: T) {
  return customRef<T>((track, trigger) => ({
    get () {
      track()
      return value
    },
    set (newValue) {
      value = newValue
      trigger()
    }
  }))
}

const value = useDebouncedRef<number>(0)

function handleSlider (e: number) {
  value.value = e
}
</script>

<style lang="scss" scoped>
</style>


vue3的customRef实现自定义ref

  • customRef :创建一个自定义的ref,并对其依赖项跟踪和更新触发进行显示控制,我们可以手动写set和get里的逻辑
  • customRef就像一辆手动挡车可玩性高,ref就是自动挡车
  • 使用customRef实现防抖效果(在规定时间无论触发多少次方法,只执行最后一次),上代码
<template>
    <!-- 实现一个效果,input输入数据,然后输入框下面同时显示数据但是,是延迟一秒之后 -->
    <input type="text" v-model="word">
    <span>{{ word }}</span>
</template>
<script>
import { customRef } from 'vue';
export default {
    name: 'toRef',
    setup() {
        function myRef(value, delay) {
            return customRef((track, trigger) => { // 这里有两个参数
                let timer;// 用于接收定时器
                return {
                    get() {
                        console.log('get调用了');
                        // 读取数据时会自动调用该方法
                        track();// 这个方法会通知vue追踪value的变化
                        return value;
                    },
                    set(newValue) {// 有个参数,是新修改的数据我们在set里进行赋值
                        console.log('set调用了');
                        clearTimeout(timer);// 使用前先清空定时器,免得创建很多定时器,在输入时就会出现抖动的效果
                        // 修改数据时会自动调用该方法
                        timer = setTimeout(() => {
                            value = newValue;
                            trigger(); // 这个方法会通知vue去解析模版(解析就会调用get去获取新的数据了)
                        }, delay);
                    }
                }
            })
        };
        let word = myRef('a', 1000);
        return {
            word
        };
    }
}
</script>

一文了解customRef 自定义ref使用

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

实现防抖效果:

// get:用于读数据进行调用    set:用于修改数据时进行调用
<template>
  <div>
    <input type="text" v-model="keyword" />
    <h3>{{ keyword }}</h3>
  </div>
</template>
<script>
import { ref, reactive, toRaw, customRef } from "vue";
export default {
  setup() {
//自定义函数内部实现
    function myref(value) {
      let timer;
      return customRef((track, trigger) => {
        return {
          get() {
            //  读属性调用get
            console.log("从myref中读取数据我把${value}");
            track(); //通知vue追踪数据的变化
            return value;
          },
          set(newvalue) {
            //修改数据低啊用set
            console.log(`修改了数据${newvalue}`);
            value = newvalue; //进行修改数据
            clearTimeout(timer); //进行防抖
            timer = setTimeout(() => {
              trigger(); //通知vue重新解析模板
            }, 1000);
          },
        };
      });
    }
    let keyword = myref("hellow"); //使用程序员自定义ref
    return { keyword };
  },
};
</script>

刚启动时:get调用两次进行读数据

一文了解customRef 自定义ref使用

当进行数据修改时:调用set函数,并且通过trigger()->track()进行数据的重新模板加载,实现响应式,

一文了解customRef 自定义ref使用

为了实现输入过快出现的抖动情况,文章来源地址https://www.toymoban.com/news/detail-454691.html

到了这里,关于一文了解customRef 自定义ref使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一文了解scATAC-seq分析的一些必知概念

    scATAC-seq: scATAC-seq(Single-cell Assay for Transposase-Accessible Chromatin using sequencing)是一种单细胞基因组学技术,它可以用来鉴定每个单细胞的开放染色质区域(Accessible Chromatin)。它结合了两个技术:Transposase-Accessible Chromatin sequencing(ATAC-seq)和单细胞测序。 ATAC-seq技术使用的是一

    2024年02月13日
    浏览(39)
  • 【Spring Security系列】一文带你了解权限框架与Spring Security核心概念

    权限框架是软件开发中用于管理 用户权限和访问控制 的工具。在企业或者我们毕设复杂的系统中,不同的用户或角色需要拥有不同的访问和操作权限,以确保系统的安全性和数据完整性。今天我们就讨论一下Java中的安全框架! 在企业的开发中,Spring Security,Shiro都是比较流

    2024年04月16日
    浏览(39)
  • 一文了解RabbitMQ安装使用

            官网:Messaging that just works — RabbitMQ         RabbitMQ是一种开源的消息中间件软件,用于构建可扩展的分布式应用程序。它 实现了高级消息队列协议(AMQP) ,这是一种网络协议,用于在应用程序之间进行可靠的异步消息传递。         RabbitMQ提供了一个可靠的

    2024年02月13日
    浏览(37)
  • 一文了解Copilot插件使用介绍

    在软件开发的不断演进中,AI技术正逐渐渗透到我们的日常工作中。GitHub Copilot作为一个基于OpenAI Codex的插件,为程序员提供了全新的编程体验。本文将深入探讨Copilot插件的使用方法、优势特性以及如何充分发挥其潜力,助你更高效、愉悦地进行编码。 1. Copilot简介: GitHub

    2024年02月02日
    浏览(44)
  • 【MySQL】一文带你了解如何使用MySQL

    🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集! 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长,值得我们全力奔赴更美好的生活✨ ------------------❤️分割线❤️------------------------- —————————

    2024年02月09日
    浏览(71)
  • Vue3-customRef的使用

    读取数据前,需要先track()  告诉Vue数据msg很重要,你要对msg进行持续关注,一旦msg变化就去更新 修改数据后,需要trigger()收尾 通知Vue一下数据msg变化了 坐个比喻, 本来的ref,你就是你直接去车店,直接买车,都是车店做好了的,你只能选择他给你的,定死了,你没法

    2024年02月02日
    浏览(28)
  • 一文了解使用Moonbeam原生跨链的潜力项目

    跨链互连合约是Moonbeam独特的原生跨链解决方案,不仅帮助开发团队在Moonbeam网络即可解锁不同公链的特色功能,而且各类去中心化应用的终端使用者能因此获得更便捷安全的跨链体验。 Moonbeam的原生跨链解决方案包含Polkadot生态、不同异构链和Moonbeam生态本身,所有用户只需

    2024年02月04日
    浏览(43)
  • 一文带你了解MySQL之B+树索引的使用

    前言 我们上一篇文章详细的了InnoDB存储引擎的B+树索引,我们必须知道下边这些结论: 每个索引都对应1棵B+树,B+树分为好多层,最下边一层是叶字节点,其余的是内节点(非叶子节点)。所有用户户记录都存储在B+树的叶子节点,所有目录项记录都存储在内节点。 InnoDB存储

    2024年02月06日
    浏览(43)
  • 【原生Ajax】全面了解xhr的概念与使用。

    ✍️ 作者简介: 前端新手学习中。 💂 作者主页: 作者主页查看更多前端教学 🎓 专栏分享:css重难点教学   Node.js教学 从头开始学习   ajax学习 xhr是浏览器提供的JavaScript对象,通过它,可以请求服务器上的数据资源,之前所学的jquery的ajax函数,就是基于xhr对象封装出来的。

    2024年02月02日
    浏览(37)
  • MAVEN利器:一文带你了解IDEA中如何使用Maven

    强大的构建工具——Maven。作为Java生态系统中的重要组成部分,Maven为开发人员提供了一种简单而高效的方式来构建、管理和发布Java项目。无论是小型项目还是大型企业级应用,Maven都能帮助开发人员轻松处理依赖管理、编译、测试和部署等任务。 在上一篇文章中,我们学习

    2024年02月11日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包