前言

如果是经验不够多的同志在学习Vue的时候,在最开始会接触到Vue传统的方式(选项式API),后边会接触到Vue3的新方式 —— 组合式API。相信会有不少同志会陷入迷茫,因为我第一次听到新的名词时也陷入了困扰,所以,到底什么是组合式API呢?

选项式API的坏处

代码碎片化

通常在维护和开发一个组件时,分为 data、methods、computed、props 等。假如有一些业务在选项 API 的 data、methods、computed 中进行操作。把要关注的相同视角分别用不同颜色的框子框起来,发现我们的关注点被拆分成了这样:

先不说大组件的关注点会被拆分成怎么样,就单纯这一个很简单的演示就能够让各位同志体会到选项式 API 的坏处了。当我们的组件开始变得更大时,逻辑关注点的列表也会增长。如果你是一个军队的指挥官,你会选择把战线拉得很长吗?费时费力,后勤补给也跟不上。

这种碎片化使得理解和维护复杂组件变得困难,选项的分离掩盖了潜在的逻辑问题。此外,在处理单个逻辑关注点时,我们必须不断地“跳转”相关代码的选项块。

逻辑不复用

上一小节中说到选项式API使代码变得碎片化,曾经我想过把一段多次使用到的业务代码抽离到一个单独的 js 文件里。我也遇到过一些困扰的小问题,导致我不能完成理想。

首先,在 data 选项声明的变量才是响应式数据。其次,在 methods 选项声明的函数才可以操控组件里的响应式数据。这是下文分析选项式API逻辑不复用时的重要前提条件。

在 demo.js 文件里,我定义了一个 a 变量,calc 函数改变 a 的值:

export let a = 'foo'
export function calc() { a = a + 'bar' }

对于这样的抽离方式,在使用的时候,依旧是需要把变量导入到 data 选项,使其成为响应式数据;函数导入到 methods 选项。

import { a, calc } from './demo.js'
export default {
data() { return { a } },
methods: { _calc() { calc() } }
}

由于 demo.js 文件里的函数操作的是 demo.js 文件里的变量 a ,而不是组件中响应式数据 a。导致我点击了按钮之后页面未作出任何反应。

解决方法是,calc 函数接受一个形参,然后再返回。当然可以!这只是一个简单的字符拼接而已。但是,这不是非常直接的办法,要经历一些曲折,同样会导致代码难读懂的问题。

官方提供的解决方案是混入,而混入还是在写选项API。不再选项API!不再选项API!不再选项API!,因为不符合期望。读到这里,想必知道了选项式API的坏处了。

一句话总结选项式API的坏处就是:代码碎片化、逻辑不复用

组合式API的好处

代码集中化

为什么组合式API就可以让代码不碎片化呢?因为组合式API的组合就在于它把变量、函数集中在一起,减少分离掩盖的潜在的逻辑问题,不在“跳转”相关代码的选项块。

所以,是如何集中化的呢?因为 Vue3 要实现代码集中化,所以,Vue3 的许多选项都抽离成为了一个个模块(这是我的猜想,因为每次用到什么必须从 vue 模块导入什么)。

组合式API就是一个 setup 函数,我们的所有代码全部都要写在这里面。

import { ref } from 'vue'
export default {
setup() {
let a = ref('foo')
function calcA() { a.value = a.value + 'bar' }
let b = ref('bar')
function calcB() { b.value = b.value + 'foo' }
let c = ref('hello')
function calcC() { c.value = c.value + 'world' }
let d = ref('world')
function calcD() { d.value = d.value + 'hello' }
}
}

现在,我们的关注点会被集中化,用图表示就是:

不知道各位同志是否有感受到这种变化,笔者已经感受到组合式API的强大了。

逻辑高复用

还记得第一章第二小节说到的问题吗?Vue3 的许多选项都抽离成为了一个个模块,所以我们可以在一个单独的 js 声明响应式数据了,就是利用ref函数来操作的。

我们新建一个 demo2.js 文件,首先引入 vue 模块中的 ref 函数,用于声明一个响应式数据:

import { ref } from 'vue'
export let a = ref('foo')
export function calc() { a.value = a.value + 'bar' }

然后我们在其他组件中使用:

import { a, calc } from './demo2.js'
export default {
setup() {
return { a, calc } // 这里需要导出a和calc
}
}

由于在 demo2.js 的 calc 函数操作的已经是一个响应式数据了,所以,组件一旦用到了这个模块中的东西,它都会反映到页面中。

大功告成,这得益于 Vue3 的一大进步啊!现在我们写代码可以写得非常舒服了。再加上 Vue3 是 TS 重构的,按道理来说是非常支持 TS 的写法的,前提是你的项目支持 TS。请问各位同志,Vue3 是不是可以适合开发大型应用了呢?

总结

将同一个逻辑关注点相关代码收集在一起,在处理单个逻辑关注点时,我们必须不断地“跳转”相关代码的选项块。使得开发人员更容易阅读和理解这些代码,这正是组合式 API 要解决的问题。

组合式 API 也导致以往的写法不相同,所以各位同志还是需要花时间去适应一段时间。

[Vue]浅谈Vue3组合式API带来的好处以及选项API的坏处的更多相关文章

  1. Vue浅谈

    谈Vue 最近在学习Vue相关的知识点并且也做一些练手,就在学习过程中出现的各种坑爹的地方做一个总结!之后再遇到也不会抓瞎. 1.Vue工程的安装 (1)首先先安装node.js这是Vue的运行基础. ...

  2. Vue 浅谈前端js框架vue

    Vue Vue近几年来特别的受关注,三年前的时候angularJS霸占前端JS框架市场很长时间,接着react框架横空出世,因为它有一个特性是虚拟DOM,从性能上碾轧angularJS,这个时候,vu ...

  3. 浅谈Vue.js

    作为一名Vue.js的忠实用户,我想有必要写点文章来歌颂这一门美好的语言了,我给它的总体评价是“简单却不失优雅,小巧而不乏大匠”,下面将围绕这句话给大家介绍Vue.js,希望能够激发你对Vue.js的 ...

  4. 浅谈Vue不同场景下组件间的数据交流

    浅谈Vue不同场景下组件间的数据“交流”   Vue的官方文档可以说是很详细了.在我看来,它和react等其他框架文档一样,讲述的方式的更多的是“方法论”,而不是“场景论”,这也就导致了:我们在阅读完 ...

  5. 【Vue】浅谈Vue不同场景下组件间的数据交流

    浅谈Vue不同场景下组件间的数据“交流”   Vue的官方文档可以说是很详细了.在我看来,它和react等其他框架文档一样,讲述的方式的更多的是“方法论”,而不是“场景论”,这也就导致了:我们在阅读完 ...

  6. 浅谈REST API

    浅谈REST API 说明: 本文部分内容根据其它网络文章编写,如有版权问题请及时通知. 背景 发迹于互联网的REST,在国内国外混得可谓是风生水起,如今又进入电信行业的视野,连TMF都将其作为战略项 ...

  7. vue3组合式API

    vue3组合式API 为什么要用组合式API,我们来看看它是如何解决vue2的局限性的 1.vue2的局限性 当组件内容越来越多,逻辑越来越复杂,可读性就会降低,并且难以维护. vue2组件采用配置式 ...

  8. 浅谈Vue响应式(数组变异方法)

    很多初使用Vue的同学会发现,在改变数组的值的时候,值确实是改变了,但是视图却无动于衷,果然是因为数组太高冷了吗? 查看官方文档才发现,不是女神太高冷,而是你没用对方法. 看来想让女神自己动,关键得用 ...

  9. 浅谈MVVM模式和MVP模式——Vue.js向

    浅谈MVVM模式和MVP模式--Vue.js向 传统前端开发的MVP模式 MVP开发模式的理解过程 首先代码分为三层: model层(数据层), presenter层(控制层/业务逻辑相关) view ...

随机推荐

  1. IdentityServer4[4]使用密码保护API资源

    使用密码保护API资源(资源所有者密码授权模式) 资源所有者(Resource Owner)就是指的User,也就是用户.所以也称为用户名密码模式.相对于客户端凭证模式,增加了一个参与者User.通过 ...

  2. Visual Studio 6.0 在 Windows 10 下崩溃的一种解决方法

    Visual Studio 6.0 下载地址: https://winworldpc.com/product/microsoft-visual-stu/60 安装步骤: https://www.cod ...

  3. vue-devtools 安装

    vue火了很久了,但是一直赶不上时代步伐的我今天才开始学,首先,根据vue官网介绍,推荐安装Vue Devtools.它允许你在一个更友好的界面中审查和调试 Vue 应用. 首先,将vue-devto ...

  4. The Data Way Vol.3|做到最后只能删库跑路?DBA 能做的还有很多

    关于「The Data Way」 「The Data Way」是由 SphereEx 公司出品的一档播客节目.这里有开源.数据.技术的故事,同时我们关注开发者的工作日常,也讨论开发者的生活日常:我们聚 ...

  5. 题解 Christmas Game

    题目传送门 题目大意 给出 \(t\) 个 \(n\) 个点 \(m\) 条边的无向图,每次可以从任意一棵树选择一条边删掉,然后该树不与根(为 \(1\) )联通的部分被删掉.不能操作的人输.问谁有必 ...

  6. uoj279题目交流通道(dp)

    题目大意: 神犇星球有 \(n\) 座小城.对于任意两座小城 \(v,u\)\((v≠u)\),吉米多出题斯基想在 \(v,u\) 之间建立一个传送时间为 \(w(v,u)\)的无向传送通道,其中 \ ...

  7. Markdown数学公式

    1. 显示位置与大小 正文(inline)中的LaTeX公式用$...$定义, 显示在当前行内. $\sum_{i=0}^N\int_{a}^{b}g(t,i)\text{d}t$ \(\sum_{i ...

  8. 【UE4 C++】定时器 Timer 与事件绑定

    概念 定时执行操作,可执行一次,或循环执行直到手动终止 定时器在全局定时器管理器(FTimerManager 类型)中管理.全局定时器管理器存在于 游戏实例 对象上以及每个 场景 中 定时器需要绑定委 ...

  9. 2019OO第三单元作业总结

    OO第三单元的作业主题是JML规格化设计,作业以图及图的最短路径相关计算为载体,体现接口的规格化设计. ------------------------------------------------ ...

  10. 用cmd命令行创建vue项目模板

    1.进入cmd命令行 输入存放项目的位置 2.通过vue create 项目名称 创建项目 3.选择Manually select features 4.通过空格选中第1.2.5.6.7.去掉8 4. ...