《Vue3学习手记8》

vue3中的一些API

shallowRef ( ) 和shallowReactive ( )

shallowRef (浅层响应式)
1.作用:创建一个响应式数据,但只对顶层属性进行响应式处理。
2.用法:
const original=ref(...)
const original2=shallowRef(original)
3.特点:只跟踪引用值的变化,不关心值内部的属性变化。

shallowReactive (浅层响应式)
1.作用:创建一个浅层响应式对象,只会使对象的最顶层属性变成响应式的,对象内部的嵌套属性则不会变成响应式的
2.用法:
const myObj = reactive({...})
const myObj2= shallowReactive({myObj})
3.特点:对象的顶层属性是响应式的,但嵌套对象的属性不是。

总结
通过使用shallowRef()和shallowReactive()来绕开深度响应。浅层式API创建的状态只在其顶层是响应式的,对所有深层的对象不会做任何处理,避免了对每一个内部属性做响应式所带来的性能成本,这使得属性的访问变得更快,可提升性能。

readonly( ) 和 shallowReadonly( )

readonly
1.作用:用于创建一个对象的深只读副本。 (不可修改)
2.用法:
const original = reactive({...})
const original2 = readonly({ original })
3.特点:
对象的所有嵌套属性都将变为只读
任何尝试修改这个对象的操作都会被阻止(在开发模式下,还会在控制台中发出警告)。
4.应用场景:
创建不可变的状态快照。
保护全局状态或配置不被修改。

shallowReadonly
1.作用:与readonly类似,但只作用于对象的顶层属性。
2.用法:
const original = reactive({...})
const original2 = shallowReadonly({ original })
3.特点:
只将对象的顶层属性设置为只读,对象内部的嵌套属性仍然是可变的。
适用于只需保护对象顶层属性的场景。

toRaw( ) 和 markRaw( )

toRaw
1.作用:用于获取一个响应式对象的原始对象。
2.toRaw返回的对象不再是响应式的,不会触发视图的更新。
场景:
在需要将响应式对象传递给非vue的库或外部系统时,使用toRaw可以确保他们收到的是普通对象
用法:
const original = reactive({...}) //响应式数据
const original2 = toRaw({ original }) //原始数据

markRaw
1.作用:标记一个对象,使其永远不会变成响应式的。
例如:第三方库:mockjs
const mockJs = markRaw({mockjs})
const mockJs2 = reactive({ mockJs }) //mockJs2不是响应式数据

customRef

重点注意:track,trigger

<template><h2>信息是:{{msg}}</h2><input type="text" v-model="msg"><!-- 双向绑定  获取响应式数据 -->
</template><script setup lang="ts" name="App">import {ref} from "vue"const msg=ref("你好")
</script>

结果:
在这里插入图片描述

<template><h2>信息是:{{msg}}</h2><input type="text" v-model="msg"><!-- 双向绑定  获取响应式数据 -->
</template><script setup lang="ts" name="App">import {customRef,ref} from "vue"// const msg=ref("你好")  //使用ref只能实现基本的响应式数据变化// 要求:表单中数据变化后1秒之后,h2中的数据发生改变// 这时用ref来做是不能实现的,所以使用自定义响应式:customRef  (customRef是一个函数)let initValue=""let timerconst msg=customRef((track,trigger)=>{  //回调函数里有两个参数:track(跟踪)和trigger(触发)return {get(){   //读取msg时调用get()track()  //告诉vue数据很重要,需要持续关注,一旦有变化就要更新  (跟踪)return initValue},set(value){   //msg发生变化时调用set()clearTimeout(timer)  //防止重复开启定时器timer=setTimeout(()=>{initValue=valuetrigger()  //通知vue数据改变},1000)}}})
</script>

封装自定义响应式数据:
App.vue:

