专栏名称: 前端从进阶到入院
我是 ssh,只想用最简单的方式把原理讲明白。wx:sshsunlight,分享前端的前沿趋势和一些有趣的事情。
目录
相关文章推荐
中国能源报  ·  关于举办绿电、绿证、CCER交易培训的通知 ·  2 天前  
中国能源报  ·  关于举办绿电、绿证、CCER交易培训的通知 ·  2 天前  
龙船风电网  ·  建设进度过半!这座海上风电场成本上涨 ·  2 天前  
南方能源观察  ·  深化新能源上网电价市场化改革正当其时 ·  2 天前  
中国舞台美术学会  ·  通知丨文化和旅游部艺术司关于征集戏曲创作优秀 ... ·  4 天前  
51好读  ›  专栏  ›  前端从进阶到入院

这应该是全网最详细的Vue3.5版本解读

前端从进阶到入院  · 公众号  ·  · 2024-09-05 15:18

主要观点总结

Vue3.5版本发布,带来了多个新功能和改进,包括onEffectCleanup、onWatcherCleanup、pause和resume方法、watch的deep选项支持传入数字、useId函数、Teleport组件新增defer延迟属性、useTemplateRef函数等。这些功能为开发者提供了更灵活和强大的工具,使得Vue的响应式系统更加完善和强大。同时,Vue3.5也提供了更高效的性能优化和更丰富的API,方便开发者更好地使用Vue进行项目开发。

关键观点总结

关键观点1: onEffectCleanup和onWatcherCleanup函数

这两个函数用于在组件卸载前或下一次watch回调执行前自动清理资源,提高了代码的效率和可维护性。

关键观点2: pause和resume方法

这两个方法允许开发者在一段时间内暂停或恢复watch或watchEffect中的回调,为开发者提供了更灵活的控制。

关键观点3: watch的deep选项支持传入数字

这个改进使得监控对象的深度变得可配置,方便开发者根据需要监控不同深度的对象。

关键观点4: useId函数

这个函数用于生成唯一的ID,解决了服务端渲染时ID不一致的问题,增强了应用的健壮性。

关键观点5: Teleport组件新增defer延迟属性

这个属性使得Teleport组件可以在渲染周期结束后进行渲染,解决了之前无法将目标放在Teleport组件后面的问题。

关键观点6: useTemplateRef函数

这个函数简化了访问DOM和子组件的方式,使得使用ref更加直观和方便。


正文

前言

Vue3.5正式版 在这两天发布了,网上已经有了不少关于Vue3.5版本的解读文章。但是欧阳发现这些文章对3.5中新增的功能介绍都 不是很全 ,所以导致不少同学有个 错觉 ,觉得Vue3.5版本不过如此,选择跳过这个版本等下个大版本再去更新。所以欧阳写了这篇 超级详细 的Vue3.5版本解读文章,小伙伴们可以看看在3.5版本中有没有增加一些你期待的功能。

版本号

这次的版本号是 天元突破红莲螺岩 ,这是07年出的一个二次元动漫,欧阳是没看过的。在此之前我一直以为这次的版本号会叫 黑神话:悟空 ,可能悟空不够二次元吧。

响应式

响应式相关的内容主要分为:重构响应式、响应式props支持解构、新增 onEffectCleanup 函数、新增 base watch 函数、新增 onWatcherCleanup 函数、新增 pause resume 方法。

重构响应式

这次响应式的重构是属于Vue内部优化,对于普通开发者来说是无感的。重构后内存占用减少了56%,优化手段主要是通过 版本计数 双向链表数据结构 ,灵感来源于Preact signals。后续欧阳会出一系列关于响应式相关的源码文章,大家可以关注一波欧阳。

响应式props支持解构

在3.5中响应式props支持解构终于正式稳定了,在没有这个功能之前我们想要在js中访问prop必须要这样写: props.name ,否则 name 将会丢失响应式。

有了响应式props解构后,在js中我们就可以直接解构出 name 来使用,比如下面这样的代码:




    

import { watchEffect, ref } from "vue";
import { onEffectCleanup } from "@vue/reactivity";

const flag = ref(true);
watchEffect(() => {
  if (flag.value) {
    const timer = setInterval(() => {
      // 做一些事情
      console.log("do something");
    }, 200);
    onEffectCleanup(() => {
      clearInterval(timer);
    });
  }
});

上面这个例子在watchEffect中会去注册一个循环调用的定时器,如果不使用onEffectCleanup,那么我们就需要在beforeUnmount钩子函数中去清理定时器。

但是有了onEffectCleanup后,将clearInterval放在他的回调中就可以了。当组件卸载时会自动执行onEffectCleanup传入的回调函数,也就是会执行clearInterval清除定时器。

还有一点值得注意的是onEffectCleanup函数目前没有在vue包中暴露出来,如果你想使用可以像我这样从@vue/reactivity包中导入onEffectCleanup函数。

新增base watch函数

我们之前使用的watch函数是和Vue组件以及生命周期一起实现的,他们是深度绑定的,所以watch函数代码的位置在vue源码中的runtime-core模块中。

但是有的场景中我们只想使用vue的响应式功能,也就是vue源码中的reactivity模块,比如小程序vuemini。为此我们不得不将runtime-core模块也导入到项目中,或者像vuemini一样去手写一个watch函数。

在3.5版本中重构了一个base watch函数,这个函数的实现和vue组件没有一毛钱关系,所以他是在reactivity模块中。详情可以查看我之前的文章:Vue3.5新增的baseWatch让watch函数和Vue组件彻底分手

还有一点就是这个base watch函数对于普通开发者来说没有什么影响,但是对于一些下游项目,比如vuemini来说是和受益的。

新增onWatcherCleanup函数

和前面的onEffectCleanup函数类似,在组件卸载之前或者下一次watch回调执行之前会自动调用onWatcherCleanup函数,同样有了这个函数后你就不需要在组件的beforeUnmount钩子函数去统一清理一些timer了。比如下面这个场景:

import { watch, ref, onWatcherCleanup } from "vue";

watch(flag, () => {
  const  timer = setInterval(() => {
    // 做一些事情
    console.log("do something");
  }, 200);
  onWatcherCleanup(() => {
    console.log("清理定时器");
    clearInterval(timer);
  });
});

onEffectCleanup函数不同的是我们可以从vue中import导入onWatcherCleanup函数。

新增pause和resume方法

有的场景中我们可能想在“一段时间中暂停一下”,不去执行watch或者watchEffect中的回调。等业务条件满足后再去恢复执行watch或者watchEffect中的回调。在这种场景中pauseresume方法就能派上用场啦。

下面这个是watchEffect的例子,代码如下: