当前位置:首页 > 科技  > 软件

总结了十个Vue3超级实用但是很冷门的API

来源: 责编: 时间:2024-01-16 17:32:41 338观看
导读今天给大家分享几个很少人用,但是又非常有用的 Vue3 的 API,废话不多说,往下看吧。文章提示:下文的无效 不触发视图 不触发响应式更新 不被追踪 这些词汇,想表达的意思是一样的,意思都是不被追踪。readonly顾名思义,就是只读

今天给大家分享几个很少人用,但是又非常有用的 Vue3 的 API,废话不多说,往下看吧。YhX28资讯网——每日最新资讯28at.com

文章提示:下文的无效 不触发视图 不触发响应式更新 不被追踪 这些词汇,想表达的意思是一样的,意思都是不被追踪。YhX28资讯网——每日最新资讯28at.com

YhX28资讯网——每日最新资讯28at.com

readonly

顾名思义,就是只读的意思,如果你的数据被这个 API 包裹住的话,那么修改之后并不会触发响应式,并且会提示警告:YhX28资讯网——每日最新资讯28at.com

YhX28资讯网——每日最新资讯28at.com

YhX28资讯网——每日最新资讯28at.com

readonly 的用途一般用于一些 hooks 暴露出来的变量,不想外界去修改,比如我封装一个 hooks,这样去做的话,那么外界只能用变量,但是不能修改变量,这样大大保护了 hooks 内部的逻辑:YhX28资讯网——每日最新资讯28at.com

YhX28资讯网——每日最新资讯28at.com

shallowRef

shallowRef 用来包住一个基础类型或者引用类型,如果是基础类型那么跟 ref 基本没区别,如果是引用类型的话,那么直接改深层属性是不能触发响应式的,除非直接修改引用地址,如下:YhX28资讯网——每日最新资讯28at.com

YhX28资讯网——每日最新资讯28at.com

注意:改深层属性能改数据,只是没触发响应式,所以当下一次响应式触发的时候,你修改的深层数据会渲染到页面上。YhX28资讯网——每日最新资讯28at.com

shallowRef 的用处主要用于一些比较大的但又变化不大的数据,比如我有一个表格数据,通过接口直接获取,并且主要用在前端展示,需要修改一些深层的属性,但是这些属性并不需要立即表现在页面上,比如以下例子,我只需要展示 name、age 字段,至于 isOld 字段并不需要展示,我想要计算 isOld 但是又不想触发响应式更新,所以可以用 shallowRef 包起来,进而减少响应式更新,优化性能。YhX28资讯网——每日最新资讯28at.com

YhX28资讯网——每日最新资讯28at.com

shallowReactive

shallowReactive 用来包住一个引用类型,被包住后,修改第一层才会触发响应式更新,也就是浅层的属性,修改深层的属性并不会触发响应式更新。YhX28资讯网——每日最新资讯28at.com

注意:改深层属性能改数据,只是没触发响应式,所以当下一次响应式触发的时候,你修改的深层数据会渲染到页面上:YhX28资讯网——每日最新资讯28at.com

YhX28资讯网——每日最新资讯28at.com

shallowReactive 用的比较少,shallowReactive 的用处跟 shallowRef 比较像,都是为了让一些比较大的数据能减少响应式更新,进而优化性能。YhX28资讯网——每日最新资讯28at.com

toRef & toRefs

先说说 toRef 吧,我们平时在使用 reactive 的时候会有一个苦恼,那就是解构,比如看以下例子,我们为了少些一些代码,解构出来了 name 并放到模板里渲染,但是当我们想改原数据的时候,发现 name 并不会更新,这就是解构出来基础类型的苦恼。YhX28资讯网——每日最新资讯28at.com

YhX28资讯网——每日最新资讯28at.com

YhX28资讯网——每日最新资讯28at.com

这时我们可以使用 toRef,这个时候我们直接修改 name 也会触发原数据的修改,修改原数据也会触发 name 的修改:YhX28资讯网——每日最新资讯28at.com

YhX28资讯网——每日最新资讯28at.com

YhX28资讯网——每日最新资讯28at.com

但是如果是属性太多了,我们想一个一个去用 toRef 的话会写很多代码:YhX28资讯网——每日最新资讯28at.com

YhX28资讯网——每日最新资讯28at.com

所以我们可以使用 toRefs 一次性解构:YhX28资讯网——每日最新资讯28at.com

YhX28资讯网——每日最新资讯28at.com

toRaw & markRaw & unref

toRaw 可以把一个响应式 reactive 转成普通对象,也就是把响应式对象转成非响应式对象:YhX28资讯网——每日最新资讯28at.com

YhX28资讯网——每日最新资讯28at.com

toRaw 主要用在回调传参中,比如我封装一个 hooks,我想要把 hooks 内维护的响应式变量转成普通数据,当做参数传给回调函数,可以用 toRaw:YhX28资讯网——每日最新资讯28at.com

YhX28资讯网——每日最新资讯28at.com

markRaw 可以用来标记响应式对象里的某个属性不被追踪,如果你的响应式对象里有某个属性数据量比较大,但又不想被追踪,你可以使用 markRaw:YhX28资讯网——每日最新资讯28at.com

YhX28资讯网——每日最新资讯28at.com

unref 相当于返回 ref 的 value:YhX28资讯网——每日最新资讯28at.com

YhX28资讯网——每日最新资讯28at.com

