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

Vue3 第四节 自定义hook函数以及组合式API

1.自定义hook函数

2.toRef和toRefs

3.shallowRef和shallowReactive

4.readonly和shallowReadonly

5.toRaw和markRaw

6.customref

一.自定义hook函数

① 本质是一个函数,把setup函数中使用的Composition API 进行了封装,类似于vue2.x中的mixin

    自定义hook函数可以进行代码复用,让setup中的逻辑更清晰

② 代码实现

(1)新建hooks

(2) 将相关功能和接口写入

usePoint.js

import { reactive, onMounted, onBeforeUnmount } from "vue"
export default function () {let point = reactive({x: 0,y: 0})function savePoint (event) {console.log(event.pageX, event.pageY)point.x = event.pageXpoint.y = event.pageY}onMounted(() => {window.addEventListener('click', savePoint)})onBeforeUnmount(() => {window.removeEventListener('click', savePoint)})return point
}

 (3)引入和使用

(4)代码汇总

Demo.vue

<template><h2>当前求和为:{{ sum }}</h2><button @click="sum++">点我+1</button><hr /><h2>当前点击时鼠标的坐标为:x : {{ point.x }} y:{{ point.y }}</h2>
</template>
<script>
import usePoint from '../hooks/usePoint'
import { reactive, ref, onMounted, onBeforeUnmount } from 'vue'
export default {name: 'Demo',// 数据setup () {let sum = ref(0)let point = usePoint()return {sum,point}},
}
</script><style>
</style>

Test.vue

<template><h2>我是Test组件</h2><h2>当前点击时鼠标的坐标为:x : {{ point.x }} y:{{ point.y }}</h2>
</template><script>
import usePoint from '../hooks/usePoint'
export default {name: 'Test',setup () {const point = usePoint()return { point }}}
</script>

二. toRef和toRefs

① 作用:创建一个ref对象,其value值指向另一个对象中的某个属性

② 应用: 要将响应式对象中的某个属性单独提供给外部使用,不想丢失响应式

toRef与toRefs功能一致,toRefs可以批量创建多个ref对象,处理这个对象中的所有属性

 ③ 代码

<template><h4>{{ person }}</h4><h2>姓名:{{ name }}</h2><h2>年龄:{{ age }}</h2><h2>薪资:{{ job.j1.salary }}</h2><button @click="name += '~'">修改姓名</button><button @click="age++">增长年龄</button><button @click="job.j1.salary++">涨薪</button>
</template>
<script>
import { reactive, ref, toRef, toRefs } from 'vue'
export default {name: 'Demo',// 数据setup () {let person = reactive({name: '张三',age: 18,job: {j1: {salary: 20}}})return {person,// name: toRef(person, 'name'),// age: toRef(person, 'age'),// salary: toRef(person.job.j1, 'salary')...toRefs(person)}}
}
</script><style>
</style>

三.shallowRef和shallowReactive

引入:import { shallowReactive, shallowRef } from 'vue'

① shallowReactive:只处理对象最外层属性的响应式(浅响应式)

 ② shallowRef: 只处理基本数据类型的响应式,不进行对象的响应式处理

 ③ 使用场景:

  • 如果有一个对象数据,结构比较深,但变化只是外层属性变化的时候使用shallowReactive
  • 如果有一个对象数据,后续功能不会修改对象中的属性,而是生成新的对象替换 =>  shallowRef

 四.readonly和shallowReadonly

应用场景:不希望数据被修改

① readonly: 让一个响应式数据变成只读的(深只读)

 ② shallowReadonly:只限制对象中的第一层数据

对ref的对象同样有用

 五.toRaw和markRaw

 ① toRaw

  • 作用:将一个由reactive生成的响应式对象转为普通对象
  • 使用场景:用于读取响应式对象对应的普通对象,对这个普通对象的所有操作,不会引起页面更新

 ② markRaw

  • 作用:标记一个对象,使其永远不会再成为响应式对象
  • 应用场景

     1.有些值不应该被设置为响应式的,例如复杂的第三方类库等

     2.当渲染具有不可变数据源的大列表时,跳过响应式转换可以提高性能

 操作数据,数据确实发生变化了,但是界面不会发生变化,没有响应式

六.customref

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

实现防抖效果代码实现:

