Vue 3.0 来了,我们该做些什么?
靓仔路过,不要错过
想必 Vue3.0 发布这件事,大家都知道了。

我也是从朋友圈的转发得知此事,博客平台、公众号、朋友圈基本都有这么一条新闻,可见 Vue3.0 的被期待程度,因为 React 16 发布的时候,我也没见大家这么追捧,让我有点震惊的是 Vue 有 130 万的使用者,这个体量真的是有点惊人。

Vue 3.0 来了,我们该做些什么呢?
- 学习,赶紧学习,学不动了也要学!
- 装不知道,我是一只快乐的鸵鸟,我不知道 Vue 更新了,继续摸鱼爽歪歪。
- 为了下半年的 KPI,冲冲冲!把手头的 Vue 项目进行版本升级和重构。

Vue3.0 更新了啥
让我总结的话,就只有两个比较重要的更新(我目前还没有完完整整的体验过新版本,有些地方可能不够完善,希望大家多多包涵,后续会整理和分享一些实践的 demo)。
一个是 Composition API,另一个是对 TypeScript 的全面支持。
团队还会出一个 Vue 2.7 的版本,给予 2.x 用户一些在 3.0 版本中被删除方法的警告,这有助于用户的平稳升级。
Nuxt3 好像还在路上,但是目前看来,市面上的各大组件库还没来得及针对 Vue3.0 进行改版升级。
周边的插件如 Vue-Router、Vuex、VSCode 插件 Vetur 等都在有序的进行中。
Vue3.0 具体更新了啥
来点阳间的知识,说点人话。

下面以代码片段的形式为大家介绍一下 Vue3.0 作出了哪些新的变化,Vue2.x 对应一些 Vue3.0 的写法。
应用的配置项
config 是一个包含 Vue 应用程序全局配置的对象。可以在挂载应用程序之前修改下面列出的属性。
- devtools
类型: boolean
默认值: true
如何使用:
app.config.devtools = true
是否开启 vue-devtools 工具的检测,默认情况下开发环境是 true,生产环境下则为 false。
- errorHandler
类型: Function
默认值: undefined
如何使用:
app.config.errorHandler = (err, vm, info) => {
// info 为 Vue 在某个生命周期发生错误的信息
}
为组件渲染功能和观察程序期间的未捕获错误分配处理程序。
- globalProperties
类型: [key: string]: any
默认值: undefined
如何使用:
app.config.globalProperties.name = '十三'
app.component('c-component', {
mounted() {
console.log(this.name) // '十三'
}
})
若是组件内也有 name 属性,则组建内的属性权限比较高。
还有一个知识点很重要,在 Vue2.x 中,我们定义一个全局属性或者方法都是如下所示:
Vue.prototype.$md5 = () => {}
在 Vue3.0 中,我们便可这样定义:
const app = Vue.createApp({})
app.config.globalProperties.$md5 = () => {}
- performance
类型: boolean
默认值: false
如何使用:
app.config.performance = true
将其设置为 true 可在浏览器 devtool 性能/时间线面板中启用组件初始化,编译,渲染和补丁性能跟踪。 仅在开发模式和支持 Performance.mark API的浏览器中工作。
Application API
全局改变的动作,都在 createApp 所创建的应用实例中,如下所示:
import { createApp } from 'vue'
const app = createApp({})
那么 app 下这些属性:
- component
参数: 第一个参数 string 类型表示组件名,第二个参数 Function 或 Object
返回值: 只传第一个参数,返回组建。带上第二个参数则返回应用程序实例
如何使用:
import { createApp } from 'vue'
const app = createApp({})
// 注册一个 options 对象
app.component('shisan-component', {
/* ... */
})
// 检索注册的组件
const ShiSanComponent = app.component('shisan-component')
- config(上面第一段讲过了)
- directive
自定义指令变化不大,还是之前那些东西,如下:
app.directive('my-directive', {
// 挂载前
beforeMount() {},
// 挂载后
mounted() {},
// 更新前
beforeUpdate() {},
// 更新后
updated() {},
// 卸载前
beforeUnmount() {},
// 卸载后
unmounted() {}
})
多数全局API都没变化,还是老的 2.x 的写法居多。
Composition API
Composition API解决了什么问题?
使用传统的 Vue2.x 配置方法写组件的时候问题,随着业务复杂度越来越高,代码量会不断的加大。由于相关业务的代码需要遵循option 的配置写到特定的区域,导致后续维护非常的复杂,同时代码可复用性不高,你常常会发现一个页面组件,写着写着就写到了三四百行去了。

