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

Vue3响应式 ref全家桶

<template><div>{{ man.name }}<hr><button @click="change">修改</button></div>
</template>
<script setup lang="ts">
const man = {name:"cc"}
const change = () =>{man.name = "大cc"
}
</script>
<style scoped></style>

这样的change函数并不能实现修改值

要实现响应式就要利用 ref

ref()

ref接受一个内部值并返回一个响应式且可变的ref对象

ref对象仅仅有一个 .value 属性,指向该内部值

修改值的时候,ref返回的是ES6的class类

通过.value修改

import { ref, isRef, shallowRef, triggerRef, customRef } from 'vue'
<template><div>{{ man.name }}<hr><button @click="change">修改</button></div>
</template>
<script setup lang="ts">
const man = ref({name:"cc"})
const change = () =>{man.value.name = "大cc"
}
</script>
<style scoped></style>

这样就可以实现数据的响应式

泛型控制ref
// 自定义ref类型
type M = {name:string
}
const man = ref<M>({ name: "CC" })

 使用Vue内置的接口类型 Ref

import { Ref } from 'vue'const man = ref<Ref>({ name: "小满" })

 isRef()

isRef() 顾名思义就是判断是否是ref的

import { ref, isRef, shallowRef, triggerRef, customRef } from 'vue'
<template><div>{{ man.name }}<hr><button @click="change">修改</button></div>
</template>
<script setup lang="ts">
const man = ref({name:"cc"})
const change = () =>{man.value.name = "大cc"console.log(isRef(man))  // true
}
</script>
<style scoped></style>

shallowRef与 ref的区别

ref是深层次的,会找到最底层的值去修改

而shallowRef只会找到第一层,也就是 

man.value   这一层

 注意:shallowRef是不能和ref在一起写的,ref会影响shallowRef引起视图更新

triggerRef()

triggerRef会强制更新我们收集的依赖,shallowRef会根据triggerRef作强制的更新,就是因为ref底层调用了triggerRef,会影响shallowRef。

customRef

function myRef<T>(value: T) {let timer: anyreturn customRef((track, trigger) => {// 触发依赖和收集依赖手动实现return {get() {track()return value},set(newValue) {// console.log("触发了");// // 这时候会不停的发送请求// // 试着使用防抖clearTimeout(timer)timer = setTimeout(() => {console.log("触发了");value = newValuetimer = nulltrigger()}, 1000);}}})  // customRef是一个回调函数要求return一个对象,对象里面去实习get和set两个方法// track收集依赖// trigger
}
ref操作DOM
<template><div ref="dom">我是dom元素</div>
</template>
<script setup lang='ts'>import {  ref  } from 'vue'const dom = ref<HTMLDivElement>()console.log(dom.value?.innerHTML) // 我是dom元素
</script>

http://www.lryc.cn/news/385851.html

相关文章:

  • Mac(M1芯片)安装多个jdk,Mac卸载jdk
  • Warning message:package ‘ggplot2’ is not available (for R version 3.2.3)
  • Spring Boot 过滤器和拦截器详解
  • Eureka介绍与使用
  • JVM专题九:JVM分代知识点梳理
  • wireshark常用过滤命令
  • 「全新升级,性能更强大——ONLYOFFICE 桌面编辑器 8.1 深度评测」
  • 线程版服务器实现(pthread_server)
  • js异常处理方案
  • C++文件路径处理2 - 路径拼接路径解析
  • 数据结构5---矩阵和广义表
  • jquery使用infinitescroll无线滚动+自定义翻页
  • 【漏洞复现】锐捷统一上网行为管理与审计系统——远程命令执行漏洞
  • 通义灵码上线 Visual Studio 插件市场啦!
  • GESP 四级急救包(2):客观题真题集
  • VERYCLOUD睿鸿股份确认参展2024年ChinaJoy BTOB商务洽谈馆,期待与你相聚
  • Java面试题:讨论Spring框架的核心组件,如IoC容器、AOP、事务管理等
  • 【方案】基于5G智慧工业园区解决方案(PPT原件)
  • 使用System.currentTimeMillis获取当前时间
  • 手机远程控制另一台手机的全新使用教程(安卓版)
  • 商城积分系统的代码实现(上)-- 积分账户及收支记录
  • 【C++进阶9】异常
  • RecyclerVIew->加速再减速的RecyclerVIew平滑对齐工具类SnapHelper
  • 突破SaaS产品运营困境:多渠道运营如何集中管理?
  • 智能语音热水器:置入NRK3301离线语音识别ic 迈向智能家居新时代
  • Redis集群部署合集
  • 【HDFS】关于Hadoop的IPC.Client类的一些整理
  • Swoole v6 能否让 PHP 再次伟大?
  • C++ STL Iterator Adapter
  • android-aidl5