【vue3】实现数据响应式(ref、shallowRef、trigger、reactive、shallowReactive、toRef、toRefs)

本文主要是介绍【vue3】实现数据响应式(ref、shallowRef、trigger、reactive、shallowReactive、toRef、toRefs),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、ref、shallowRef、trigger

ref支持所有类型
可以粗略理解为 ref = shallowRef + triggerRef

1、通过ref获取dom元素

<p ref="_ref">这是ref获取dom元素</p>import {ref,shallowRef, triggerRef} from 'vue'const _ref = ref()console.log(_ref.value?.innerText)

2、实现数据响应

import {ref,shallowRef, triggerRef} from 'vue'//reftype M = {name:string,age:number}const personObj= ref<M>({name:'孙悟空',age:90})const fn1= ()=>{personObj.value.name = '白骨精' //视图也会更新console.log(personObj)}//shallowRefconst man = shallowRef ({name:'张三'})const fn1= ()=>{/*** man是shallowRef对象,直接更改value值不会更新视图,调用triggerRef强制更新* 并且会受ref变量personObj更改值的影响(personObj.value.name = '白骨精')* 所以ref和shallowRef不要写在一起* 可以粗略理解为 ref = shallowRef + triggerRef*/man.value.name = '李四'  triggerRef(man)console.log(man) //视图会更新}

二、reactive、shallowReactive

reactive只接收引用类型 array、object、map
shallowReactive与shallowRef的问题一样,shallowReactive只能响应第一层


//对象场景type M2 = {name:string,age:number}let from = reactive<M2>({name:'yyx',age:18})from.age = 90 //不需要.value  和ref不一样,ref取值/赋值都需要.value//数组场景let list = reactive<string[]>([])list = ['aaa','bbb','ccc']//数据异步场景(从接口请求回来)/*** 异步数据不能直接 = 赋值* 通过push* 或者定义为对象,包裹起来*/let list = reactive<string[]>([])setTimeout(() => {const res = ['aaa','bbb','ccc']list.push(...res)  //通过push注入值,不能直接 = 赋值}, 3000);/**或者*/let data = reactive<any>({list:[]})setTimeout(() => {const res = ['aaa','bbb','ccc']data.list = res}, 3000);

三、toRef、toRefs、toRaw

只能对响应式的对象有用,非响应式的 视图毫无变化;
reactive的值被解构出来丢失了响应式,这个时候就要用toRef、toRefs;
为了单独提取对象中的一个,然后变成响应式,可以把toRef、toRefs理解为解构操作;

import {reactive,toRef, toRefs,toRaw} from 'vue'/*** toRef* 一次性解构一个*/const toRef_Obj = reactive({name:'游芸霞',nickname:'fenyin'})/**只更新视图,但是toRef_Obj内的数据并未变化 */let {name,nickname} = toRef_Objname = 'youyunxia' //这样写toRef_Obj的name还是'游芸霞“/**双向响应式,视图、数据都发生变化 */let _toRef_name = toRef(toRef_Obj,'name')_toRef_name.value = 'youyunxia' //这样写toRef_Obj的name就会变成'youyunxia“/*** toRefs* 和toRef一样,只是toRefs一次性解构多个*/let {name,nickname} = toRefs(toRef_Obj)name.value = '张三'console.log('toRefs========',name,nickname)/*** toRaw* 不想要响应式的proxy时,可以用toRaw转化*/console.log('响应式=============',toRef_Obj)console.log('非响应式===========',toRaw(toRef_Obj))

toRaw()效果图
在这里插入图片描述

这篇关于【vue3】实现数据响应式(ref、shallowRef、trigger、reactive、shallowReactive、toRef、toRefs)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/196515

相关文章

Python实现AVIF图片与其他图片格式间的批量转换

《Python实现AVIF图片与其他图片格式间的批量转换》这篇文章主要为大家详细介绍了如何使用Pillow库实现AVIF与其他格式的相互转换,即将AVIF转换为常见的格式,比如JPG或PNG,需要的小... 目录环境配置1.将单个 AVIF 图片转换为 JPG 和 PNG2.批量转换目录下所有 AVIF 图

Pydantic中model_validator的实现

《Pydantic中model_validator的实现》本文主要介绍了Pydantic中model_validator的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录引言基础知识创建 Pydantic 模型使用 model_validator 装饰器高级用法mo

Vue3使用router,params传参为空问题

《Vue3使用router,params传参为空问题》:本文主要介绍Vue3使用router,params传参为空问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录vue3使用China编程router,params传参为空1.使用query方式传参2.使用 Histo

AJAX请求上传下载进度监控实现方式

《AJAX请求上传下载进度监控实现方式》在日常Web开发中,AJAX(AsynchronousJavaScriptandXML)被广泛用于异步请求数据,而无需刷新整个页面,:本文主要介绍AJAX请... 目录1. 前言2. 基于XMLHttpRequest的进度监控2.1 基础版文件上传监控2.2 增强版多

Redis分片集群的实现

《Redis分片集群的实现》Redis分片集群是一种将Redis数据库分散到多个节点上的方式,以提供更高的性能和可伸缩性,本文主要介绍了Redis分片集群的实现,具有一定的参考价值,感兴趣的可以了解一... 目录1. Redis Cluster的核心概念哈希槽(Hash Slots)主从复制与故障转移2.

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进