Vue3学习05 一些API

Vue3-API

  • 其它 API
    • 【shallowRef 与 shallowReactive 】
      • shallowRef
      • shallowReactive
      • 总结
    • 【readonly 与 shallowReadonly】
      • readonly
      • shallowReadonly
    • 【toRaw 与 markRaw】
      • toRaw
      • markRaw
    • 【customRef】
  • Vue3新组件
    • 【Teleport】
    • 【Suspense】
    • 【全局API转移到应用对象】
    • 【其他】

其它 API

【shallowRef 与 shallowReactive 】

shallowRef

  1. 作用:创建一个响应式数据,但只对顶层属性进行响应式处理。

    浅层次的ref:只处理第一层的数据

  2. 用法:

    import {shallowRef} from 'vue'
    let myVar = shallowRef(initialValue);
    myVar.value 
    
  3. 特点:只跟踪引用值的变化,不关心值内部的属性变化。

  4. 作用

  • 示例

在这里插入图片描述

<template><div class="app"><h2>求和为:{{ sum }}</h2><h2>名字为:{{ person.name }}</h2><h2>年龄为为:{{ person.age }}</h2><button @click="changeSum">sum+1</button><button @click="changeName">修改名字</button><button @click="changeAge">修改年龄</button><button @click="changePerson">修改整个人</button></div>
</template><script lang="ts" setup name="App">import {ref, shallowRef} from 'vue'let sum = shallowRef(0)let person = shallowRef({name: '张三',age: 18})function changeSum() {sum.value += 1}function changeName() {person.value.name = '李四'}function changeAge() {person.value.age = 20}function changePerson() {person.value = {name: 'tony', age: 100}}

shallowReactive

  1. 作用:创建一个浅层响应式对象,只会使对象的最顶层属性变成响应式的,对象内部的嵌套属性则不会变成响应式的

  2. 用法:

    const myObj = shallowReactive({ ... });
    
  3. 特点:对象的顶层属性是响应式的,但嵌套对象的属性不是。

总结

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

【readonly 与 shallowReadonly】

readonly

  1. 作用:用于创建一个对象的只读副本。

  2. 用法:ref、reactive都可以用

    // 可以用在 ref reactive 上
    import { reactive,readonly } from 'vue'
    const original = reactive({ ... });
    const readOnlyCopy = readonly(original);import { ref,readonly } from 'vue'
    const o = ref({ ... });
    const readOnlyCopy = readonly(original);
    
  3. 特点:

    • 对象的所有嵌套属性都将变为只读。
    • 任何尝试修改这个对象的操作都会被阻止(在开发模式下,还会在控制台中发出警告)。
  4. 应用场景:

    • 创建不可变的状态快照。
    • 保护全局状态或配置不被修改。
  5. 注意不是一锤子买卖,原本关联的数据变化它也会变,但是单独对其修改就不可以

  • 示例

在这里插入图片描述

<template><div class="app"><h2>当前sum1为:{{ sum1 }}</h2><h2>当前sum2为:{{ sum2 }}</h2><button @click="changeSum1">sum1+1</button><button @click="changeSum2">sum2+1</button></div>
</template><script setup lang="ts" name="App">import { ref,readonly } from 'vue'let sum1 = ref(0)let sum2 = readonly(sum1) // 这里会自动补上 .value,但是不可以// 要求必须是响应式对象function changeSum1 (){sum1.value += 1}function changeSum2 (){sum2.value += 1 // 这一行会报错}</script>

shallowReadonly

  1. 作用:与 readonly 类似,但只作用于对象的顶层属性。

  2. 用法:

    const original = reactive({ ... });
    const shallowReadOnlyCopy = shallowReadonly(original);
    
  3. 特点:

    • 只将对象的顶层属性设置为只读,对象内部的嵌套属性仍然是可变的。

    • 适用于只需保护对象顶层属性的场景。

【toRaw 与 markRaw】

toRaw

  1. 作用:用于获取一个响应式对象的原始对象toRaw 返回的对象不再是响应式的,不会触发视图更新。

    官网描述:这是一个可以用于临时读取而不引起代理访问/跟踪开销,或是写入而不触发更改的特殊方法。不建议保存对原始对象的持久引用,请谨慎使用。

    何时使用? —— 在需要将响应式对象传递给非 Vue 的库或外部系统时,使用 toRaw 可以确保它们收到的是普通对象

  2. 具体编码:

    import { reactive,toRaw,markRaw,isReactive } from "vue";/* toRaw */
    // 响应式对象
    let person = reactive({name:'tony',age:18})
    // 原始对象
    let rawPerson = toRaw(person)
    

