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

02 vue3之ref全局桶

ref

接受一个内部值并返回一个响应式且可变的 ref 对象。ref 对象仅有一个 .value property,指向该内部值。

<template><div class="">Ref:{{ name.a }}</div><button @click="change()">change</button>
</template><script setup lang="ts">
import {ref,
} from "vue";
// 分为二种情况使用 1.类型简单时使用
let name = ref({ a: "cookie" }); // ref是个函数,ref返回的是类
const change = () => {name.value.a = "herry"; 
};// 2.类型复杂的时候使用
import type { Ref } from "vue";
/* type N = { a: string;
};
let name: Ref<N> = ref({ a: "cookie" }); // 定义泛型N,ref是个函数 */</script>

注意被ref包装之后需要.value 来进行赋值

isRef

判断是不是一个ref对象

import { ref, Ref,isRef } from 'vue'
let message: Ref<string | number> = ref("我是message")
let notRef:number = 123
const changeMsg = () => {message.value = "change msg"console.log(isRef(message)); //trueconsole.log(isRef(notRef)); //false}
 ref 小妙招格式化输出

我们console 输出 

shallowRef

ref深层次 shallowRef浅层次 ,二者不能再一块使用会造成视图的更新 因为是triggerRef被ref底层调用导致的

<template><div class="">Ref:{{ name.a }}</div><div class="">shallowRef:{{ name1.a }}</div><hr /><button @click="change()">change</button>
</template><script setup lang="ts">
import {ref,shallowRef,triggerRef,customRef,
} from "vue";
import type { Ref } from "vue"; let name = ref({ a: "cookie" });let name1 = shallowRef({ a: "herry" });
const change = () => {
// 一起使用会导致值都会发生改变// name.value.a = "herry"; // 只能使用ref和shallowRef只能使用一个name1.value.a = "herry1"; // 实际上只到了.value这一层 不能刷新更改视图的值triggerRef(name1); //加上会收集所有依赖也会更改视图的值 ref实质底层也是调用这个函数导致视图值得变化name1.value = {a: "herry2", // 这样也相当于深层次修改}; 
};
</script>

triggerRef 

强制更新页面DOM

这样也是可以改变值的

<template><div><button @click="changeMsg">change</button><div>{{ message }}</div></div>
</template><script setup lang="ts">
import { Ref, shallowRef,triggerRef } from 'vue'
type Obj = {name: string
}
let message: Ref<Obj> = shallowRef({name: "小"
})const changeMsg = () => {message.value.name = '大'triggerRef(message)
}
</script> <style>
</style>

customRef

自定义ref 

customRef 是个工厂函数要求我们返回一个对象 并且实现 get 和 set  适合去做防抖之类的

ref也能获取dom ;定义得dom值和ref='dom'需一致

<template><div>customRef :{{ obj }}</div><hr /><div ref="dom">我是dom</div><button @click="change()">change</button>
</template><script setup lang="ts">
import {ref,shallowRef,triggerRef,customRef,
} from "vue";
import type { Ref } from "vue"; // 2.类型复杂的时候使用let dom = ref<HTMLDivElement>(); // <HTMLDivElement> 使用泛型类型推断为HTMLDivElement dom和ref='dom'需一致
const change = () => {obj.value = "customRef 被改了";console.log(dom.value?.innerText);console.log(obj);
};// 自定义ref好处是针对请求接口防抖,减轻服务器压力
function myRef<T>(value: T) {//let timer: any;return customRef((track, trigger) => {return {get() {// 收集依赖track();return value;},set(newVal) {clearTimeout(timer);// 触发依赖更新timer = setTimeout(() => {timer = null; // 用完之后 清一下console.log("调用了");value = newVal;trigger();}, 500);},};});
}
const obj = myRef<string>("小曼");
</script>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • iOS工程:获取手机相册权限,iOS原生系统弹窗, Privacy隐私政策选择,如何添加系统弹出并修改描述文字
  • -- 数据结构 顺序表 --Java
  • TCP并发服务器多线程和多进程方式以及几种IO模型
  • 【Python】copy()浅拷贝与深拷贝
  • 【牛客_c++_string】HJ1字符串最后一个单词的长度
  • Spring Boot使用拦截器(Interceptor)
  • mysql中group by语句使用
  • 结果一。6.will,begoingto,betodo,beabouttodo结构的区别
  • 在CentOS 7上安装MongoDB的方法
  • ROS imu传感器节点
  • 书生大模型实战营-进阶关卡-6-MindSearch 快速部署
  • 力扣8.27
  • 阿里云对象存储服务(Aliyun OSS):企业级云存储解决方案
  • Spring Boot 集成 JdbcTemplate(盘它!)
  • 敏捷架构开发方法和实践:迎接数字化时代的挑战
  • 时间复杂度分析经典问题——最大子序列和
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • ng6--错误信息小结(持续更新)
  • React组件设计模式(一)
  • Travix是如何部署应用程序到Kubernetes上的
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • AI算硅基生命吗,为什么?
  • MPAndroidChart 教程:Y轴 YAxis
  • Spring Batch JSON 支持
  • UI设计初学者应该如何入门?
  • 数据可视化之下发图实践
  • ​Python 3 新特性:类型注解
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • (3)STL算法之搜索
  • (C语言)逆序输出字符串
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二)linux使用docker容器运行mysql
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (三十五)大数据实战——Superset可视化平台搭建
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (学习总结16)C++模版2
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • .NET Core引入性能分析引导优化
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET 发展历程
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET6 命令行启动及发布单个Exe文件
  • .NET编程——利用C#调用海康机器人工业相机SDK实现回调取图与软触发取图【含免费源码】
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • /etc/fstab和/etc/mtab的区别
  • [ 手记 ] 关于tomcat开机启动设置问题
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • [.net] 如何在mail的加入正文显示图片
  • [240607] Jina AI 发布多模态嵌入模型 | PHP 曝新漏洞 | TypeScript 5.5 RC 发布公告