<template><h2>信息是:{{msg}}</h2><input type="text" v-model="msg"><!-- 双向绑定  获取响应式数据 -->
</template><script setup lang="ts" name="App">import {customRef,ref} from "vue"// const msg=ref("你好")  //使用ref只能实现基本的响应式数据变化// 要求:表单中数据变化后1秒之后,h2中的数据发生改变// 这时用ref来做是不能实现的,所以使用自定义响应式:customRef  (customRef是一个函数)import useMsgRef from "./useMsgRef";const {msg}=useMsgRef("你好啊",2000)  //传入两个参数
</script>

useMsgRef.ts:

// 封装自定义ref
import {customRef} from "vue"export default function(initValue:string,delay:number){  //注意这里的参数let timerconst msg=customRef((track,trigger)=>{  //回调函数里有两个参数:track(跟踪)和trigger(触发)return {get(){   //读取msg时调用get()track()  //告诉vue数据很重要,需要持续关注,一旦有变化就要更新  (跟踪)return initValue},set(value){   //msg发生变化时调用set()clearTimeout(timer)  //防止重复开启定时器timer=setTimeout(()=>{initValue=valuetrigger()  //通知vue数据改变},delay)}}})return {msg}}

Teleport

作用:将组件html结构移动到指定位置的技术
ModalPage.vue:

<template><div class="modal"><h2>我是ModalPage组件</h2><button @click="isShow=true">展开弹框</button><teleport to="body">   <!-- <teleport to=".app"> --><div class="content" v-show="isShow"><h2>弹框标题</h2><h2>弹框内容</h2><button @click="isShow=false">关闭弹框</button></div></teleport></div>
</template><script setup name="ModalPage">
import {ref} from "vue"
const isShow=ref(false)
</script><style scoped>.modal {width: 600px;height: 200px;background-color: pink;box-shadow: 0 0 10px;border-radius: 5px;margin-top: 50px;}.content {background-color: skyblue;width: 320px;height: 200px;text-align: center;position:fixed;/* position:fixed;以视口为参照物 */top:50%;left:50%;transform: translate(-50%,-50%);}
</style>

App.vue:

<template><div class="app"><h2>我是App组件</h2><img src="./assets/images/11.png"><ModalPage/></div>
</template><script setup lang="ts" name="App">import ModalPage from "./components/ModalPage.vue"
</script><style scoped>.app {width: 800px;height: 600px;background-color: #ddd;border-radius: 10px;box-shadow: 0 0 10px;}img {width: 200px;height: 130px;background-size: cover;/* 对于以前: *//* 当不加css样式中的filter滤镜时,子组件的position:fixed是可以根据视口来调整大小 *//* 但当加上这个样式之后,position:fixed失效 */filter: saturate(200%);/* saturate是饱和度的意思 *//* 解决方法:在模板中给需要根据视口调整大小的内容外包上<teleport>标签 并加上to属性(具体见子组件) */}
</style>

Suspense

等待异步组件时渲染一些额外内容,让应用有更好的用户体验使用步骤:

  1. 异步引入组件
  2. 使用Suspense包裹组件,并配置好defaultfallback
    App.vue:
<template><div class="app"><h2>我是App组件</h2><!-- 当子组件里要处理异步任务,网速慢时想要在页面呈现一些东西就可以使用Suspense --><Suspense><template v-slot:default><ModalPage/></template></Suspense><!-- 当网速慢,页面没加载出来时可以显示的内容 --><Suspense><template v-slot:fallback><h2>loading...</h2></template></Suspense></div>
</template><script setup lang="ts" name="App">import ModalPage from "./components/ModalPage.vue"
</script>

ModalPage.vue:

<template><div class="modal"><h2>我是ModalPage组件</h2>  </div>
</template><script setup name="ModalPage">
import {ref} from "vue"
import axios from "axios"
// 异步获取数据
let msg=await axios.get("https://api.uomg.com/api/rand.qinghua?format=json")
console.log(msg)
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/79651.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

双列集合——map集合和三种遍历方式

双列集合的特点 键和值一一对应&#xff0c;每个键只能对应自己的值 一个键和值整体称为键值对或键值对对象&#xff0c;java中叫做entry对象。 map常见的api map接口中定义了双列集合所有的共性方法&#xff0c;下面三个实现类就没有什么额外新的方法要学习了。 map接口…

Linux安装部署Postgresql数据库

联网安装方案 Linux能在线安装依赖组件的前提下&#xff0c;可以快速安装部署PG数据库&#xff0c;安装过程使用root管理员帐号&#xff1a; 首先&#xff0c;使用如下命令自动下载Postgresql组件&#xff1a; # 在openEuler、Fedora或CentOS 8上&#xff0c;你可能会使用&a…

供应链算法整理(二)--- 智能补货

供应链业务的目标价值是&#xff1a;优化货品的供给、销售提供支撑&#xff0c;以降低成本&#xff0c;提高时效、收益&#xff0c;最终提升用户体验。基于目标价值&#xff0c;整体的算法模块分为&#xff1a;智能选品、智能预测、品仓铺货、智能补货、智能调拨、仓网路由、快…

vscode 个性化

vscode 个性化 设置 吸顶效果 使用前使用后 设置方法 VS Code 的粘性滚动预览 - 类似于 Excel 的冻结首行 插件 代码片段分享 - CodeSnap 使用方式 CtrlShiftP输入CodeSnap 唤起插件选择代码 行内报错提示 - Error Lens 使用前使用后 VSCode Error Lens插件介绍&…

Rockermq的部署与使用(0-1)

​RocketMQ​ 是阿里巴巴开源的一款 ​分布式消息中间件&#xff0c;具有高吞吐、低延迟、高可用等特点&#xff0c;广泛应用于多个领域&#xff0c;包括异步通信解耦、企业解决方案、金融支付、电信、电子商务、快递物流、广告营销、社交、即时通信、移动应用、手游、视频、物…

软件测试报告机构如何保障软件质量并维护其安全性?

软件测试报告机构在软件开发流程里起着十分关键的作用&#xff0c;它可以保障软件的质量&#xff0c;它还能够维护软件的安全性。下面&#xff0c;我们就来深入了解一下这类机构。 机构作用 软件测试报告机构是软件质量的“把关者”&#xff0c;能对软件进行全面评估&#xf…

4个纯CSS自定义的简单而优雅的滚动条样式

今天发现 uni-app 项目的滚动条不显示&#xff0c;查了下原来是设置了 ::-webkit-scrollbar {display: none; } 那么怎么用 css 设置滚动条样式呢&#xff1f; 定义滚动条整体样式‌ ::-webkit-scrollbar 定义滚动条滑块样式 ::-webkit-scrollbar-thumb 定义滚动条轨道样式‌…

ES6入门---第二单元 模块五:模块化

js不支持模块化 注意&#xff1a; 需要放到服务器环境 1、如何定义模块&#xff1f; export 东西 例&#xff1a;1.js文件中 console.log(1模块加载了);//显示是否加载了 export const a 12; export const b 5; export let c 101; const a12; const b5; const c101;ex…

14.Excel:排序和筛选

一 位置 两个位置。 二 排序&#xff1a;如何使用 1.常规使用 补充&#xff1a;不弹出排序提醒排序。 选中要排序列中的任意一个单元格&#xff0c;然后排序。 2.根据要求进行排序 1.根据姓名笔画进行降序排序 要勾选上数据包含标题&#xff0c;默认是勾选了。 2.根据运营部、…

嵌入式系统基础知识

目录 一、冯诺依曼结构与哈佛结构 &#xff08;一&#xff09;冯诺依曼结构 &#xff08;二&#xff09;哈佛架构 二、ARM存储模式 &#xff08;一&#xff09;大端模式 &#xff08;二&#xff09;小端模式 &#xff08;三&#xff09;混合模式 三、CISC 与 RISC &am…

CSS 预处理器 Sass

目录 Sass 一、Sass 是什么&#xff1f; 二、核心功能详解 1. 变量&#xff08;Variables&#xff09; 2. 嵌套&#xff08;Nesting&#xff09; 3. 混合宏&#xff08;Mixins&#xff09; 4. 继承&#xff08;Inheritance&#xff09; 5. 运算&#xff08;Operations&…

信息收集新利器:SSearch Chrome 插件来了

SSearch 下载地址 SSearch &#x1f623;用途 每次谷歌语法搜索时还得自己写&#xff0c;我想省事一点&#xff0c;弄了一个插件&#xff0c;先加了几个常用的语法&#xff0c;点击后会跳转到对应搜索页面&#xff0c;也可以直接在搜索框微调 后续也会加些其他语法 &#…

Docker搭建SFTP

在这个教程中&#xff0c;我们将通过一个简单的例子来展示如何使用 Docker 和 atmoz/sftp 镜像设置一个基本的 SFTP 服务。这个服务将允许用户通过 SFTP 安全地访问和管理文件。我们将配置一个名为 ops 的用户&#xff0c;其密码为 123456&#xff0c;并限定用户只能访问特定的…

正态分布习题集 · 答案与解析篇

正态分布习题集 答案与解析篇 与题目篇编号一致,如有其他解题思路,欢迎在评论区交流。 1. 基础定义与性质 1.1 密度函数 X ∼ N ( μ , σ 2 ) X \sim N(\mu,\sigma^2) X∼N(μ,σ2) 的 PDF: [ f(x) = \frac{1}{\sigma\sqrt{2\pi}} \exp\left(-\frac{(x-\mu)2}{2\sigma2}\…

Java学习手册:SQL 优化技巧

一、SQL 查询优化 选择合适的索引列 &#xff1a;索引可以显著提高查询速度&#xff0c;但需要选择合适的列来创建索引。通常&#xff0c;对于频繁作为查询条件的列、连接操作的列以及排序或分组操作的列&#xff0c;应该考虑创建索引。例如&#xff0c;在一个订单表中&#xf…

(02)Redis 的订阅发布Pub/Sub

我们为了自己实现一个MQ功能&#xff0c;就要深入底层挖掘现有开源产品的实现过程。 Redis 发布订阅底层结构解析 Redis 不存储消息&#xff0c;仅作为“实时中转”&#xff1b;只有订阅者在线时才能收到消息&#xff1b;消息是广播给所有订阅此频道的客户端。 1. 核心数据结…

使用Docker一键安装SigLens:简单快捷的日志分析解决方案

在当今复杂的IT环境中,高效的日志管理和分析变得越来越重要。SigLens作为一款强大的开源日志分析工具,为开发者和运维人员提供了直观、高效的日志处理体验。本文将介绍如何使用Docker快速安装SigLens,让您在几分钟内就能开始进行日志分析。 为什么选择Docker安装SigLens? Do…

C#与西门子PLC通信:S7NetPlus和HslCommunication使用指南

西门子S7协议是用来和PLC进行通讯的一个协议&#xff0c;默认端口是102&#xff0c;数据会保存在一个个DB块中&#xff0c;比较经典的用法是一个DB块专门用来读取&#xff0c;一个用来写入。 DB&#xff08;数据块&#xff09; {块号}.DBX/DBD/DBW{字节地址}.{位偏移} 1、数据…

【中间件】brpc_基础_remote_task_queue

文章目录 remote task queue1 简介2 核心功能2.1 任务提交与分发2.2 无锁或低锁设计2.3 与 bthread 深度集成2.4 流量控制与背压 3 关键实现机制3.1 数据结构3.2 任务提交接口3.3 任务窃取&#xff08;Work Stealing&#xff09;3.4 同步与唤醒 4 性能优化5 典型应用场景6 代码…

C语言实现数据结构:堆排序和二叉树_链式

一.堆的应用 1.堆排序 void test01() {int arr[] { 17,20,10,13,19,15 };int n sizeof(arr) / sizeof(arr[0]);HP p;HPInit(&p);for (int i 0; i < n; i){HPPush(&p, arr[i]);}int i 0;while (!HPEmpty(&p)){arr[i] HPTop(&p);HPPop(&p);}for (i…