2409vue,vue3.5更新

devtools/2024/11/13 5:32:09/

原文

今天,很高兴地发布Vue3.5!

次要版本不包含破坏更改,只包括内部改进和有用的新函数.这里包含一些亮点.

反应式系统优化

3.5中,Vue响应式系统经历了另一次重大重构,实现了更好性能显著提高(-56%)内存使用率而行为不变.

重构还解决了在SSR时,因挂起计算而导致的过时计算值和内存问题.

此外,3.5还优化了大型深度响应式数组响应性跟踪,有时会使此类操作速度提高10倍.

ReactiveProps析构

3.5版本中稳定了响应时属性析构.现在默认启用该功能后,从<script setup>中的defineProps调用析构的变量,现在是响应式的.

注意,此特征通过利用js本地默认值语法,大大简化了用默认值声明属性的过程:

//以前
const props = withDefaults(defineProps<{count?: numbermsg?: string}>(),{count: 0,msg: 'hello'}
)

现在:

const { count = 0, msg = 'hello' } = defineProps<{count?: numbermessage?: string
}>()

通过编译器会自动把访问析构变量(如计数)编译到props.count中,因此在访问时会跟踪它们.
类似props.count,监视析构的属性变量或给它传递到可组合项中并同时保留响应性,需要在取器中包装它:

watch(count /*...*/)
//^导致编译时错误
watch(() => count /*...*/)
//在取器中工作,
//组合应用`toValue()`来归一化输入
useDynamicCount(() => count)

对那些希望更好区分析构属性普通变量的人,@vue/languagetools2.1提供了一个选入设置来为它们启用内联提示.

SSR改进

3.5为服务渲染(SSR)带来了一些期待已久的改进.

懒冻结

通过defineAsyncComponent()API冻结选项指定策略,异步组件现在可控制何时应该冻结它们.如,要仅在组件可见时冻结组件:

import { defineAsyncComponent, hydrateOnVisible } from 'vue'
const AsyncComp = defineAsyncComponent({loader: () => import('./Comp.vue'),hydrate: hydrateOnVisible()
})

核心API有意降级,Nuxt团队已在此函数上面构建了更高级的语法糖.这里

useId()

useId()是一个可生成每个应用,保证在服务器和客户渲染保持稳定的唯一的IDAPI.
它们可用来生成表单元素助手函数属性ID,且可在SSR应用中使用,而不会导致冻结不匹配:

<script setup>
import { useId } from 'vue'
const id = useId()
</script>
<template><form><label :for="id">Name:</label><input :id="id" type="text" /></form>
</template>

允许不匹配数据(data-allow-mismatch)

如果客户值不可避免地与其服务器对应值(如日期)不同,现在可用属性抑制生成的冻结不匹配警告:

<span dataallowmismatch>{{ data.toLocaleString() }}</span>

还可为属性提供值限制允许的不匹配类型,其中可能的值为text,children,class,styleattribute.

自定义元素改进

3.5修复了许多与defineCustomElement()API相关的长期问题,并添加了许多使用Vue编写自定义元素新能力:

1,configureApp选项支持自定义元素的应用配置.
2,新增useHost(),useShadowRoot()this.$host接口,来访问自定义元素主机元素阴影根.

3,支持传递shadowRoot:false来挂载没有ShadowDOM自定义元素.

4,支持通过自定义元素附加<style>标签上来提供nonce选项.
5,可通过第二个参数把这些新的仅限自定义元素的选项传递给defineCustomElement:
JS

import MyElement from './MyElement.ce.vue'
defineCustomElements(MyElement, {shadowRoot: false,nonce: 'xxx',configureApp(app) {app.config.errorHandler = ...}
})

其他显著功能

useTemplateRef()

3.5引入了一个通过useTemplateRef()API模板引用新方法:

<script setup>
import { useTemplateRef } from 'vue'
const inputRef = useTemplateRef('input')
</script>
<template><input ref="input">
</template>

3.5前,建议使用变量名静引用属性匹配的普通引用.旧方法要求引用属性可由编译器解析,因此仅限于静态引用属性.
相比之下,useTemplateRef()通过运行时串ID匹配引用,因此支持动态引用绑定到不断变化ID.

