vue4.0新特性,vue3.2新特性

  vue4.0新特性,vue3.2新特性

  本文主要介绍3.0版本的强升级点的特性的详细说明。有需要的朋友可以借鉴一下,希望能有所帮助。祝大家进步很大,早日升职加薪。溴

  

目录

   I、组合API:组合API/注入API II、自定义渲染器API (VUE 2.x)架构问题I II、更高级的组件片段组件悬疑组件IV、更好的TS支持V、更快的开发体验(vite开发构建工具)VI、按需编译、比VUE 2.x小(摇树)VII。性能比2.x快1.2 ~ 2倍优化diff算法静态改善渲染阶段(渲染阶段是指生成虚拟dom树的阶段)事件监听缓存减少创建组件实例的开销摘要:

  

一、Composition API: 组合API/注入API

  与vue2.x相比,Vue3.0在架构上进行了升级,性能大幅提升。组合API的出现使得组件抽取和逻辑代码重用更加灵活。

  说到这里的代码组织,传统的网页是html/css/javascript(结构/风格/逻辑)的分离。Vue/react通过组件化把紧密相关的结构/风格/逻辑放在一起,有利于代码的维护。

  Composition api更进一步,专注于JavaScript(逻辑)部分,把逻辑相关的代码放在一起,紧密且有利于代码维护。

  在vue2的组件中,使用了Option API样式(data/methods/mounted)组织的代码,会使逻辑分散。例如,当我们完成一个计数器函数时,我们必须在数据中声明变量,在方法中定义响应函数,在mounted中初始化变量。如果我们在一个函数很多、代码量很大的组件中,要维护这样一个函数,你需要反复切换到data/methods/mounted中对应的位置,然后修改代码。

  在vue3中,使用设置功能。以下与count相关的逻辑放在counter.js文件中,与todo相关的逻辑放在todos.js中

  从导入useCounter。/计数器

  从导入useTodo。/托多斯

  setup(){

  设{ val,todos,addTodo }=useTodo()

  设{count,add}=useCounter()

  返回{

  瓦尔,托多斯,阿德托多,

  计数,相加,

  }

  }

  在我看来,这就是Composition API最大的特点,基于函数的代码组织方式。同时,它可以使代码更容易重用。

  说到重用,组合API的方式要比mixin好很多。你可以清楚的看到组件使用的数据和方法来自哪个模块,而mixin进入组件的函数往往让我们很困惑这个函数来自哪个mixin。

  

二、自定义渲染API(Custom Renderer API)

  