在这里插入图片描述

markRaw

  1. 作用:标记一个对象,使其永远不会变成响应式的。

  2. 编码:

    import { reactive,markRaw,isReactive } from "vue";/* markRaw */
    // 比如 中国直辖城市就这几个,不发生改变
    let citysd = markRaw([{id:'asdda01',name:'北京'},{id:'asdda02',name:'上海'},{id:'asdda03',name:'天津'},{id:'asdda04',name:'重庆'}
    ])
    // 根据原始对象citys去创建响应式对象citys2 —— 【!创建失败】,因为citys被markRaw标记了
    let citys2 = reactive(citys)console.log(isReactive(citys))
    console.log(isReactive(citys2))
    
  3. 使用场景:例如使用mockjs时,为了防止误把mockjs变为响应式对象,可以使用 markRaw 去标记mockjs

① npm i mockjs

import mockjs from 'mockjs'
let mockJs = markRaw(mockjs)

【customRef】

作用:创建一个自定义的ref,并对其依赖项跟踪和更新触发进行逻辑控制。

<template><div class="app"><h2>{{ msg }}</h2><input type="text" v-model="msg"></div>
</template><script setup lang="ts" name="App">import {ref,customRef} from 'vue'// import useMsgRef from './useMsgRef'//(1)// 使用Vue提供的默认ref定义响应式数据,数据一变,页面就更新// let msg = ref('你好')//(2)// 使用Vue提供的 customRef 定义响应式数据let initValue = '你好'// track跟踪  trigger触发let msg = customRef((track,trigger)=>{return {// msg被读取的时候调用getget(){track() //告诉vue数据msg很重要.你要对msg持续关注,一旦msg变化就去更新//getter要返回值return initValue},// msg被修改时调用setset(value){initValue = value  trigger() // 通知vue数据msg变化了}}})</script>

一般会把自定义ref(custonRef)封装到hooks中

实现防抖效果(useSumRef.ts):

import {customRef } from "vue";// 初始值 和 延迟时间 由外部定义
export default function(initValue:string,delay:number){let msg = customRef((track,trigger)=>{let timer:numberreturn {get(){track() // 告诉Vue数据msg很重要,要对msg持续关注,一旦变化就更新return initValue},set(value){clearTimeout(timer)timer = setTimeout(() => {initValue = valuetrigger() //通知Vue数据msg变化了}, delay);}}}) return {msg}
}

Vue3新组件

【Teleport】

  • 什么是Teleport?传送门的意思

    —— Teleport 是一种能够将我们的组件html结构移动到指定位置的技术。

引入:我们自定义了一个模态框组件,希望点击之后它弹出来。但是有时候因为父组件的一些CSS设置,position定位会不准。如果用 <teleport to='body' >就可以解决这个问题。

to后面可以直接写body,定位到HTML中的body,或者类选择器 ID选择器 to=“.demo” to=“#app”

<teleport to='body' ><div class="modal" v-show="isShow"><h2>我是一个弹窗</h2><p>我是弹窗中的一些内容</p><button @click="isShow = false">关闭弹窗</button></div>
</teleport>

【Suspense】

  • 等待异步组件时渲染一些额外内容,让应用有更好的用户体验
  • 使用步骤:
    • 异步引入组件
    • 使用Suspense包裹组件,并配置好defaultfallback
<script setup lang="ts" name="App">import {Suspense} from 'vue'import Child from './Child.vue'
</script><template><div class="app"><h3>我是App组件</h3><Suspense><template v-slot:default><Child/></template><template v-slot:fallback><h3>加载中.......</h3></template></Suspense></div>
</template>
  • 示例

    子组件有异步任务(以网络请求为例)

    直接得到 axios 的结果可以用 await,但是 外层函数本应该需要 async,如下文所示,没有外层函数。setup语法糖没法加上 async,此时顶级async就不用管了,还是会拿到结果的。

    但是问题出在页面上无法呈现子组件(收到了异步任务的影响)

    <template><div class="child"><h2>我是Child组件</h2><h3>当前求和为:{{ sum }}</h3></div>
    </template><script setup lang="ts">import {ref} from 'vue'import axios from 'axios'let sum = ref(0)let {data:{content}} = await axios.get('https://api.uomg.com/api/rand.qinghua?format=json')console.log(content)</script>
    

    父组件:

    default:异步任务成功时呈现。fallback:异步任务失败的时候呈现。

    <template><div class="app"><h2>我是App组件</h2><Suspense>                       <!--suspense包裹--><template v-slot:default>      <!--插槽实现--><Child/></template><template v-slot:fallback>      <!--插槽实现--><h2>加载中......</h2></template></Suspense></div>
    </template><script setup lang="ts" name="App">import {Suspense} from 'vue'import Child from './Child.vue'
    </script>
    

【全局API转移到应用对象】

  • app.component :vue3注册全局组件

    在vue2中 Vue.component注册全局组件

    在vue3中 注册全局组件 app.component(main.ts)

  • app.config 配置对象

    app.config.globalProperties.x = 9 全局属性

  • app.directive 注册全局指令

在这里插入图片描述

<h4 v-beauty>好开心</h4>

  • app.mount

  • app.unmount 卸载

  • app.use 安装插件

    pinia vue-router

【其他】

看官网中的非兼容性区别

https://v3-migration.vuejs.org/zh/breaking-changes/

  • 过渡类名 v-enter 修改为 v-enter-from、过渡类名 v-leave 修改为 v-leave-from

  • keyCode 作为 v-on 修饰符的支持。

  • v-model 指令在组件上的使用已经被重新设计,替换掉了 v-bind.sync。

  • v-ifv-for 在同一个元素身上使用时的优先级发生了变化。

  • 移除了$on$off$once 实例方法。

  • 移除了过滤器 filter

  • 移除了$children 实例 propert

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

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

相关文章

BackTrader 中文文档(一)

原文&#xff1a;www.backtrader.com/ 主页 欢迎来到 backtrader&#xff01; 原文&#xff1a;www.backtrader.com/ 一个功能丰富的 Python 框架&#xff0c;用于回测和交易 backtrader允许您专注于编写可重复使用的交易策略、指标和分析器&#xff0c;而不必花时间构建基础…

Android T多屏多显——应用双屏间拖拽移动功能(更新中)

功能以及显示效果简介 需求&#xff1a;在双屏显示中&#xff0c;把启动的应用从其中一个屏幕中移动到另一个屏幕中。 操作&#xff1a;通过双指按压应用使其移动&#xff0c;如果移动的距离过小&#xff0c;我们就不移动到另一屏幕&#xff0c;否则移动到另一屏。 功能分析…

振弦式渗压计的安装与防护:在水工建筑物中的关键应用

振弦式渗压计&#xff0c;作为一种高效的孔隙水压力或液体液位测量工具&#xff0c;广泛应用于水工建筑物、基岩内、测压管、钻孔、堤坝、管道和压力容器内。其安装和防护工作至关重要&#xff0c;直接关系到测量数据的准确性和仪器的使用寿命。本文将重点探讨振弦式渗压计在填…

RabbitMQ实战教程(1)

RabbitMQ 一、RabbitMQ介绍 1.1 现存问题 服务调用&#xff1a;两个服务调用时&#xff0c;我们可以通过传统的HTTP方式&#xff0c;让服务A直接去调用服务B的接口&#xff0c;但是这种方式是同步的方式&#xff0c;虽然可以采用SpringBoot提供的Async注解实现异步调用&…

Ue不消耗輸入

1、介紹 我們都知道ue裏面使用輸入時&#xff0c;都是在PlayerController裏面進行獲取&#xff0c; 使用官方的操作映射&#xff0c;軸映射&#xff0c;以及目前最新的增强型輸入 但是我們發現了一個問題 那就是輸入會被消耗 就是儅我鼠標按在一個按鈕上時 你另一個地方接受…

Elastic安装后 postman对elasticsearch进行测试

一、创建索引和mapping //id 字段自增id //good_sn 商品SKU //good_name 商品名称 //good_introduction 商品简介 //good_descript 商品详情 PUT http://IP:9200/shop { "mappings":{ "good":{ "properties":{ …

LabVIEW光学探测器板级检测系统

LabVIEW光学探测器板级检测系统 特种车辆乘员舱的灭火抑爆系统广泛采用光学探测技术来探测火情。光学探测器作为系统的关键部件&#xff0c;其探测灵敏度、响应速度和准确性直接关系到整个系统的运行效率和安全性。然而&#xff0c;光学探测器在长期使用过程中可能会因为灰尘污…

牛客Linux高并发服务器开发学习第一天

Linux开发环境搭建 安装Xshell 7远程连接虚拟机的Ubuntu 安装Xftp 7可以传输文件(暂时还没使用) 安装VMware Tools可以直接从Windows系统向虚拟机Linux系统拖拽文件实现文件交互。 安装CScode可以远程连接Linux系统进行代码的编写。&#xff08;Windows系统与Linxu系统公钥…

ActiveMQ 任意文件上传漏洞复现

一、使用弱口令登陆 ​ 访问 http://ip:8161/admin/ 进入admin登陆页面&#xff0c;使用弱口令登陆&#xff0c;账号密码皆为 admin&#xff0c;登陆成功后&#xff0c;headers中会出现验证信息 ​ 如&#xff1a; Authorization: Basic YWRtaW46YWRtaW4 # 二、利用PUT协议上…

STL体系结构与各容器基本介绍

STL体系结构与各容器基本介绍 STL体系结构基本容器序列式关联式&#xff08;查找更快&#xff09;其他&#xff08;不常用&#xff09;使用分配器 STL体系结构 六大模块 容器算法迭代器适配器仿函数分配器 基本容器 序列式 array c11新标准array<类型&#xff0c;大小&…

Linux-管道

目录 无名管道关闭未使用的管道文件描述符 管道对应的内存大小与shell命令进行通信&#xff08;popen&#xff09;命名管道FIFO创建FIFO文件打开FIFO文件 无名管道 管道是最早出现的进程间通信的手段。 管道的作用是在有亲缘关系的进程之间传递消息。所谓有亲缘关系&#xff…

MySQL中的SQL高级语句[二]

使用语言 MySQL 使用工具 Navicat Premium 16 代码能力快速提升小方法&#xff0c;看完代码自己敲一遍&#xff0c;十分有用 拖动表名到查询文件中就可以直接把名字拉进来以下是使用脚本方法&#xff0c;也可以直接进行修改中括号&#xff0c;就代表可写可不写 有些地方的代…

IO——标准IO

1.1概念 标准IO&#xff1a;是在C库中定义的一组专门用于输入输出的函数。 1.2特点 &#xff08;1&#xff09;通过缓冲机制减少系统调用&#xff0c;提高效率 &#xff08;2&#xff09;围绕流操作&#xff0c;用FILE*描述 &#xff08;3&#xff09;标准IO默认打开三个流&a…

PCIe错误定义与分类

前言&#xff1a; PCI总线中定义两个边带信号&#xff08;PERR#和SERR#&#xff09;来处理总线错误。其中PERR#主要对应的是普通数据奇偶校检错误&#xff08;Parity Error&#xff09;&#xff0c;而SERR#主要对应的是系统错误&#xff08;System Error&#xff09;。具体如下…

数据结构复习指导之绪论(算法的概念以及效率的度量)

文章目录 绪论&#xff1a; 2.算法和算法评价 知识总览 2.1算法的基本概念 知识点回顾与重要考点 2.2算法效率的度量 知识总览 1.时间复杂度 2.空间复杂度 知识点回顾与重要考点 归纳总结 绪论&#xff1a; 2.算法和算法评价 知识总览 2.1算法的基本概念 算法( Al…

【现代C++】模块的使用

C20引入了模块的概念&#xff0c;这是一个重要的新特性&#xff0c;旨在替代传统的预处理器和头文件机制。模块旨在提高编译速度、改善代码封装性、减少名称污染&#xff0c;并提供更好的工具支持。下面详细介绍模块的关键概念和使用方法&#xff1a; 1. 模块的基本概念 模块…

openGauss学习笔记-263 openGauss性能调优-TPCC性能调优测试指导-前置软件安装

文章目录 openGauss学习笔记-263 openGauss性能调优-TPCC性能调优测试指导-前置软件安装263.1 安装jdk263.2 安装numactl263.3 安装ant263.4 安装htop工具 openGauss学习笔记-263 openGauss性能调优-TPCC性能调优测试指导-前置软件安装 本章节主要介绍openGauss数据库内核基于…

谷歌浏览器的开发者插件vue-devtools

在这里我留下一个git地址用来下载插件包&#xff0c;首先在自己喜欢的位置创建一个新的文件夹&#xff0c;起一个自己喜欢的文件夹名字&#xff0c;下载到包后&#xff0c;然后点进文件夹里下载依赖&#xff0c;npm install,下载后如下面这个样子 git clone https://gitee.com…

【投稿优惠-EI稳定检索】2024年人工智能、自然语言处理与机器学习国际会议(ICAINLPML 2024)

2024 International Conference on Artificial Intelligence, Natural Language Processing and Machine Learning (ICAINLPML 2024) 网址&#xff1a;www.icainlpml.com 邮箱: ainlpmlsub-conf.com ●会议简介 2024年人工智能、自然语言处理与机器学习国际会议将邀请全球人…

Jackson 2.x 系列【24】Spring Web 集成

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 前言2. Spring Web3. Jackson2ObjectMapperBuilder4. Jackson2ObjectMapperFa…