有没有熟悉的感觉?没错这就是老的模式带来的弊端,一直憋了这么久,也没谁了~~
而 Composition API 解决了这个令人头疼的问题。
它为我们提供了几个函数,如下所示:
- reactive
- watchEffect
- computed
- ref
- toRefs
- hooks
reactive
import { reactive, computed } from 'vue'
export default {
setup() {
const state = reactive({
a: 0
})
function increment() {
state.a++
}
return {
state,
increment
}
}
}
reactive 相当于 Vue2.x 的 Vue.observable () API,经过 reactive 处理后的函数能变成响应式的数据,类似之前写模板页面时定义的 data 属性的值。
watchEffect
import { reactive, computed, watchEffect } from 'vue'
export default {
setup() {
const state = reactive({ a: 0 })
const double = computed(() => state.a * 3)
function increment() {
state.count++
}
const wa = watchEffect(() => {
// 使用到了哪个 ref/reactive 对象.value, 就监听哪个
console.log(double.value)
})
// 可以通过 wa.stop 停止监听
return {
state,
increment
}
}
}
watchEffect 被称之为副作用,立即执行传入的一个函数,并响应式追踪其依赖,并在其依赖变更时重新运行该函数。
computed
import { reactive, computed } from 'vue'
export default {
setup() {
const state = reactive({
a: 0
})
const double = computed(() => state.a * 3)
function increment() {
state.a++
}
return {
double,
state,
increment
}
}
}
这就比较直观了,computed 在 Vue2.x 就存在了,只不过现在使用的形式变了一下,需要被计算的属性,通过上述形式返回。
ref 和 toRefs
toRefs 提供了一个方法可以把 reactive 的值处理为 ref,也就是将响应式的对象处理为普通对象。
hooks
与 2.x 版本相对应的生命周期钩子
| Vue2.x 的生命周期 | Vue3.x 的生命周期 |
|---|---|
| beforeCreate | setup() |
| created | setup() |
| beforeMount | onBeforeMount |
| mounted | onMounted |
| beforeUpdate | onBeforeUpdate |
| updated | onUpdated |
| beforeDestroy | onBeforeUnmount |
| destroyed | onUnmounted |
| errorCaptured | onErrorCaptured |
Vue3.0 在 Composition API 中另外加了两个钩子,分别是 onRenderTracked 和 onRenderTriggered,两个钩子函数都接收一个 DebuggerEvent :
export default {
onRenderTriggered(e) {
debugger
// 检查哪个依赖性导致组件重新渲染
},
}
Vue 3 来了,我们要做些什么?
前面我也开玩笑的讲了三条,要么装不知道,要么赶紧学,而已经学习了 Vue 3 的朋友可以用到自己的项目中,对项目进行优化和升级。这样,在年终总结就可以加上最重要的一条:带领团队成员完成了项目的重构,包括逻辑重构 + 语法升级,全面适配 Vue 3!打包效率提升xx倍!页面响应速度提升 xx!
不仅仅如此,对于学生党或者还在找工作的同学来说,可能在准备面试时又需要多准备一些内容了,冲冲冲!
最后,我想了想我能够做些什么,首先装鸵鸟是不行的,然后不学习也是不行的,因为我上半年的时候写了一个 Vue 的商城项目并开源到 GitHub 网站上,页面效果如下所示:

newbee-mall 在 GitHub 和国内的码云都创建了代码仓库,如果有人访问 GitHub 比较慢的话,建议在 Gitee 上查看该项目,两个仓库会保持同步更新。
- newbee-mall in GitHub : https://github.com/newbee-ltd/newbee-mall-vue-app
- newbee-mall in Gitee : https://gitee.com/newbee-ltd/newbee-mall-vue-app
通过预览图,大家应该也可以看得出来,这不是一个基础的 demo,而是一个功能较为完善的 Vue.js 商城实战系统。自开源到现在,也有很多朋友找我,问我会不会适配 Vue3 并对项目源码进行修改。

这里,大家可以放心,我一直都回答会升级到 Vue3,并且代码依然全部开源,希望大家都去点个 star,你们越热情,我也会更有动力去重构项目到 Vue3 版本!所以,对我个人来说,其实一直在等着 Vue.js 3.0 版本的正式发布,之后我会抽时间把这个 Vue.js 实战商城项目用 Vue3 再写一下。大家可以给新蜂商城项目点个 star,star 数量越多,我也越有精神头儿去更新,哈哈哈哈哈。