<template><input type="text" v-model="keyWord" /><h3>{{ keyWord }}</h3>
</template><script>
import { ref, customRef } from 'vue'
import Demo from './components/Demo.vue'
export default {name: 'App',setup () {// 自定义reffunction myRef (value, delay) {let timerreturn customRef((track, trigger) => {return {get () {track() // 通知Vue追踪value的变化console.log('有人从myRef中读取数据了')return value},set (newValue) {console.log('有人把myRef中的数据改了')clearTimeout(timer)timer = setTimeout(() => {value = newValuetrigger() // 通知vue去重新解析模板}, delay)}}})}let keyWord = myRef('hello', 500)return { keyWord }}
}
</script>

相关文章:

Vue3 第四节 自定义hook函数以及组合式API

1.自定义hook函数 2.toRef和toRefs 3.shallowRef和shallowReactive 4.readonly和shallowReadonly 5.toRaw和markRaw 6.customref 一.自定义hook函数 ① 本质是一个函数&#xff0c;把setup函数中使用的Composition API 进行了封装,类似于vue2.x中的mixin 自定义hook函数…...

门面模式(C++)

定义 为子系统中的一组接口提供一个一致(稳定) 的界面&#xff0c;Facade模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用(复用)。 应用场景 上述A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合&#xff0c;随着外部客户程序和各子…...

ASP.NET Core SignalR

ASP.NET Core SignalR是一个开发实时网络应用程序的框架&#xff0c;它使用WebSocket作为传输协议&#xff0c;并提供了一种简单和高效的方式来实现实时双向通信。 SignalR使用了一种称为"Hub"的概念来管理连接和消息的传递。开发者可以编写自己的Hub类&#xff0c;…...

auto-changelog的简单使用

auto-changelog的简单使用 自动化生成Git提交记录&#xff0c;CHANGELOG.md文件 github&#xff1a;https://github.com/cookpete/auto-changelog 安装 npm install -g auto-changelog配置脚本 package.json文件下 "scripts": {"changelog": "aut…...

map 比较(两个map的key,value 是否一样)

1. 用equals 比较 public static void main(String[] args) {List<Map<String,Object>> list new ArrayList<>();Map<String,Object> map1 new HashMap<>();map1.put("name","郭");map1.put("objId","1&quo…...

LayUI之入门

目录 1.什么是layui 2.layui、easyui与bootstrap的对比 有趣的对比方式&#xff0c;嘿嘿嘿.... easyuijqueryhtml4&#xff08;用来做后台的管理界面&#xff09; 半老徐娘 bootstrapjqueryhtml5 美女 拜金 layui 清纯少女 2.1 layui和bootstrap对比&#xff08;这两个都属…...

【Linux】Linux下git的使用

文章目录 一、什么是git二、git发展史三、Gitee仓库的创建1.新建仓库2.复制仓库链接3.在命令行克隆仓库3.1仓库里的.gitignore是什么3.2仓库里的git是什么 三、git的基本使用1.将克隆仓库的新增文件添加到暂存区(本地仓库)2.将暂存区的文件添加到.git仓库中3.将.git仓库中的变化…...

QT读写配置文件

文章目录 一、概述二、使用步骤1.引入头文件2.头文件的public中定义配置文件对象3.初始化 一、概述 Qt中常见的配置文件为&#xff08;.ini&#xff09;文件&#xff0c;其中ini是Initialization File的缩写&#xff0c;即初始化文件。 配置文件的格式如下所示&#xff1a; 模…...

【计算机网络】12、frp 内网穿透

文章目录 一、服务端设置二、客户端设置 frp &#xff1a;A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet。是一个专注于内网穿透的高性能的反向代理应用&#xff0c;支持 TCP、UDP、HTTP、HTTPS 等多种协议&#xff0c;且…...

Pytest 重复执行用例插件----pytest-repeat

前言 在自动化过程中&#xff0c;想要重复执行一条脚本&#xff0c;查看他的稳定性&#xff0c;如果是在unittest框架中&#xff0c;可能会使用for一直循环这条用例&#xff0c;但是当我们使用pytest框架后&#xff0c;我们就可以通过某些插件来实现这个功能了。今天介绍的这个…...

【软件工程】5 ATM系统测试

目录 5 ATM系统测试 5.1 单元测试 5.1.1 制定单元测试计划 5.1.2 设计单元测试用例 ​编辑 5.1.3 执行单元测试 5.1.4 单元测试报告 5.2 集成测试 5.2.1 制定集成测试计划 5.2.2 设计集成测试用例 5.2.3 执行集成测试 5.2.4 集成测试总结 5.3 系统测试 5.3.1 制定…...

opencv读取MP4文件和摄像头数据

文章目录 前言一、waitKey函数二、VideoCapture类总结前言 本篇文章来讲解opencv读取MP4文件和摄像头数据,opencv主要用于处理图像数据那么本篇文章就来讲解opencv读取MP4文件和摄像头数据。 一、waitKey函数 waitKey()函数是OpenCV中常用的一个函数,它用于等待用户按键输…...

Qt实现自定义QDoubleSpinBox软键盘

在Qt应用程序开发中&#xff0c;经常会遇到需要自定义输入控件的需求。其中&#xff0c;对于QDoubleSpinBox控件&#xff0c;如果希望在点击时弹出一个自定义的软键盘&#xff0c;以便用户输入数值&#xff0c;并将输入的值设置给QDoubleSpinBox&#xff0c;该如何实现呢&#…...

小研究 - 微服务系统服务依赖发现技术综述(一)

微服务架构得到了广泛的部署与应用, 提升了软件系统开发的效率, 降低了系统更新与维护的成本, 提高了系统的可扩展性. 但微服务变更频繁、异构融合等特点使得微服务故障频发、其故障传播快且影响大, 同时微服务间复杂的调用依赖关系或逻辑依赖关系又使得其故障难以被及时、准确…...

2023-08-07力扣今日八题

链接&#xff1a; 剑指 Offer 50. 第一个只出现一次的字符 题意&#xff1a; 如题 解&#xff1a; map存下标&#xff0c;由于存在下标0&#xff0c;所以用find&#xff0c;或者记录下标1也可以 实际代码&#xff1a; #include<bits/stdc.h> using namespace std;…...

Segment Anything【论文翻译】

文章目录 论文基础信息如下Abstract1. Introduction2. Segment Anything Task3. Segment Anything Model4. Segment Anything Data Engine5. Segment Anything Dataset6. Segment Anything RAI Analysis7. Zero-Shot Transfer Experiments7.1. Zero-Shot Single Point Valid Ma…...

银河麒麟QT连接DM8数据库

1. 安装达梦8 官网下载, 按照官方文档进行安装即可. 2. 安装unixodbc 1> 下载odbc安装包 unixODBC-2.3.7pre.tar.gz 2> 解压 tar -xvf unixODBC-2.3.7pre.tar.gz3> 编译 ./configure -prefix /usr/local make && make install4> 查找配置 odbcinst -j5…...

并发编程1:线程安全性概述

目录 1、什么是线程安全性&#xff1f; 2、操作的原子性&#xff1a;避免竞态条件 3、锁机制&#xff1a;内置锁和可重入 4、如何用锁来保护状态&#xff1f; 5、同步机制中的活跃性与性能问题 编写线程安全的代码&#xff0c;其核心在于对状态访问操作进行管理&#xff0…...

(论文复现)DeepAnt模型复现及应用

DeepAnt论文如下&#xff0c;其主要是用于时间序列的无监督粗差探测。 其提出的模型架构如下&#xff1a; 该文提出了一个无监督的时间序列粗差探测模型&#xff0c;其主要有预测模块和探测模块组成&#xff0c;其中预测模块的网络结构如下。 预测结构是将时间序列数据组…...

【机器学习】在 MLOps构建项目 ( MLOps2)

My MLOps tutorials: Tutorial 1: A Beginner-Friendly Introduction to MLOps教程 2&#xff1a;使用 MLOps 构建机器学习项目 一、说明 如果你希望将机器学习项目提升到一个新的水平&#xff0c;MLOps 是该过程的重要组成部分。在本文中&#xff0c;我们将以经典手写数字分类…...

FLUX.1-dev像素模型部署教程:Docker Compose编排前端+后端+模型服务

FLUX.1-dev像素模型部署教程&#xff1a;Docker Compose编排前端后端模型服务 1. 项目概述 像素幻梦(Pixel Dream Workshop)是基于FLUX.1-dev扩散模型构建的像素艺术生成平台&#xff0c;采用16-bit像素风格设计&#xff0c;为创作者提供沉浸式的AI绘图体验。本教程将指导您使…...

【数据结构与算法】二叉树从建立开始

为什么你学了二叉树却还是不会做题&#xff1f;从“建树”到“解题”的完整思维体系在学习数据结构的过程中&#xff0c;二叉树几乎是每个人都会接触的内容。但一个很现实的问题是&#xff1a;很多人会写遍历&#xff0c;却不会做题。表面上看是代码能力的问题&#xff0c;实际…...

Figma Make 提示词工程化:构建从布局、组件、交互到风格的稳定设计系统

1. 从零散到系统&#xff1a;为什么需要工程化提示词 刚开始用Figma Make做设计时&#xff0c;我和大多数人一样&#xff0c;每次生成页面都要重新写一遍提示词。最头疼的是明明想要类似的风格&#xff0c;结果生成的页面总是"飘忽不定"——今天按钮圆角是8px&#x…...

零基础封神!10行代码写渗透专用爬虫,一键扫遍靶场敏感资产

零基础封神&#xff01;10行代码写渗透专用爬虫&#xff0c;一键扫遍靶场敏感资产 上一篇我们一起打破了认知壁垒&#xff0c;焊死了合规红线&#xff0c;用3行代码跑通了第一个渗透型爬虫。 很多粉丝后台私信我说&#xff0c;第一次跑通代码&#xff0c;看到命令行里打印出靶场…...

Python无锁并发避坑手册(20年C Python核心贡献者亲授:从字节码级锁定到原子内存序的17个致命盲区)

第一章&#xff1a;Python无锁并发的本质与GIL真相Python常被误认为“天生支持多线程并发”&#xff0c;但其核心限制源于全局解释器锁&#xff08;Global Interpreter Lock, GIL&#xff09;。GIL并非语言规范&#xff0c;而是CPython解释器为内存管理安全而引入的互斥机制——…...

探索PLECS仿真下DAB变换器峰值电流前馈控制策略——IEEE顶刊复现之旅

PLECS仿真&#xff0c;IEEE顶刊复现&#xff0c;DAB变换器峰值电流前馈控制策略。最近在电力电子领域的研究中&#xff0c;我深入钻研了DAB&#xff08;Dual - Active - Bridge&#xff09;变换器的相关控制策略&#xff0c;并通过PLECS仿真实现了IEEE顶刊论文里一种峰值电流前…...

告别Qt中文乱码和C2001:一份完整的源码文件编码管理指南(从创建到编译)

Qt全流程编码管理实战&#xff1a;从源码创建到编译运行的终极解决方案 当你在Qt项目中第一次看到"C2001: 常量中有换行符"这个错误提示时&#xff0c;可能会感到困惑——明明代码看起来完全正常&#xff0c;为什么编译器就是不认账&#xff1f;更令人抓狂的是&#…...

红蓝对抗深度解析:从技术体系到落地实践,企业安全真正的实战课

红蓝对抗深度解析&#xff1a;从技术体系到落地实践&#xff0c;企业安全真正的实战课 在数字化攻防进入 “实战对抗” 时代的今天&#xff0c;红蓝对抗已成为企业检验安全防御体系、提升应急响应能力的核心手段。不同于传统的漏洞扫描和合规检查&#xff0c;红蓝对抗以 “高仿…...

脑网络通信指标——扩散策略的流图指标

和平均首达时间一样,这个指标也是脑网络扩散通信方式的一个指标。这个指标的计算公式也是非常云里雾里,不找原文献推公式看不懂的。 首先给公式: 流图矩阵中的一条边:FG(t)ij = (e^(-tL))ijsj 其中sj = ∑jAij,Aij 就是两个节点之间的结构连接强度,sj就是j节点的强度;…...

Qwen3.5-9B教程:Gradio队列机制+并发请求限流配置方法

Qwen3.5-9B教程&#xff1a;Gradio队列机制并发请求限流配置方法 1. 模型概述与环境准备 Qwen3.5-9B是一款拥有90亿参数的开源大语言模型&#xff0c;具备强大的逻辑推理、代码生成和多轮对话能力。其多模态变体Qwen3.5-9B-VL支持图文输入&#xff0c;并能处理长达128K token…...