Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >VueJs中customRef函数的使用

VueJs中customRef函数的使用

作者头像
itclanCoder
发布于 2023-02-26 07:02:19
发布于 2023-02-26 07:02:19
1.1K00
代码可运行
举报
文章被收录于专栏:itclanCoderitclanCoder
运行总次数:0
代码可运行

前言

refVue官方提供的componsition API,将一个非响应式数据转变为响应式数据的函数,至于底层怎么实现数据的收集与响应式

使用者无需去关注,相当于就是精装电脑,然而有时候,针对一些复杂特殊的需求,我们需要自己造轮子,自己手动原生的去实现内部结构

实现基础的功能的同时,还要进行额外的拓展,那么这时候就需要自定义ref了的,它就相当于是组装式的电脑,内部结构需要自己去组装,实现

而非直接从商城里购买,用一些现成的零部件组装一个类似精装的电脑,甚至还可以进行拓展,在实现一个定制化复杂的功能需求时

这个自定义ref就很有用

示例-延迟展示

想要在input中实现一个数据的实时收集与实时展示,需要使用v-model指令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
    <input type="text" v-model="keyword" />
    <h3>{{keyword}}</h3>
</template>
<script setup>
 import { ref } from "vue";
 let keyword = ref("itclanCoder"); // Vue官方提供的ref函数,返回一个响应式数据
</script>

现在不能用官方提供的ref函数,也就是自己要自顶一个类似ref函数,如下所示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
    <input type="text" v-model="keyword" />
    <h3>{{keyword}}</h3>
</template>
<script setup>
import { customRef } from 'vue';      
// 自定义的一个ref,名为myRef,自定义ref就是一个函数
function myRef(value) {
  // 自定义,自己得写逻辑,customRef必须要传入一个函数,而且函数里面必须要返回一个对象
  return  customRef((track,trigger) => {  // 第一个return 是把自定义的内容返回出去,第二个return 是返回里面的逻辑,返回get,和set
    return {  
        get() {  // 读取数据,这个value是初始化传递过来的数据
            console.log('get',`${value}`);
            track(); // 追踪一下数据的改变,通知vue最终value数据的变化,提前和get沟通一下,让value是有作用的
            return value
        },
        set(newValue) { // 设置数据,新的值,修改数据
           value = newValue;
           trigger(); // customRef函数内接收两个参数,一个是track,另一个就是trigger,通知vue去重新解析模板
        }
    }
  });  
}    
let keyword = myRef("itclanCoder"); // 自己定义一个ref
</script>

通过上面的方式就可实现自定义数据的收集和展示,如果想要等待几秒后,触发,那么只需要在set加一个定时器就够了的,其他不变

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set(newValue) {
    setTimeout(() => {
        value = newValue;
        trigger(); // 通知vue去重新解析模板
    },500)
}

解决持续回显,误触发的问题,定时器一直开通的问题,如下是完整示例代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
    <input type="text" v-model="keyword" />
    <h3>{{keyword}}</h3>
</template>
<script setup>
import { customRef } from 'vue';      
// 自定义的一个ref,名为myRef,自定义ref就是一个函数
function myRef(value) {
  let timer;  // 开启一个定时器  
  // 自定义,自己得写逻辑,customRef必须要传入一个函数,而且函数里面必须要返回一个对象
  return  customRef((track,trigger) => {  // 第一个return 是把自定义的内容返回出去,第二个return 是返回里面的逻辑,返回get,和set
    return {  
        get() {  // 读取数据,这个value是初始化传递过来的数据
            console.log('get',`${value}`);
            track(); // 追踪一下数据的改变,通知vue最终value数据的变化,提前和get沟通一下,让value是有作用的
            return value
        },
        set(newValue) { // 设置数据,新的值,修改数据
           clearInterval(timer);  // 先清除定时器,在开
           timer = setTimeout(() => {
              value = newValue;
              trigger(); // customRef函数内接收两个参数,一个是track,另一个就是trigger,通知vue去重新解析模板
           },500)
        }
    }
  });  
}    
let keyword = myRef("itclanCoder"); // 自己定义一个ref

</script>

这个customRef比较难以理解的是,它需要在自定义ref函数中返回出去,同时,接收一个工厂函数作为参数,这个工厂函数接受track和trigger两个函数

作为参数,并返回一个带有getset方法的对象

一般来说,track()get()方法中的返回值前进行调用,追踪一下数据的改变,通知vue最终数据的变化,而trigger()函数则应该在set()函数的末尾调用

通知vue去重新解析模板,更新页面数据

最后就是实现等待多长时间,稍后显示,使用一个定时器去实现,解决频繁误触发的问题,常规的解决办法,先清除定时器,然后在开启定时器

总结