effectScope & onScopeDispose

effectScope 可以有两个作用:YhX28资讯网——每日最新资讯28at.com

  • 收集副作用
  • 全局状态管理

(1) 收集副作用YhX28资讯网——每日最新资讯28at.com

比如我们封装一个共用的 hooks,为了减少页面隐患,肯定会统一收集副作用,并且在组件销毁的时候去统一消除,比如以下代码:YhX28资讯网——每日最新资讯28at.com

YhX28资讯网——每日最新资讯28at.com

但是这么收集很麻烦, effectScope 能帮我们做到统一收集,并且通过 stop 方法来进行清除,且 stop 执行的时候会触发 effectScope 内部的 onScopeDispose:YhX28资讯网——每日最新资讯28at.com

YhX28资讯网——每日最新资讯28at.com

我们可以利用 effectScope & onScopeDispose 来做一些性能优化,比如下面这个例子,我们封装一个鼠标监听的 hooks:YhX28资讯网——每日最新资讯28at.com

YhX28资讯网——每日最新资讯28at.com

但是如果在页面里调用多次的话,那么势必会往 window 身上监听很多多余的事件,造成性能负担,所以解决方案就是,无论页面里调用再多次 useMouse,我们只往 window 身上加一个鼠标监听事件:YhX28资讯网——每日最新资讯28at.com

YhX28资讯网——每日最新资讯28at.com

(2) 全局状态管理YhX28资讯网——每日最新资讯28at.com

现在 Vue3 最火的全局状态管理工具肯定是 Pinia 了,那么你们知道 Pinia 的原理是什么吗?原理就是依赖了 effectScope:YhX28资讯网——每日最新资讯28at.com

YhX28资讯网——每日最新资讯28at.com

所以我们完全可以自己使用 effectScope 来实现自己的局部状态管理,比如我们封装一个通用组件,这个组件层级比较多,并且需要共享一些数据,那么这个时候肯定不会用 Pinia 这种全局状态管理,而是会自己写一个局部的状态管理,这个时候 effectScope 就可以排上用场了。YhX28资讯网——每日最新资讯28at.com

vueuse 中的 createGlobalState 就是为了这个而生:YhX28资讯网——每日最新资讯28at.com

YhX28资讯网——每日最新资讯28at.com

YhX28资讯网——每日最新资讯28at.com

provide & inject

Vue3 用来提供注入的 API,主要是用在组件的封装,比如那种层级较多的组件,且子组件需要依赖父组件甚至爷爷组件的数据,那么可以使用 provide & inject,最典型的例子就是 Form 表单组件,可以去看看各个组件库的源码,表单组件大部分都是用 provide & inject 来实现的,比如 Form、Form-Item、Input这三个需要互相依赖对方的规则、字段名、字段值,所以用 provide & inject 会更好。具体用法看文档吧~https://cn.vuejs.org/guide/components/provide-inject.html:YhX28资讯网——每日最新资讯28at.com

YhX28资讯网——每日最新资讯28at.com


YhX28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-62789-0.html总结了十个Vue3超级实用但是很冷门的API

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 花 15 分钟把 Express.js 搞明白,全栈没有那么难

下一篇: 2023 年顶级前端工具,你都用了哪些呢?

标签:
  • 热门焦点
  • 对标苹果的灵动岛 华为带来实况窗功能

    继苹果的灵动岛之后,华为也在今天正式推出了“实况窗”功能。据今天鸿蒙OS 4.0的现场演示显示,华为的实况窗可以更高效的展现出实时通知,比如锁屏上就能看到外卖、打车、银行
  • 摸鱼心法第一章——和配置文件说拜拜

    为了能摸鱼我们团队做了容器化,但是带来的问题是服务配置文件很麻烦,然后大家在群里进行了“亲切友好”的沟通图片图片图片图片对比就对比,简单对比下独立配置中心和k8s作为配
  • 十个简单但很有用的Python装饰器

    装饰器(Decorators)是Python中一种强大而灵活的功能,用于修改或增强函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为参数,并返回一个新的函数或类。它们通常用
  • 让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 微信语音大揭秘:为什么禁止转发?

    大家好,我是你们的小米。今天,我要和大家聊一个有趣的话题:为什么微信语音不可以转发?这是一个我们经常在日常使用中遇到的问题,也是一个让很多人好奇的问题。让我们一起来揭开这
  • 腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之“想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!”曾凭借直播腾讯旗下代理格斗游戏《DNF》一
  • iQOO Neo8系列今日官宣:首发天玑9200+ 全球安卓最强芯!

    在昨日举行的的联发科新一代旗舰芯片天玑9200+的发布会上,iQOO官方也正式宣布,全新的iQOO Neo8系列新品将全球首发搭载这款当前性能最强大的移动平台
  • OPPO K11采用全方位护眼屏:三大护眼能力减轻视觉疲劳

    日前OPPO官方宣布,全新的OPPO K11将于7月25日正式发布,将主打旗舰影像,和同档位竞品相比,其最大的卖点就是将配备索尼IMX890主摄,堪称是2000档位影像表
  • 联想的ThinkBook Plus下一版曝光,键盘旁边塞个平板

    ThinkBook Plus 是联想的一个特殊笔记本类别,它在封面放入了一块墨水屏,也给人留下了较为深刻的印象。据有人爆料,联想的下一款 ThinkBook Plus 可能更特殊,它
Top