Vue3为什么要使用Composition API

7,847 阅读4分钟

| 导语 Composition API是Vue3的最大特点,也可以很明显看出他是受到React Hooks的启发。本文主要来讲讲Vue为什么要使用一个新的概念来组织代码。

为了解决什么问题?

首先来看看这个新的东西的出现,是为了解决Vue 2的什么问题。 当前使用Vue2开发的项目,普遍存在的问题:

  • 代码的可读性随着组件变大而变差
  • 每一种代码复用的方式,都存在缺点
  • TypeScript支持有限

我们来详细看一下这些问题的出现和Composition API带来的解决方案

代码可读性逐渐变差

假设我们要写一个搜索框组件,首先它存在一个基础功能-搜索,则代码结构如下: 过了一段时间,产品经理说要加了个排序的需求,组件代码就变成这样: 目前看着还行,直到经过一个又一个迭代,例如加上了搜索过滤功能,分页功能等等,各种新增功能的代码块,写在项目里的各个位置(不同组件,props,computed,生命周期函数,data,methods)。

分散在各个地方的逻辑片段,使我们的组件越来越难以阅读,经常为了看一个功能要疯狂上下滑动屏幕,在各个区块里翻找和修改。

而在这个场景下,使用Composition API可以将同一功能的代码写在同一个区域里,无论是维护性还是可读性都是更好的。 显而易见,如果我们能把相同功能的代码放在一起,是比分散的写更易读的,使用Vue3提供的新函数setup就能实现。setup在目前在Vue3中是可选属性,使用原有的组件写法也是完全兼容的。

初次看到setup的这种粗暴用法,很多人都会想到,这不是要我写一个巨大的setup函数,把所有的组件逻辑全塞进setup函数里吗?

实际上,你只要把不同的功能逻辑代码都用函数封装起来,这种巨型setup函数就不会出现。这一个个封装起来的功能函数,就是Composition函数,或者你也可以叫他们“Vue Hooks”。 这种将代码按照功能分块的代码组织方式,很好的解决了第一个问题,我们接下里看第二个需要解决的问题。

没有一个完美的代码复用方案

当谈到代码复用,在Vue2中有三种常用的方式,而每一种方式都存在限制。

Vue2代码复用1-Mixins

Mixins的优点: 可以将代码按照功能组织区分 Mixins的缺点:

  1. 存在冲突隐患,你有可能在使用过程中出现属性或函数的重名冲突
  2. 依赖关系不清晰,特别是在多个Mixins存在交流的情况下。
  3. 逻辑复用不够灵活,如果你需要在不同的组件间差异化或配置化使用Mixins的话。

Vue2代码复用2-Mixin Factory

使用一个工厂函数,根据传入配置,返回对应的Mixin内容。 上面的2和3,可以通过使用Mixin Factory方式部分解决,但是依然无法解决的是:

  1. 重名隐患始终存在。
  2. 属性来源依然不清晰,需要进入每个Minxin文件内查看暴露的属性
  3. 没有跑在运行时,因此Mixin工厂函数没法动态生成

Vue2代码复用3-Scoped Slots

优点: 解决了上面的所有缺点 缺点:

  1. 配置只能写在template上
  2. 增加了模板嵌套,降低可读性
  3. 暴露的属性只能在template上使用
  4. 实现相同的功能需要嵌套更多的组件,性能降低

Vue3代码复用

可以看到,上述每种代码复用的方式都存在自己的劣势,Vue3的Composition API提供了第四种代码复用的解决方案。 通过对可复用代码的抽离,我们的代码组织可能变成这样:

这样,我们可以对复用的逻辑进行随意的组合和配置,并放入setup函数内执行。

好处:

  1. 没有了各种分散的区块,我们可以写更少的代码,也更容易将可以复用的逻辑从组件里抽出到函数里。
  2. 比原有的Mixins或Slot方式都更加灵活

缺点: 除了要用一下新的语法,好像也没别的缺点了

结语

希望对于为什么要使用Composition API这个问题,看完这篇文章你能得到一些收获。