自定义ref(customRef())函数是一个非常有用的东西,相当于是对ref的一个功能的拓展,自己手动的去实现,内部实现比较绕,需要自己去体会和实践的

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-01-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 itclanCoder 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Vue3基础
官方文档:https://cli.vuejs.org/zh/guide/creating-a-project.html#vue-create
六个周
2022/10/28
1K0
Vue3基础
Vue3学习笔记(二)——组合式API(Composition API)
官方文档: https://v3.cn.vuejs.org/guide/composition-api-introduction.html
张果
2022/10/31
4.4K0
Vue3学习笔记(二)——组合式API(Composition API)
vue3笔记5 响应式API
shallowReactive 只创建第一层数据的响应式 适用于对象结构深,但只需处理最外层属性变化的场景
路过君
2022/04/13
3990
Vue3学习笔记
①性能的提升 打包大小减少41%、初次渲染快55%,更新渲染快133%,内存减少54%…… ②源码的升级
玖柒的小窝
2021/09/29
8680
Vue3学习笔记
Vue 3 refs 学习
接受一个值,返回一个响应式并且可变的 ref 对象。ref 对象具有指向值的单个属性的值。
公众号---人生代码
2020/12/15
7940
【Vuejs】908- Vue 3.0 进阶之深入学习响应式 Refs API
本文是 Vue 3.0 进阶系列 的第九篇文章,在组合式 API setup 配置项中经常会见到 Refs API 的身影,比如 ref、toRef 或 toRefs 等。那么这些常用 API 的作用和使用场景是什么?它们背后的实现原理又是什么?接下来,阿宝哥将带着这些问题,跟大家一起来深入学习响应式 Refs API。
pingan8787
2021/04/07
7220
【Vuejs】908- Vue 3.0 进阶之深入学习响应式 Refs API
Vue3 响应式高阶用法之 `customRef()`
在 Vue3 中,响应式系统是其核心特性之一。customRef() 是 Vue3 提供的一种高级工具,允许开发者创建自定义的 ref 对象。这些对象可以包含更复杂的依赖跟踪和更新逻辑,满足特定的业务需求。本文将详细介绍 customRef() 的使用场景、基本用法以及一些最佳实践。
訾博ZiBo
2025/01/06
930
Composition API详解
setup()函数是vue3中专门新增的方法,可以理解为Composition Api的入口。
前端老道
2022/12/01
1.4K0
最全系列的vue3入门教程『图文并茂』
Vue 3 是一个流行的开源JavaScript框架,用于构建用户界面和单页面应用。它带来了许多新特性和改进,包括更好的性能、更小的打包大小、更好的TypeScript支持、全新的组合式 API,以及一些新的内置组件。
linwu
2023/07/27
5K0
最全系列的vue3入门教程『图文并茂』
【Vue3+TypeScript】CRM系统项目搭建之 — 关于 VUE3 语法新变化
vite 是新一代前端构建工具,官网地址:https://vitejs.cn,vite的优势如下:
HelloWorldZ
2024/03/20
5340
【Vue3+TypeScript】CRM系统项目搭建之 — 关于 VUE3 语法新变化
「快速学习系列」我熬夜整理了Vue3.x响应性API
Vue3.x正式版发布已经快半年了,相信大家也多多少少也用Vue3.x开发过项目。那么,我们今天就整理下Vue3.x中的响应性API。
Vam的金豆之路
2021/12/01
4970
全面了解Vue3的 ref 和相关函数和计算属性
在vue3里面,我们可以通过 reactive 来实现引用类型的响应性,那么基础类型的响应性如何来实现呢?
用户1174620
2021/04/13
1.5K0
用 customRef 做一个防抖函数,支持 element 等UI库。
这几天学习Vue的官网,看到 customRef 提供了一个例子,研究半天发现这是一个防抖函数,觉得挺好,于是把这个例子扩展了一下,可以用于表单子控件和查询子控件。
用户1174620
2021/04/09
6390
父组件使用v-model,子组件竟然不用定义props和emit抛出事件
vue3.4增加了defineModel宏函数,在子组件内修改了defineModel的返回值,父组件上v-model绑定的变量就会被更新。大家都知道v-model是:modelValue和@update:modelValue的语法糖,但是你知道为什么我们在子组件内没有写任何关于props的定义和emit事件触发的代码吗?还有在template渲染中defineModel的返回值等于父组件v-model绑定的变量值,那么这个返回值是否就是名为modelValue的props呢?直接修改defineModel的返回值就会修改父组件上面绑定的变量,那么这个行为是否相当于子组件直接修改了父组件的变量值,破坏了vue的单向数据流呢?
前端欧阳
2024/04/24
2940
父组件使用v-model,子组件竟然不用定义props和emit抛出事件
【vue3入门到入土】-- 响应式api用法及应用场景
创建一个响应式数据,一般来说用于创建简单类型的响应式对象,比如String、Number类型
玖柒的小窝
2021/11/04
7940
【vue3入门到入土】-- 响应式api用法及应用场景
简单说一下vue3中的那些晦涩难懂的概念(ref、reactive、unref、isRef、toRef、toRefs、shallowRef、triggerRef、custormRef)
何处锦绣不灰堆
2023/12/13
3050
简单说一下vue3中的那些晦涩难懂的概念(ref、reactive、unref、isRef、toRef、toRefs、shallowRef、triggerRef、custormRef)
让Vue3 Composition API 存在于你 Vue 以外的项目中
作为新特性 Composition API ,在 Vue3 正式发布之前一段时间就发布过了。
陈大鱼头
2020/10/23
5090
我在vue3.0团队内部的分享
当前还处于 beta版本, 想要正式使用在项目里还需要一段的时间, 但是结构与api变化应该不大了.
肉眼品世界
2021/01/25
5830
用Typescript 的方式封装Vue3的表单绑定,支持防抖等功能。
Vue3对于表单的绑定提供了一种简单的方式:v-model。对于使用者来说非常方便,v-model="name" 就可以了。
用户1174620
2022/06/27
1.2K0
# 【vue3源码】九、ref源码解析
createRef接收两个参数:rawValue待转换的值、shallow浅层响应式。
用户6256742
2024/06/26
1610
推荐阅读
相关推荐
Vue3基础
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验