@vue/languagetools2.1还特殊支持新语法,因此在使用useTemplateRef()时,会根据模板中是否有引用属性收到自动补全和警告:

懒传递

内置<Teleport>组件的一个已知约束是,在挂载Teleport组件时,必须要有目标元素.这阻止了用户在传递传递内容Vue渲染的其他元素.

3.5中,为<Teleport>引入了一个延迟属性,它会在当前渲染周期挂载它,所以如下现在可以工作了:

<Teleport defer target="#container">...</Teleport>
<div id="container"></div>

因为默认要后向兼容,此行为需要延迟属性.

onWatcherCleanup()

3.5引入了一个全局导入API,onWatcherCleanup(),来在监视器注册清理回调:

import { watch, onWatcherCleanup } from 'vue'
watch(id, (newId) => {const controller = new AbortController()fetch(`/api/${newId}`, { signal: controller.signal }).then(() => {//回调逻辑})onWatcherCleanup(() => {//(中止过时请求)controller.abort()})
})

http://www.ppmy.cn/devtools/108544.html

相关文章

C++ day6

作业&#xff1a;1、手动实现stack部分功能 2、手动实现queue部分功能 1、 头文件 #ifndef HEAD_H #define HEAD_H #include <iostream> #include<cstring> #define MAX 10 using namespace std; class Stack { private:int* data; //存储栈的容器&#xff…

RPC框架-protobuf-rpc-pro

protobuf-rpc-pro 是一个基于 Protocol Buffers 的 RPC 框架&#xff0c;旨在通过使用 Google 的 Protocol Buffers&#xff08;Protobuf&#xff09;序列化格式实现高效、轻量的远程过程调用&#xff08;RPC&#xff09;。它主要用于 Java 生态系统&#xff0c;提供了简洁的 A…

linux小程序-进度条

文章目录 pro.hpro.cmain.cmakefile测试 pro.h #pragma once#include <stdio.h>typedef void(*callback_t)(double, double);void probar(double total, double current);pro.c #include "pro.h" #include <string.h> #include <unistd.h> #defi…

【区块链 + 物联网】智慧路灯计费和融资区块链解决方案 | FISCO BCOS应用案例

在传统的城市建设和管理模式下&#xff0c;照明的路灯杆、交通的红绿灯杆、安防的监控杆、街道指示牌杆、广告宣传杆 等分开建设&#xff0c;不仅杆体功能单一&#xff0c;还存在资源浪费、管理分散、影响市容等问题。区块链的技术特性与智慧路灯 投资运营模式有天然的结合点&a…

Redis的incr命令引发的反序列化异常和ERR value is not an integer or out of range异常

在Java中使用inc命令的时候发现redis中的值被反序列化后居然不是数字,检查后发现可能是序列化器没对,在redis配置的地方将序列化器设置为 Jackson2JsonRedisSerializer后使用整成,贴上代码 Bean(name "RedisTemplate")SuppressWarnings("all")public Red…

无人机陀螺仪原理以及作用!

一、陀螺仪的基本原理 陀螺仪基于旋转惯性力的陀螺效应&#xff0c;利用旋转物体具有惯性力矩的物理现象。当外部力矩作用时&#xff0c;陀螺在垂直于力矩方向上产生章动&#xff08;进动&#xff09;运动&#xff0c;通过测量这种章动运动来获取角速度信息。此外&#xff0c;…

传统CV算法——基于Opencv的多目标追踪算法

基于 OpenCV 的跟踪算法有多种&#xff0c;每种算法都有其特定的应用场景和优缺点。以下是一些常见的基于 OpenCV 的目标跟踪算法&#xff1a; 1. BOOSTING 跟踪器 描述&#xff1a;基于 AdaBoost 算法的跟踪器。它是一种早期的跟踪算法&#xff0c;使用的是基于弱分类器的强…

【SpringBoot】使用Nacos服务注册发现与配置管理

前提&#xff1a;需要提前部署好nacos服务&#xff0c;这里可以参考我的文章&#xff1a;Windows下Nacos安装与配置 0. 版本信息 Spring Boot3.2.8Spring Cloud2023.0.1Spring Cloud alibaba2023.0.1.0nacos2.3.2本地安装的nacos2.3.0 Spring Boot、Spring Cloud、Spring Clo…