vue保姆级教程----深入了解 Vue3与Vue2的区别对比
📢 C语言专栏:想学C语言的,冲
📢?VUE专栏:想学VUE的,冲这里
📢?CSS专栏:想学CSS的,冲这里
📢 Krpano专栏:想学VUE的,冲这里
🔔 上述专栏,都在不定期持续更新中!!!!!!!!!!!!!
目录
?
? 前言
????????Vue作为当下最热门的前端框架之一,经历过从Vue 1.x到2.x的迭代更新,在2020年9月正式发布了Vue 3的正式版本。Vue3在性能优化、新增特性等各个方面进行了全面的改进。那么Vue3与Vue2在语法和功能上又有哪些区别呢?本文将全面对比两者的不同之处,帮助大家更好地从Vue2迁移到Vue3。
一、性能提升
1、编译优化:Vue3对编译器进行了优化,使得打包大小减少41%。
- 使用标记模板的方式取代虚拟DOM,减少了内存占用。
- 修复了Vue2存在的编译模板时过程中重复生成代码的问题。
- 对AST树进行了标记和静态提升,使得编译过程更高效。
举例来说,下面的Vue2代码:
<template>
<div>{{message}}</div>
</template>
<script>
export default {
data() {
return {
message: 'Hello'
}
}
}
</script>
在Vue2中编译时会生成如下render函数:
with(this){
return _c('div',[_v(_s(message))])
}
?而在Vue3中,同样的模板会编译成:
return {
render() {
return _c('div',{
message: ctx.message
})
}
}
这样就避免了无谓的代理操作,提升了性能。?
2、代理:Vue3中的代理可以自动批量代理对象中的所有属性,无需一个一个声明。
3、模板编译优化:引入块级作用域,模板中的变量不会互相污染。
Vue3中的模板编译支持块级作用域,这样模板中的变量就不会互相污染了。
例如在Vue2中,父组件和子组件中使用相同的变量名会互相影响:
// 父组件
<template>
<div>{{message}}</div>
<child-component></child-component>
</template>
// 子组件
<template>
<div>{{message}}</div>
</template>
但在Vue3中,引入了块级作用域,不存在这个问题:
// 父组件
<template>
<div>{{message}}</div>
<child-component></child-component>
</template>
// 子组件
<template>
<div>{{message}}</div> // 不受父组件的影响
</template>
4、源码采用TS重写,运行更高效。Vue3使用TypeScript重写源码,类型检查更严谨,编码时也能获得更好的提示。同时TS运行效率也比纯JavaScript要高,对性能有提升作用。
二、组合式API
Vue3提供了setup方法,我们可以更灵活地组合逻辑代码,不再受以前data、methods等选项的限制。
// Vue2
export default {
data() {
return {
message: 'Hello Vue2'
}
},
methods: {
onClick() {
console.log(this.message)
}
}
}
// Vue3
import {ref, onMounted} from 'vue'
export default {
setup() {
const message = ref('Hello Vue3')
onMounted(() => {
console.log(message.value)
})
return {
message
}
}
}
三、新增特性
- Fragment:文档碎片,不再要求组件根节点是单个元素。
<!-- Vue2需使用一个根节点 --> <template> <div> <header></header> <main></main> <footer></footer> </div> </template> <!-- Vue3可以不使用根节点 --> <template> <header></header> <main></main> <footer></footer> </template>
- Teleport:瞬移组件根节点到指定DOM位置。
<teleport to="#modal"> <div>弹窗内容</div> </teleport>
- Suspense:支持异步组件加载时显示加载界面。
<suspense> <async-component></async-component> <template #fallback> 加载中... </template> </suspense>
四、移除过滤器
过滤器已不被官方推荐,Vue3中移除了过滤器这个概念。
Vue2中我们可以通过过滤器改变数据的展示:
<!-- 在双括号插值中 -->
<div>{{ message | capitalize }}</div>
<!-- 在 `v-bind` 中 -->
<div v-bind:id="rawId | formatId"></div>
// 定义过滤器
filters: {
capitalize: function (value) {
if (!value) return ''
value = value.toString()
return value.charAt(0).toUpperCase() + value.slice(1)
}
}
但在Vue3中,过滤器被完全移除了。官方推荐通过方法调用或计算属性去实现数据变换。?
五、移除事件API
Vue3移除了$on、$off、$once方法,改为使用emits属性。
Vue2中我们通过$on,$off,$once管理事件:
// 监听事件
this.$on('test', handle)
// 取消监听
this.$off('test', handle)
// 监听一次
this.$once('test', handle)
Vue3中推荐使用emits属性替代这些事件API:
emits: ['test']
六、新增Composition API
Vue3全新提供了一套更适合功能开发的Composition API 如ref、reactive等,我们可以更灵活地组织组件的逻辑。
例如ref实现响应式数据:
import {ref} from 'vue'
const counter = ref(0)
reactive转换对象为响应式:
import {reactive} from 'vue'
const state = reactive({
count: 0
})
?computed实现计算属性等,这套API给了我们更多可能性。
七、tree-shaking支持
Vue3支持tree-shaking,也就是打包时只打包实际用到的代码,减少了打包产物体积。
八、调整部分API命名
一些API做了重命名,语义更加明确,例如:
- $listeners 改为 emits
- $attrs 改为 expose
九、新的全局API
Vue3提供了一些新的全局API:
- createApp:用于创建Vue实例
import {createApp} from 'vue' const app = createApp(App)
- defineComponent: 定义组件
import {defineComponent} from 'vue' const Component = defineComponent({})
- defineAsyncComponent:定义异步组件
- nextTick:在下次DOM更新循环结束之后执行延迟回调
- h:创建虚拟节点
import {h} from 'vue' // 在render函数中: return h('div', {}, [ h('span', {}, 'VNode') ])
十、新的组件实现方式
Vue3推荐使用组合式API来实现组件逻辑,我们可以使用setup函数并返回响应式状态:
// MyComponent.vue
import {ref, reactive} from 'vue'
export default {
setup() {
const message = ref('Hello')
const state = reactive({
name: 'John'
})
return {
message,
state
}
}
}
这样使组件逻辑更清晰,也方便测试。
十一、其他改变
- 使用事件名而不是事件处理函数重命名 v-on
- 移除 .sync 修饰符,改为 v-model
- 优化 slots 语法,移除 v-slot:xxx 的写法
? 结语
????????通过上文的对比,我们可以看出Vue3在编译优化、组合式API等方面进行了较大的改进,为开发者提供了更好的性能和更灵活的功能。一些API调用和语法也进行了调整,更贴合实际使用需求。
????????总的来说,Vue3是一个重要的更新,值得每一位Vue开发者认真学习和使用。但从Vue2到Vue3的迁移也需要一定的时间成本投入,需要我们审慎评估后再进行过渡。本文对两者之间的区别进行了全面梳理,希望可以帮助大家更顺利地上手Vue3的新特性,并根据项目实际需求进行更新迁移。
? ? ? ? 我们改日再会
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!