想必 Vue3.0 发布这件事,你们都知道了。javascript
我也是从朋友圈的转发得知此事,博客平台、公众号、朋友圈基本都有这么一条新闻,可见 Vue3.0 的被期待程度,由于 React 16 发布的时候,我也没见你们这么追捧,让我有点震惊的是 Vue 有 130 万的使用者,这个体量真的是有点惊人。vue
Vue 3.0 来了,咱们该作些什么呢?java
让我总结的话,就只有两个比较重要的更新(我目前尚未完完整整的体验过新版本,有些地方可能不够完善,但愿你们多多包涵,后续会整理和分享一些实践的 demo)。react
一个是 Composition API,另外一个是对 TypeScript 的全面支持。git
团队还会出一个 Vue 2.7 的版本,给予 2.x 用户一些在 3.0 版本中被删除方法的警告,这有助于用户的平稳升级。
Nuxt3 好像还在路上,可是目前看来,市面上的各大组件库还没来得及针对 Vue3.0 进行改版升级。github
周边的插件如 Vue-Router、Vuex、VSCode 插件 Vetur 等都在有序的进行中。面试
来点阳间的知识,说点人话。api
下面以代码片断的形式为你们介绍一下 Vue3.0 做出了哪些新的变化,Vue2.x 对应一些 Vue3.0 的写法。浏览器
config 是一个包含 Vue 应用程序全局配置的对象。能够在挂载应用程序以前修改下面列出的属性。app
app.config.devtools = true
是否开启 vue-devtools 工具的检测,默认状况下开发环境是 true,生产环境下则为 false。
app.config.errorHandler = (err, vm, info) => { // info 为 Vue 在某个生命周期发生错误的信息 }
为组件渲染功能和观察程序期间的未捕获错误分配处理程序。
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 = () => {}
app.config.performance = true
将其设置为 true 可在浏览器 devtool 性能/时间线面板中启用组件初始化,编译,渲染和补丁性能跟踪。 仅在开发模式和支持 Performance.mark API的浏览器中工做。
全局改变的动做,都在 createApp 所建立的应用实例中,以下所示:
import { createApp } from 'vue' const app = createApp({})
那么 app 下这些属性:
import { createApp } from 'vue' const app = createApp({}) // 注册一个 options 对象 app.component('shisan-component', { /* ... */ }) // 检索注册的组件 const ShiSanComponent = app.component('shisan-component')
app.directive('my-directive', { // 挂载前 beforeMount() {}, // 挂载后 mounted() {}, // 更新前 beforeUpdate() {}, // 更新后 updated() {}, // 卸载前 beforeUnmount() {}, // 卸载后 unmounted() {} })
多数全局API都没变化,仍是老的 2.x 的写法居多。
Composition API解决了什么问题?
使用传统的 Vue2.x 配置方法写组件的时候问题,随着业务复杂度愈来愈高,代码量会不断的加大。因为相关业务的代码须要遵循option 的配置写到特定的区域,致使后续维护很是的复杂,同时代码可复用性不高,你经常会发现一个页面组件,写着写着就写到了三四百行去了。
有没有熟悉的感受?没错这就是老的模式带来的弊端,一直憋了这么久,也没谁了~~
而 Composition API 解决了这个使人头疼的问题。
它为咱们提供了几个函数,以下所示:
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 属性的值。
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 被称之为反作用,当即执行传入的一个函数,并响应式追踪其依赖,并在其依赖变动时从新运行该函数。
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 就存在了,只不过如今使用的形式变了一下,须要被计算的属性,经过上述形式返回。
toRefs 提供了一个方法能够把 reactive 的值处理为 ref,也就是将响应式的对象处理为普通对象。
与 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!打包效率提高xx倍!页面响应速度提高 xx!
不只仅如此,对于学生党或者还在找工做的同窗来讲,可能在准备面试时又须要多准备一些内容了,冲冲冲!
最后,我想了想我可以作些什么,首先装鸵鸟是不行的,而后不学习也是不行的,由于我上半年的时候写了一个 Vue 的商城项目并开源到 GitHub 网站上,页面效果以下所示:
newbee-mall 在 GitHub 和国内的码云都建立了代码仓库,若是有人访问 GitHub 比较慢的话,建议在 Gitee 上查看该项目,两个仓库会保持同步更新。
经过预览图,你们应该也能够看得出来,这不是一个基础的 demo,而是一个功能较为完善的 Vue.js 商城实战系统。自开源到如今,也有不少朋友找我,问我会不会适配 Vue3 并对项目源码进行修改。
这里,你们能够放心,我一直都回答会升级到 Vue3,而且代码依然所有开源,但愿你们都去点个 star,大家越热情,我也会更有动力去重构项目到 Vue3 版本!因此,对我我的来讲,其实一直在等着 Vue.js 3.0 版本的正式发布,以后我会抽时间把这个 Vue.js 实战商城项目用 Vue3 再写一下。你们能够给新蜂商城项目点个 star,star 数量越多,我也越有精神头儿去更新,哈哈哈哈哈。
这样,你们就有了 Vue3 的实战经验啦!
除注明转载/出处外,皆为做者原创,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文连接,不然保留追究法律责任的权利。