当前位置: 首页 > news >正文

Vue3 工具函数(总结)

目录

前言

1.isRef

2.isReactive

3.isReadonly

4.isProxy

5.toRef

6.toRefs

7.unref

8.shallowRef

9.shallowReactive

10.triggerRef

11.customRef

12.markRaw

13.toRaw

14.readonly

15.watchEffect


前言

在 Vue 3 中,除了核心的响应式 API(如 refreactivecomputed 等),Vue 还提供了许多工具函数,用于处理不同的场景和需求。这些工具函数在 vue 包中可以直接导入使用,它们帮助开发者在使用响应式数据、生命周期、组件状态等方面进行更灵活的控制和操作。

1.isRef

用来检查一个值是否是由 ref 创建的响应式引用。

import { ref, isRef } from 'vue';const count = ref(0);
console.log(isRef(count)); // true
console.log(isRef(123)); // false

2.isReactive

检查一个对象是否是通过 reactive 创建的响应式对象

import { reactive, isReactive } from 'vue';const obj = reactive({ name: 'Vue 3' });
console.log(isReactive(obj)); // true
console.log(isReactive({})); // false

3.isReadonly

用于检查一个对象是否是只读的(由 readonly 创建)

import { readonly, isReadonly } from 'vue';const state = readonly({ count: 0 });
console.log(isReadonly(state)); // true

4.isProxy

检查一个对象是否是由 reactivereadonly 包装的代理对象

import { reactive, readonly, isProxy } from 'vue';const reactiveObj = reactive({ name: 'Vue' });
const readonlyObj = readonly({ count: 0 });
console.log(isProxy(reactiveObj)); // true
console.log(isProxy(readonlyObj)); // true

5.toRef

用于将一个对象的某个属性转化为一个响应式的 ref。可以防止属性丢失响应性。

import { reactive, toRef } from 'vue';const state = reactive({ name: 'Vue' });
const nameRef = toRef(state, 'name');
console.log(nameRef.value); // 'Vue'

6.toRefs

用于将一个对象的每个属性都转换为 ref,返回一个新的对象,其中每个属性都是一个 ref

import { reactive, toRefs } from 'vue';const state = reactive({ name: 'Vue', count: 10 });
const { name, count } = toRefs(state);
console.log(name.value); // 'Vue'
console.log(count.value); // 10

7.unref

如果传入的值是 ref,它将返回 ref.value;否则,直接返回该值。简化了访问 ref 值的操作。

import { ref, unref } from 'vue';const count = ref(10);
console.log(unref(count)); // 10
console.log(unref(100)); // 100 (不是 ref,直接返回原值)

8.shallowRef

创建一个浅层的 ref,即只有 ref 自身是响应式的,ref 内部的对象不会变成响应式。

import { shallowRef } from 'vue';const state = shallowRef({ count: 0 });
console.log(state.value.count); // 0

9.shallowReactive

创建一个浅层的响应式对象,只有对象的顶层属性是响应式的,嵌套对象则不是。

import { shallowReactive } from 'vue';const state = shallowReactive({ user: { name: 'Vue' } });
// 修改顶层属性是响应式的
state.user = { name: 'Vue 3' };
// 嵌套的 `user` 对象内部属性不是响应式的

10.triggerRef

手动触发 ref 的依赖更新,适用于在浅层响应式对象中修改内部值但需要手动触发响应的场景。

import { shallowRef, triggerRef } from 'vue';const state = shallowRef({ count: 0 });
state.value.count = 1; // 手动修改内部值
triggerRef(state); // 手动触发依赖更新

11.customRef

用来创建自定义的 ref,可以自定义 getset 行为。

import { customRef } from 'vue';function useDebouncedRef(value, delay) {let timeout;return customRef((track, trigger) => {return {get() {track();return value;},set(newValue) {clearTimeout(timeout);timeout = setTimeout(() => {value = newValue;trigger();}, delay);}};});
}const count = useDebouncedRef(0, 300);

12.markRaw

  • 用来标记一个对象,使其永远不会变成响应式对象。适用于希望保留原始对象(如第三方库对象)的场景
import { markRaw } from 'vue';const rawObj = markRaw({ name: 'Vue' });
console.log(rawObj); // 该对象永远不会变成响应式

13.toRaw

获取一个响应式对象的原始对象,适用于调试或者避免特定场景下的响应式行为。

import { reactive, toRaw } from 'vue';const state = reactive({ name: 'Vue' });
const rawState = toRaw(state);
console.log(rawState); // 返回原始的非响应式对象

14.readonly

创建一个只读的响应式对象。对象的任何修改都会被忽略并发出警告。

import { readonly } from 'vue';const state = readonly({ count: 0 });
state.count = 1; // 将会触发警告,值不会被修改

15.watchEffect

watch 的简化版本,自动追踪响应式依赖,并在依赖变化时重新执行传入的副作用函数。

import { ref, watchEffect } from 'vue';const count = ref(0);watchEffect(() => {console.log(count.value); // 自动追踪 count
});

 

相关文章:

  • 大数据处理从零开始————8.基于Java构建WordCount项目
  • ①EtherCAT转Modbus485RTU网关多路同步高速采集无需编程串口服务器
  • [Linux]进程管理指令
  • 第十一届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)(大学组)
  • 第五章 linux实战-挖矿 二
  • Azure OpenAI检索增强微调:使用 GPT-4o 对 GPT-4o mini 进行微调,以适应特定领域的应用
  • 【回眸】Tessy 单元测试软件使用指南(四)常见报错及解决方案与批量初始化的经验
  • 分布式难题-三座大山NPC
  • 微信卖茶叶套路
  • 华为源NAT技术与目的NAT技术
  • debian linux 只安装mysql client
  • 从GDAL中 读取遥感影像的信息
  • 67 自注意力_by《李沐:动手学深度学习v2》pytorch版
  • 【GAN 图像生成】
  • 【Python】Python多行输入储存为字典,值为列表
  • 「译」Node.js Streams 基础
  • 【css3】浏览器内核及其兼容性
  • download使用浅析
  • express如何解决request entity too large问题
  • go语言学习初探(一)
  • js继承的实现方法
  • python docx文档转html页面
  • Rancher-k8s加速安装文档
  • Redis学习笔记 - pipline(流水线、管道)
  • Spring Boot MyBatis配置多种数据库
  • Vue组件定义
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 思维导图—你不知道的JavaScript中卷
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 小而合理的前端理论:rscss和rsjs
  • Java数据解析之JSON
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • ​2021半年盘点,不想你错过的重磅新书
  • ​比特币大跌的 2 个原因
  • ‌[AI问答] Auto-sklearn‌ 与 scikit-learn 区别
  • #pragam once 和 #ifndef 预编译头
  • (3) cmake编译多个cpp文件
  • (5)STL算法之复制
  • (7) cmake 编译C++程序(二)
  • (C语言)二分查找 超详细
  • (void) (_x == _y)的作用
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (笔试题)分解质因式
  • (十一)c52学习之旅-动态数码管
  • (五)IO流之ByteArrayInput/OutputStream
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)树状数组
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .NET 8.0 中有哪些新的变化?
  • .NET MAUI Sqlite数据库操作(二)异步初始化方法
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET 服务 ServiceController
  • .Net 路由处理厉害了
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET和.COM和.CN域名区别