vue2.x架构问题

  起初,vue2.x支持在浏览器中运行,在浏览器的dom上渲染。随着vue的流行,出现了weex和myvue。

  Weex:移动跨平台方案,需要渲染到移动设备上。Weex是在最初的vue项目中编写的。缺点是把原来的vue项目做大了,不是通用的解决方案。Myvue:用在小程序上,需要在小程序框架上渲染。Myvue是单独的fork源码来改的,缺点也很明显。myvue中的vue版本从分叉的那一刻起就和正式版不一致。Vue2.x项目架构对这种到不同平台的渲染不是很友好,vue3.0引入了自定义渲染API来解决这个问题。

  我们先来看看vue2和vue3在词条写作上的区别:

  //vue2

  从“vue”导入Vue

  从导入应用程序。/App.vue

  新Vue({=h(App)})。$ mount(“# app”)

  //vue3

  来自“vue”的const { createApp }

  从导入应用程序。/src/App

  createApp(应用程序)。挂载(( #app )

  由vue正式实现的CreateApp将为我们的模板映射生成html代码。但如果不想渲染生成html,而是想渲染生成canvas等非html代码,就需要使用自定义渲染器API来定义自己的render渲染生成函数。

  //可以自己实现一个createApp,比如渲染到canvas。

  从“”导入{ createApp }。/runtime-render ;

  从导入应用程序。/src/App ;//根组件

  createApp(应用程序)。挂载( # app );

  通过自定义渲染器API,完美解决了weex、myvue等方案的问题。只需重写createApp。

  

三、更先进的组件

  

Fragment组件

  Vue2不允许这样写。组件必须有一个从动节点。现在你可以这样写了。vue会为我们创建一个虚拟碎片节点。

  模板

  divHello/div

  divWorld/div

  /模板

  这样写有什么好处?首先,如果根节点不是必需的,就没有必要创建它,这减少了节点的数量。第二,片段节点是虚拟的,不会出现在DOM树中。

  

Suspense组件

  焦虑

  模板

  悬浮组件/

  /模板

  模板#回退

  装货.

  /模板

  /悬念

  在暂停组件完全呈现之前,将显示备用内容。如果是异步组件,悬念可以等待组件下载,或者在设置函数中执行一些异步操作。

  

四、更好的TS支持

  Vue2不适合ts,因为它的Option API风格。Options是一个简单的对象,而ts是一个类型系统和面向对象的语法。两者略有不匹配。

  在vue2和ts结合的具体实践中,vue组件要用vue-class-component来加强,脚本要支持TypeScript decorator,用vue-property-decorator来添加更多具有vue特征的decorator。最后,ts的组件编写和js有很大不同。

  在vue3中,对defineComponent函数进行了裁剪,使组件能够更好地利用ts下的参数类型推断。在组合api的代码风格中,代表API是ref和reactive,它们也很好地支持类型声明。

  从“vue”导入{ defineComponent,ref }

  const Component=define Component({

  道具:{

  成功:{ type: String },

  学生:{

  type:Object as PropTypelt;学生gt;

  必填:真

  }

  },

  setup() {

  常数年=ref(2020)

  const month=refltstring numbergt(9)

  月值=9 //好的

  const result=year . value . split()//=gt;类型“number”上不存在属性“split”

  });

  

五、更快的开发体验(vite开发构建工具)

  当使用webpack作为开发和构建工具时,npm run dev必须等待一段时间。项目越大,等待的时间越长。热重装页面会有几秒钟的延迟,但是如果用vite作为vue3的开发构建工具,npm run dev会秒开,热重装会非常快。这样的开发体验真的很爽,我拒绝等待。

  vite的原理还是用浏览器支持导入关键字。启动项目最初是在没有webpack构建工具的情况下构建的。浏览器直接请求路由对应的代码文件,代理服务器编译返回单个文件。如果请求的文件中导入了其他文件,类似地,浏览器继续发送请求,代理服务器返回。这样npm run dev就不需要编译了,实时请求实时编译。

  

六、按需编译,体积比Vue2.x更小(Tree shaking)

  在vue3中,可以参考vue的功能如下。如果你的项目不使用watch,编译时会掉树抖。

  从“vue”导入{ computed,watch,next tick };

  使用ES6模块系统导入/导出。

  

七、性能比2.x快1.22倍

  

diff算法的优化

  在vue2中,虚拟dom是完全比较的。

  在vue3中,添加了静态标签PatchFlag。创建vnode时,将根据vnode的内容是否可以更改,向其添加静态标记PatchFlag。Diff,只比较带有PatchFlag的节点。PatchFlag是一个类型,比如一个可变的文本节点,它将被添加一个静态标签,其PatchFlag的枚举值是TEXT。这样,diff时,只需比较文本内容即可。比较的内容比较少。Patch还有动态类、动态样式、动态属性、动态键属性等枚举值。

  

render阶段的静态提升(render阶段指生成虚拟dom树的阶段)

  在vue2中,一旦检查到数据更改,将重新创建重新渲染组件,并重新创建所有vnode以形成新的vdom树。

  在vue3中,对于不参与更新的vnode,会静态提升,只创建一次,重新渲染时直接重用。

  静态提升可以理解为保存第一次更新没有涉及到的vnode节点的引用。当重新渲染新的vdom树时,只需获取它们的引用,不需要重新创建它们。

  

事件侦听缓存

  在vue2中,我们写的@click=onClick 也被当作一个动态属性,diff的时候也要进行比较。但我们知道它不会改变,比如@click=onClick2 并绑定其他值。

  在vue3中,如果事件不会改变,onClick会被缓存(类似于静态提升达到的效果),节点不会被打上PatchFlag(即不需要更新的节点)。这样,在render和diff阶段,事件侦听属性都可以节省不必要的性能消耗。

  我曾经维护过一个有巨大dom树的页面。因为有那么多节点,也有那么多节点不需要参与更新。在使用vue2的情况下,大量的性能消耗在render和diff这两个阶段。如果当时有vue3,我想性能会优化很多。

  

减少创建组件实例的开销

  vue2.x每创建一个实例,data,props,computed都在这上面暴露,都是Object.defineProperty定义的,这部分操作相当耗时。

  基于vue3.0中的代理,减少了创建组件实例的性能开销。

  

总结:

  其他的,数据监控方式改为Proxy,消除了Object.defineProperty现有的限制(比如不能检测新的属性添加),提供了更好的性能。Vue3解决了vue2的一些问题,比如大型应用的性能和不友好的ts支持,自定义渲染API解决了架构的问题。在vue3的基础上实现weex框架会好很多。也做了很多优化,Composition API让代码组织得更好。Vite开发和构建工具让开发体验更好,树摇让包更小,性能更好。总的来说,vue3还是很不错的,很强大,带来了很多非常好的新功能。以上是Vue3.0强升级点功能的详细内容,更多关于Vue3.0升级功能的信息,请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: