Vue 3.0 中令人激动的新功能:Composition API
正如你所期望的那样,Vue 3带来了很多令人兴奋的新功能。值得庆幸的是,Vue团队主要是在当前API的基础上引入了一些补充和改进,而不是进行重大更改,所以已经了解Vue 2的人应该很快就会对新的语法感到适应。
让我们从你们大多数人可能听说过的API开始吧......
Composition API
Composition API是Vue的下一个主要版本中最常用的讨论和特色语法。这是一种全新的逻辑重用和代码组织方法·
当前,我们使用所谓的Options API构建组件。为了向Vue组件添加逻辑,我们填充(选项)属性,例如数据,方法,计算的等。这种方法的最大缺点是,这本身并不是有效的JavaScript代码。您需要确切了解模板中可以访问哪些属性,以及此关键字的行为。在后台,Vue编译器需要将此属性转换为工作代码。因此,我们无法从自动建议或类型检查中受益。
Composition API的目的是通过将当前可用组件属性作为JavaScript函数暴露出来的机制来解决这个问题。Vue核心团队将Composition API描述为“一组基于功能的附加API,可以灵活地组合组件逻辑”。使用 Composition API 编写的代码更易读,而且没有任何幕后的魔力,更容易阅读和学习。
让我们来看看一个非常简单的例子,看看使用新的Composition API的组件是如何工作的。
<template>
<button @click="increment">
Count is: {{ state.count }}, double is: {{ state.double }}
</button>
</template> <script>
import { reactive, computed } from 'vue' export default {
setup() {
const state = reactive({
count: 0,
double: computed(() => state.count * 2)
}) function increment() {
state.count++
} return {
state,
increment
}
}
}
</script>
现在,让我们把这段代码分解成几段,以了解发生了什么事
import { ref, computed, onMounted } from 'vue'
正如我之前提到的Component API是以函数的形式展示组件属性,所以第一步就是导入我们需要的函数。在我们的例子中,我们需要用 ref创建reactive reference,用 computed 创建computed属性,用onMounted访问mounted的挂载生命周期钩子。·
现在你可能会想知道这个神秘的 setup 方法是什么?
export default {
setup() {}
}
简而言之,它只是一个函数,向模板返回属性和函数。就是这样。我们在这里声明所有的反应式属性、计算属性、watchers和生命周期钩子,然后返回它们,这样它们就可以在模板中使用。·
我们没有从setup函数中返回的东西将不能在模板中使用
const count = ref(0)
根据上面的内容,我们用ref函数声明了一个叫count的反应式属性。它可以包裹任何基元或对象,并返回它的反应式引用。传入的元素的值将被保存在创建的引用的value属性中。例如,如果你想访问count引用的值,你需要显式请求count.value。
const double = computed(() => count.value * 2)
function increment() {
count.value++
}
而这正是我们在声明计算属性双倍和增量函数时所做的
onMounted(() => console.log('component mounted!'))
当组件被挂载时,我们用onMounted钩子记录一些消息,只是为了让你知道你可以 simle
return {
count,
double,
increment
}
最后我们用 increment 方法返回 count 和 double 属性,使其在模板中可用
<template>
<button @click="increment">
Count is: {{ count }}, double is {{ double }}. Click to increment.
</button>
</template>
现在我们可以像以前的Options API一样,在模板中访问由setup方法返回的属性和函数
这是一个简单的例子,用Options API也可以很容易实现。新的Composition API的真正好处不仅仅是以不同的方式编码,当涉及到重用我们的代码/逻辑时,好处就会显现出来
使用Composition API重用代码
新的Composition API有更多的优势。考虑到代码的重用。目前,如果我们想在其他组件之间共享一些代码,有两种选择----mixins和scoped slots。这两种方案都有其缺点。
假设我们想提取 counter 的功能,并在其他组件中重用。下面你可以看到它如何与可用的API和新的Component API一起使用
让我们从mixins开始说起
import CounterMixin from './mixins/counter'
export default {
mixins: [CounterMixin]
}
mixins最大的缺点是,我们对它究竟在我们的组件中加入了什么东西一无所知。这使得它不仅难以推理,而且还可能导致与现有的属性和函数的名称碰撞。·
这时候就到了加scoped slots的时候了
<template>
<Counter v-slot="{ count, increment }">
{{ count }}
<button @click="increment">Increment</button>
</Counter>
</template>
有了scoped slots,我们就可以通过v-slot属性准确地知道我们可以通过v-slot属性访问哪些属性,这样就更容易理解代码了。这种方法的缺点是,我们只能在模板中访问,而且只能在Counter组件作用域中使用
现在是Composition API的时候了
function useCounter() {
const count = ref(0)
function increment () { count.value++ }
return {
count,
incrememt
}
}
export default {
setup () {
const { count, increment } = useCounter()
return {
count,
increment
}
}
}
更加优雅了,不是吗?我们不受模板和组件范围的限制,可以准确地知道我们可以从counter中访问哪些属性。此外,我们还可以从编辑器中的代码完成中受益,因为useCounter只是一个返回一些属性的函数。在幕后没有什么魔法,所以编辑器可以帮助我们进行类型检查和建议。
这也是一种比较优雅的使用第三方库的方式。例如,如果我们想使用Vuex,我们可以显式使用Store函数,而不是污染Vue原型(this.$store)。这种方法也消除了Vue插件的幕后魔法
const { commit, dispatch } = useStore()
如果你想了解更多关于Composition API和它的用例,我强烈推荐你阅读Vue团队的这篇文档,它解释了新的API背后的原因,并推荐了它的最佳用例。还有一个很好的资源库,里面有Vue核心团队的Thorsten Lünborg提供的Composition API使用案例
以上示例来自:https://composition-api.vuejs.org/#basic-example
Vue 3.0 中令人激动的新功能:Composition API的更多相关文章
- 【译】.NET 5. 0 中 Windows Form 的新特性
自从 Windows Form 在 2018 年底开源并移植到 .NET Core 以来,团队和我们的外部贡献者都在忙于修复旧的漏洞和添加新功能.在这篇文章中,我们将讨论 .NET 5.0 中 Win ...
- Android开发之清除缓存功能实现方法,可以集成在自己的app中,增加一个新功能。
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 Android开发之清除缓存功能实现方法,可以集成在自己的app中,增加一个新功能. 下面是一个效果图 ...
- [译] OpenStack Ocata 版本中的 53 个新功能盘点
原文链接:https://www.mirantis.com/blog/53-new-things-to-look-for-in-openstack-ocata/ 原文作者:Nick Chase, Ra ...
- 优秀个人免费私有云OwnCloud 8.0终于发布 - 亮眼新功能初探简介
OwnCloud是一个基于Linux的私有云开源项目,用户可以免费使用它来搭建自己的私有云来进行文件和多媒体等的分享. 本人有幸在大概一年多前因为项目需要而接触和使用到OwnCloud,但不幸的是当时 ...
- [译] OpenStack Pike 版本中的 53 个新功能盘点
原文:https://www.mirantis.com/blog/53-things-to-look-for-in-openstack-pike/ 作者:Mirantis Nick Chase 发 ...
- 微软Blazor组件发布,DevExpress v19.1.8中可用:Charts新功能
点击获取DevExpress v19.2.3最新完整版试用下载 DevExpress UI for Blazor在v19.1.8中可用,此次更新发布包括DevExpress Blazor组件的主要功能 ...
- Android 9 新功能 及 API 介绍(提供了实用的模块化的功能支持,包括 人工智能)
Android 9(API 级别 28)为用户和开发者引入了众多新特性和新功能. 本文重点介绍面向开发者的新功能. 要了解新 API,请阅读 API 差异报告或访问 Android API 参考. ...
- [UWP小白日记-12]使用新的Composition API来实现控件的阴影
前言 看了好久官方的Windows UI Dev Labs示例好久才有点心得,真是头大.(其实是英语幼儿园水平(⊙﹏⊙)b) 真的网上关于这个API的资料可以说几乎没有. 正文 首先用这东西的添加WI ...
- Android5.0中Material Design的新特性
最近项目中需要用到Material Design,整理了下面几个常用的控件,以便记忆. 一.Snackbar 1.作用:与Toast类似,但是可以点击监听: 2.使用: (1)Snackbar调用静态 ...
随机推荐
- Qt使用MD5加密
Qt中包含了大部分常用的功能,比如json.数据库.网络通信.串口通信以及今天说的这个MD5加密: Qt中将字符串进行MD5加密其实比较简单,代码如下: #include <QCoreAppli ...
- Ubuntu安装海思SDK(转)
问题 海思SDK安装时,无法运行sdk.unpack 原因 BASH 和 DASH 的问题. Debian和Ubuntu中,/bin/sh默认已经指向dash,这是一个不同于bash的shell,它主 ...
- 并发编程——IO模型详解
我是一个Python技术小白,对于我而言,多任务处理一般就借助于多进程以及多线程的方式,在多任务处理中如果涉及到IO操作,则会接触到同步.异步.阻塞.非阻塞等相关概念,当然也是并发编程的基础. ...
- C#LeetCode刷题之#55-跳跃游戏(Jump Game)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3674 访问. 给定一个非负整数数组,你最初位于数组的第一个位置. ...
- C#LeetCode刷题之#728-自除数(Self Dividing Numbers)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3889 访问. 自除数 是指可以被它包含的每一位数除尽的数. 例如 ...
- C#LeetCode刷题之#448-找到所有数组中消失的数字(Find All Numbers Disappeared in an Array)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3712 访问. 给定一个范围在 1 ≤ a[i] ≤ n ( n ...
- Android 开发学习进程0.19 webview 的使用
Android 中的webview android 中的webview是可以在app内部打开HTML等的网页,不必再打开浏览器,有两种实现方法,即webviewclient webChromeclie ...
- Redis持久化存储——>RDB & AOF
Redis中两种持久化存储机制RDB和AOF redis是一个内存数据库,数据保存在内存中,但是我们都知道内存的数据变化是很快的,也容易发生丢失.幸好Redis还为我们提供了持久化的机制,分别是RDB ...
- 面经手册 · 第4篇《HashMap数据插入、查找、删除、遍历,源码分析》
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 在上一章节我们讲解并用数据验证了,HashMap中的,散列表的实现.扰动函数.负载因 ...
- SpringMVC常见问题Error configuring application listener of class org.springframework.web.context.ContextLoaderListenejava.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
六月 20, 2018 9:43:34 下午 org.apache.catalina.core.StandardContext listenerStart 严重: Error configuring ...