这样,大家就有了 Vue3 的实战经验啦!
除注明转载/出处外,皆为作者原创,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
Vue 3.0 来了,我们该做些什么?的更多相关文章
- 使用 Vue 2.0 实现服务端渲染的 HackerNews
Vue 2.0 支持服务端渲染 (SSR),并且是流式的,可以做组件级的缓存,这使得极速渲染成为可能.同时, 和 2.0 也都能够配合 SSR 提供同构路由和客户端 state hydration.v ...
- Vue.js2.0从入门到放弃---入门实例
最近,vue.js越来越火.在这样的大浪潮下,我也开始进入vue的学习行列中,在网上也搜了很多教程,按着教程来做,也总会出现这样那样的问题(坑啊,由于网上那些教程都是Vue.js 1.x版本的,现在用 ...
- Vue 2.0初学后个人总结及分享
摘要:最近在上海找工作,发现Vue前景还不错,于是就打算先学习一下(之前了解过,但是一直没提到日程上)这篇随笔当是为了自己学习之后,做一个小的阶段性总结.希望本文的内容对于刚开始接触vue的朋友们有点 ...
- 简单vue项目脚手架(vue+webpack2.0+vuex+vue-router)
github地址 使用技术栈 webpack(^2.6.1) webpack-dev-server(^2.4.5) vue(^2.3.3) vuex(^2.3.1) vue-router(^2.5.3 ...
- Vue 2.0基础语法:系统指令
本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. Vue初体验 新建一个空的项目,引入vue.js文件.写如下代码: &l ...
- vue 2.0 路由切换以及组件缓存源代码重点难点分析
摘要 关于vue 2.0源代码分析,已经有不少文档分析功能代码段比如watcher,history,vnode等,但没有一个是分析重点难点的,没有一个是分析大命题的,比如执行router.push之后 ...
- 转-Vue.js2.0从入门到放弃---入门实例(一)
http://blog.csdn.net/u013182762/article/details/53021374 标签: Vue.jsVue.js 2.0Vue.js入门实例Vue.js 2.0教程 ...
- Vue 2.0的学习笔记:Vue的过滤器
转自: https://www.w3cplus.com/vue/how-to-create-filters-in-vuejs.html 过滤器的介绍 1.在Vue中使用过滤器(Filters)来渲染数 ...
- [译] 尤雨溪:Vue 3.0 计划
[译] 尤雨溪:Vue 3.0 计划 原文:Plans for the Next Iteration of Vue.js作者:Evan You 发表时间:Sep 30, 2018译者:西楼听雨 发表时 ...
随机推荐
- Redis高可用集群搭建
绪论 redis集群需要至少要三个master节点,下面将搭建三个master节点,并且给每个master再搭建一个slave节点,总共6个redis节点,这里用三台机器部署6个redis实例,每台机 ...
- 文章目录&友情链接
文章目录&友情链接 1:<公告:本博客开始写博文了> 2.本人网络图书馆
- hdu.2042 超级楼梯
这种递归来写,除了递归我也想不到怎么写了 AC代码: #include<iostream>using namespace std;int x[41];//打表,不打表我不用想就知道过不了, ...
- html的鼠标双击,单击,移上,离开,事件捕捉,JavaScript
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 操作系统-文件系统(5)Linux文件系统管理
主流分区机制有MBR和GPT两种 MBR分区:第一个扇区最重要,里面有:引导代码(Bootstrap code area)及分区表(partition table), 其中Bootstrap code ...
- 微众银行FATE联邦学习框架
参考:https://github.com/webankfintech/fate https://www.fedai.org/#/ 一.Docker Standalone 安装 FATE $ sh b ...
- 第5章 if 语句
第5章 if 语句 5.1 一个简单示例 cars = ['audi', 'bmw', 'subaru', 'toyota'] for car in cars: if car == 'bmw': pr ...
- 安装openssl后yum不能使用的解决办法
重新编译安装ioenssl后,发现yum命令不能使用,找到如下解决办法 提示错误是 openssl: /usr/lib/x86_64-linux-gnu/libssl.so.1.1: version ...
- Mysql 5.6创建新用户并授权指定数据库相应权限
一.环境 Centos 6.9 Mysql 5.6.40 二.步骤 1.使用root用户登陆mysql mysql -uroot -p 输入密码: 2.创建新用户 CREATE USER 'user' ...
- 挂载磁盘不成功显示mount: /mnt: wrong fs type, bad option, bad superblock..............
[23:25:32 root@8 ~]#mount /dev/sdb2 /mntmount: /mnt: wrong fs type, bad option, bad superblock on /d ...