vue3 新特性详解(2)

news2024/11/18 9:39:51

文章目录

    • 自定义Hook函数
    • roRef
  • 其它 Composition API
      • shallowReactive 与 shallowRef
      • readonly 与 shallowReadonly
      • toRaw 与 markRaw
      • customRef
      • provide 与 inject
      • 响应式数据的判断
    • Composition Api 的优势。
  • 新的组件
      • .Fragment
      • Teleport
      • Suspense
      • vue3 一些api的转移


自定义Hook函数

什么是hook?
本质是一个函数,把setup函数中使用的Compostion Api 进行了封装,类似于vue2中的mixin.
自定义hook的优势是复用了代码,让setup中的逻辑更清楚易懂。

实例:在多个页面中获取鼠标点击的坐标。
hook/index.ts

import { reactive,onMounted,onBeforeUnmount } from 'vue';
export default function () {
	    let print = reactive({
			x:0,y:0
		})
		function savePrint(e){
			print.x = e.pageX
			print.y = e.pageY
			console.log(e.pageX,e.pageY)
		}
		onMounted (){
			window.addEventListener("click",savePrint)
        }
		onBeforeUnmount(){
			window.removeEventListener("click",savePrint)
		}
	 return print
}

vue组件中使用

import usePrint from 'hook/index.ts'
export default {
	setup(){
		let print = usePrint()
		console.log(print)
	}
}

roRef

  • 作用:创建一个ref对象,其value指向另一个对象中的某个属性
  • 语法:const name = toRef(person,“name”)
  • 应用:要将响应式对象中的某个属性单纯提供给外部使用。
  • 扩展:toRefs 与 toRef 功能一致,但可以批量创建多个ref对象,语法 toRefs(person)

例子,将对象中的仅仅两个属性返回在页面

import {reactive,toRef,toRefs} from 'vue'
export default {
	setup(){
		let per = reactive({
			name:"",
			age:12,
			job:{
				jianzhi:{
					gongzi:10
				}
			}
		})
		
		let name = per.name
		name = "李四";// 这样name脱离了响应式,页面不会更新。
		let name2 = toRef(per,'name');//name2 是响应式的
		let gongzi = toRef(per.job.jianzhi,"gongzi")
		//let per1 = toRefs(per);
		return {
			name2,
			gongzi
		}
}
}

其它 Composition API

shallowReactive 与 shallowRef

  • shallowReactive :只处理对象最外层属性的响应式(浅响应式)
  • shallowRef:只处理基本数据类型的响应式,不进行对象的响应式处理。
  • 使用场景:
  • 如果有一个对象数据,结构比较深,但变化时只是外层属性变化,就用shallowReactive
  • 如果有对象数据,后续功能不会修改对象中的属性,而是生成新的对象来替换,就用 shallowRef
import {reactive,shallowReactive,shallowRef} from 'vue'
export default {
	setup(){
	  // 只处理第一层响应式
		let obj = shallowReactive({
			a:"",
			b:{
				c:2, //  c 是改变了监听不到,因为不做响应式处理
			}
		})
		let aa = shallowRef({ b: 23}) // 没有处理成响应式,因为shallowRef只处理基本类型。
	}
}

readonly 与 shallowReadonly

readonly 让一个响应式数据变为只读的(深只读)
shallowReadonly 让一个响应式数据变为只读的(浅只读)
应用场景:不希望数据被修改时。

toRaw 与 markRaw

  • towRaw

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

    • 作用:标记一个对象,使其永远不会再成为响应式对象
    • 应用场景
    • 1.有些值不应被设置为响应式的,例如复杂的第三方类库等
    • 2.当渲染具有不可变数据源的大列表时,跳过响应式转换可以提高性能

customRef

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

实例:实现一个防抖的效果

<template>
  <input type="text" v-model="keyword"/>
  <h3> {{keyword}}</h3>
</template>
imput {customRef} from 'vue'
export default {
	setup(){
		// 自定义一个ref名为myRef
		function myRef(value){
	         let timer 
			const x = customRef((track,trigger)=>{  // 函数必须返回一个对象
				return {
					get(){
					    track(); // 通知vue追踪value的变化,(提前和get商量一下,让他认为这个value是有用的)
						return value
					},set(newValue){ 
					   clearTimeout()
					   timer = setTimeout(()=>{
						   value = newValue;
					 	   trigger()// 通知vue去重新解析模板
						},500)
					}
				}
			}) 
			return x;
		}
		let keyword = myRef("");
		return {keyword}
	}
}

provide 与 inject

作用:实现组件与后代组件间(跨级组件)通信,其实父子组件也可以,但是父子组件一般用简单的props就可以了

父组件有一个provide 选项来提供数据,子组件有一个inject 选项来开始使用这些数据
组件A

<template>
  <div> 组件A (祖)</div>
  <B />
</template>
<script>
import {reactive,toRefs,provide} from 'vue'
import B form 'B.vue'
export default {
   name:'A',
   setup(){
	let car = reactive({
		name:"奔驰", price:"40w"
	})
	provide("car",car)
	return {...toRefs(car) }
	}
   
}
</script>

组件B (子组件)

<template>
  <div> 组件B (子)</div>
  <C />
</template>
<script>
import C form 'C.vue'
export default {
   name:'b'
}
</script>

组件C (孙组件)

<template>
  <div> 组件C (孙)</div>
  <div> 获取到祖组件中数据 {{car.name}} -- {{car.price}} </div>
</template>
<script>
import {reactive,toRefs,inject} from 'vue'
export default {
   name:'C',
   setup(){
	let car = inject("car");
	console.log(car)
	return {car}
	}
}
</script>

响应式数据的判断

  • isRef:检查一个值是否为一个ref对象
  • isReactive:检查一个对象是否是由reactive 创建的响应式代理
  • isReadonly:检查一个对象是否是由readonly 创建的只读代理
  • isProxy:检查一个对象是否是由reactive 或者readonly 方法创建的代理
import {ref, reactive,toRefs,readonly,isRef,isReactive,isReadonly,isproxy ) from 'vue
export default (
	setup(){
		let car = reactive({name:'奔驰',price:'40w'})
		let sum = ref(0)
		let car2 = readonly(car)
		console.log(isRef(sum))  // true
		console.log(isReactive(car))  // true
		console.log(isReadonly(car2))  // true
		console.log(isProxy(car))  // true
		console.log(isProxy(sum ))  // false
		return {...toRefs(car)]
	}
}

Composition Api 的优势。

使用传统OptionsAPI中,新增或者修改一个需求,就需要分别在data,methods,computed里修改,
使用Composition Api 我们可以更加优雅的组织我们的代码,函数。让相关功能的代码更加有序的组织在一起。
![在这里插入图片描述](https://img-blog.csdnimg.cn/90b2a0473f144259bf6af975579c2a12.png

在这里插入图片描述

新的组件

.Fragment

。在Vue2中:组件必须有一个根标签
。在Vue3中: 组件可以没有根标签,内部会将多个标签包含在一个Fragment虚拟元素中
。好处: 减少标签层级,减小内存占用

Teleport

什么是Teleport?- Teleport 是一种能够将我们的组件html结构移动到指定位置的技术。类似于弹出对话框。

<teleport to="移动位置">
<div v-if="isShow"class="mask">
	<div class="dialog">
		<h3>我是一个弹窗</h3>
		<button @click="isShow = false">关闭弹窗</button>
		</div>
	</div>
</teleport>

Suspense

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

<template>
	<div class="app">
		<h3>我是App组件</h3>
		<Suspense>
			<template v-slot:default>
				<Child/>
			<template>
			<template v-slot:fallback>
				<h3>稍等,加载中...</h3>
			</template>
		</Suspense>
	</div>
</template>
<script>
// import Child from./components/Child'//前态引入
import (defineAsyncComponent} from ‘vue’
const Child = defineAsyncComponentexport default(()=>import('./components/Child')) //异步引入
export default {
  name : 'App'
  components:{Child},
}
</script>

如果是使用Suspense 进行异步引入子组件,那么子组件中setup 是可以返回 async函数或者promise函数。

<template>
	<div class="child">
		<h3>我是child组件</h3>
		({sum))
	</div>
</template>
<script>
import (ref} from 'vue‘
export default {
	name:'Child'
	async setup()[
		let sum = ref(0)
		let p = new Promise((resolve,reject)=>(
			setTimeout(()=>{
				resolve({sum))
			}, 3000)
		return await p 
</script>

vue3 一些api的转移

在这里插入图片描述

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

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

相关文章

Flink Hudi DataStream API代码示例

前言 总结Flink通过DataStream API读写Hudi Demo示例&#xff0c;主要是自己备忘用。 最开始学习Flink时都是使用Flink SQL,所以对于Flink SQL读写Hudi比较熟悉。但是对于写代码实现并不熟悉&#xff0c;而有些需求是基于Flink代码实现的&#xff0c;所以需要学习总结一下。仅…

ZYNQ无SD卡配置Linux系统到QSPI Flash和eMMC

硬件&#xff1a;黑金AX7450开发板、zynq7100、QSPI Flash、eMMC Flash 软件&#xff1a;Vivado 2017.4、Petalinux 我用了一台Windows主机&#xff0c;用于设计Vivado和烧写QSPI Flash&#xff0c;一台Ubuntu主机&#xff0c;用于运行Petalinux配置Linux系统。 硬件设计 新建…

10 工具Bootchart的使用(windows)

Bootchart的使用方法&#xff08;windows&#xff09; 下载bootchart.jar并拷贝到windows, 然后保证windows也安装了open jdk 1.8; 下载地址&#xff1a;https://download.csdn.net/download/Johnny2004/87807973 打开设备开机启动bootchart的开关: adb shell touch /data/boo…

生成VLC 及其模块的全面帮助

使用vlc.exe -H命令生成VLC帮助文件vlc-help.txt -h, --help, --no-help 打印 VLC 帮助 (可以和 --advanced 和 --help-verbose 一起使用) (默认禁用) -H, --full-help, --no-full-help VLC 及…

如何创造一个属于自己的springboot stater

如何创造一个属于自己的springboot stater 什么是staterstater是怎么实现注入进来的如何进行约定 基于上述理论的demo实现功能代码目录核心实现spring.factoriesSpringMessageSubscribe&#xff08;扫描所有Subscribe注解生成消息订阅&#xff09;基于Redis的消息订阅基于redis…

对封装好的Vue组件库进行打包,并发布到npm上

1. 新建vue 项目 并且在根目录创建两个文件夹 packages和examples。 packages&#xff1a;用于存放所有的组件 examples&#xff1a;用于进行测试组件&#xff0c;把src改为examples 2.配置vue.config.js 并设置入口文件 如果没有vue.config.js文件 就需要在项目根目录下创…

数说故事@FBIC丨首发食饮SMI社媒心智品牌榜,为品牌支招紧跟健康新风尚

第八届Foodaily创博会&#xff08;FBIC全球食品饮料创新大会&#xff09;于5月14-16日在上海跨国采购会展中心圆满落幕&#xff0c;呈现了一场食品饮料行业盛会。数说故事与众多食饮健康品牌一起&#xff0c;走过了一段大数据AI加持的创新之旅。 数说故事VP孙淑娟Jessie受邀分享…

Android APP 集成系统签名

由于android 系统权限限制&#xff0c;很多时候普通APP权限无法完成&#xff0c;需要系统APP才有足够的权限&#xff0c; 比如&#xff1a;安装、卸载应用&#xff0c;重启设备&#xff0c;恢复出厂设置&#xff0c;以及设置里面的一些功能&#xff0c;都是需要系统权限才能调…

【WLAN网络故障,带你搞定它!】

01 无线网卡搜索不到 AP的无线信号 01 问题现象 无线网卡搜索不到 AP 的无线信号 02 问题分析 无线网卡搜索不到 AP 的信号 ,原因可以从两方面着手&#xff1a; 1.无线网卡 AP本身 在遇到该问题的时候&#xff0c;我们可以从以上两个方面进行处理。 03 处理过程 1.无线…

Python GUI编程:使用wxPython处理长文本

这段代码的应用场景有&#xff1a; 在文本编辑器和IDE等应用程序中&#xff0c;可以使用这个示例代码来处理长文本&#xff0c;以便用户更好地查看和编辑文本。在数据分析和科学计算等领域中&#xff0c;可以使用这个示例代码来显示和处理大量的数据和结果。在日志分析和系统监…

解决方案 TestCenter自动测试软件平台

方案概述 TestCenter是一个专为加速您的测试系统软件开发而设计的自动测试系统软件平台&#xff0c;主要应用于测试程序的开发、运行和管理。TestCenter实现了对测试资源管理、测试程序开发与调试、测试数据管理以及测试程序发布等功能的无缝集成和统一部署&#xff0c;这将帮…

Google I/O 2023 推出Flutter 3.10 快来看看都有哪些变化

本文首发自[慕课网] &#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"及“慕课网公众号”&#xff01; 作者&#xff1a; CrazyCodeBoy |慕课网名师 今年的Google I/O满满的 AI与狠活&#xff0c;而且还推出 Flutter 3…

Flutter一天一控件之ListTile(列表的实现)

ListTile简介 Flutter中的ListTile控件是一种常用的列表项控件&#xff0c;它可以用于显示列表中的每一个项&#xff0c;通常包含标题、副标题、图标等内容。ListTile控件的外观和行为类似于Android中的ListView中的列表项。 一个简单的ListTile示例&#xff1a; ListTile(l…

大流量卡介绍:网上的大流量卡都是怎么来的?

大流量卡介绍&#xff0c;你知道网上的大流量卡都是怎么来的&#xff1f; 其实&#xff0c;网上29元155G、39元180G的优惠套餐&#xff0c;本身都是我们常见的流量卡如电信星卡、联通王卡、移动花卡等等&#xff0c;之所以这么便宜&#xff0c;只不过运营商在这些套餐上面增加…

【新星计划】数据库 排名函数 初识

数据库 排名函数 初识 查询排序初识排名函数row_number()rank()dense_rank()ntile()percent_rank() 开窗函数为聚合函数使用开窗函数 小结 查询排序 在日常工作中&#xff0c;我们对所有需要的数据都会进行一个排序操作&#xff0c;以获得我们最需要的数据。 排序指令 order …

Unreal Niagara粒子入门1

记录下学习Niagara粒子的过程&#xff0c;这次调的是比较简单的一个效果&#xff1a; 使用了随粒子生命的缩放、打开速率解算、基本的发射器和Niagara容器。 1.创建Niagara Niagara中&#xff0c;发射器和NiagaraSystem文件是可以分开创建的&#xff1a; 通常直接点Niagara…

GPT-2(Transformer Decoder)的TensorFlow实现(附源码)

文章目录 一、GPT2实现步骤二、源码 一、GPT2实现步骤 机器学习模型的开发实现步骤一般都包含以下几个部分&#xff1a;   1. 遵照模型的网络架构&#xff0c;实现每一层&#xff08;Layer/Block&#xff09;的函数&#xff1b;   2. 将第1步中的函数组合在一起&#xff0c…

微信小程序nodejs+vue校园快递代拿系统uniapp校园互助系统

语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;VScode 平台旨在解决目前大学生找人帮忙&#xff0c;难&#xff0c;慢&#xff0c;不可靠以及想兼职同学找不到好的平台的问题。对于招人帮忙的…

应急演练脚本编写的几个步骤

应急演练是一项非常重要的活动&#xff0c;对于保障企业的安全和稳定运行至关重要。而一个完整的应急演练需要编写一个详细的脚本来指导演练过程。以下是应急演练脚本编写的几个步骤。 定义演练场景 首先&#xff0c;需要定义演练场景&#xff0c;这将决定演练的目标和方向。在…

美国原装二手 SR560 低噪声电压前置放大器

Stanford Research SR560低噪声电压前置放大器 ​Stanford Research SR560 是一款高性能、低噪声前置放大器&#xff0c;适用于各种应用&#xff0c;包括低温测量、光学检测和音频工程。 SR560 具有一个具有 4 nV/√Hz 输入噪声和 100 MΩ 输入阻抗的差分前端。完整的噪声系数…