首页 前端知识 Vue2和Vue3的区别

Vue2和Vue3的区别

2024-11-04 09:11:33 前端知识 前端哥 684 410 我要收藏

一、背景:什么是Vue?

Vue是一个渐进式JavaScript框架,它提供了一套声明式、组件化的编程模型

二、Vue2和Vue3的区别

1、vue3支持碎片化

vue2:<template></template>中必须只有一个根标签

vue3:<template></template>中Fragments 使组件可以有多个根标签,会默认把这些标签包裹在一个虚拟标签中,减少内存占用

2、组合式API和选项式API

vue结构特点
组合式APIvue3将一个功能的所有代码集中起来处理对复杂组件更易于维护和理解
选项式APIvue2使用特定的选项对象(如 datamethodscomputedwatch 等)来组织组件逻辑,每个选项负责一种特定的功能对于简单组件,易于理解和使用;但组件变得复杂时,相关逻辑分散在不同的选项中,难以维护

3、生命周期

vue2vue3
beforeCreate/createdsetup
beforeMountonBeforeMount
mountedonMounted
beforeUpdateonBeforeUpdate
updatedonUpdated
beforeUnmountonBeforeUnmount
unmountedonUnmounted

4、TypeScript 支持

Vue 2:虽然可以使用 TypeScript,但支持不够完善,类型推断和类型检查较弱。

Vue 3:从设计之初就考虑了 TypeScript,提供了更好的类型推断,允许更安全的开发体验。

5、响应式原理

特征Vue 2Vue 3
响应式实现

使用 Object.defineProperty方法来定义对象的 getter 和 setter,以实现数据的响应式;

当数据被访问时,getter 被调用,Vue 会记录依赖(即哪些组件使用了这个数据);

当数据被修改时,setter 被调用,Vue 会通知所有依赖该数据的组件进行更新

使用 Proxy,允许对整个对象进行代理,而不是逐个属性定义 getter 和 setter。

Proxy 可以拦截对象的各种操作(如属性读取、修改、添加、删除等),从而实现更全面的响应式。

新属性支持不支持,需要使用 Vue.set支持,直接添加新属性自动响应
数组索引支持不支持,需使用 splice 或 Vue.set支持,数组操作均可触发更新
性能性能开销较大,尤其在大规模应用中性能更佳,响应式开销更低
依赖追踪依赖追踪机制较简单更复杂的依赖追踪机制
复杂性简单但功能有限更复杂,但更灵活和强大

6、状态管理

vue2:使用Vuex,通过 stategettersmutations 和 actions 组织,采用单一的全局状态树,所有状态集中在一个地方,便于管理和调试

const store = new Vuex.Store({
    state: {
        count: 0
    },
    mutations: {  必须通过这里,确保状态的可追踪性
        increment(state) {
            state.count++;
        }
    },
    actions: {
        incrementAsync({ commit }) {
            setTimeout(() => {
                commit('increment');
            }, 1000);
        }
    },
    getters: {
        doubleCount(state) {
            return state.count * 2;
        }
    }
});

vue3:使用Pinia,允许多个 store 模块,支持模块化的状态管理,更加灵活

import { defineStore } from 'pinia';

export const useMainStore = defineStore('main', {
    state: () => ({
        count: 0
    }),
    actions: {
        increment() {
            this.count++;
        }
    },
    getters: {
        doubleCount: (state) => state.count * 2
    }
});

7、创建Vue实例

vue2:创建 Vue 实例是通过 new Vue() 构造函数来实现的,通常是在 main.js 文件中直接创建应用实例,并将路由和状态管理作为选项传入

vue3:使用 createApp 函数来创建应用实例,这使得创建过程更加清晰。路由和状态管理通过 use 方法进行插件注册

8、路由管理

vue2:路由通过 VueRouter 插件进行管理,并在 Vue 实例中进行注册

vue3:仍然使用 Vue Router 进行路由管理,但通过 createRouter 函数来创建路由实例,API 更加现代化

9、vue3中的Teleport

定义:eleport 是一个新的内置组件,允许将其子组件渲染到 DOM 的其他位置,而不是其父组件的结构中。这个功能在处理模态框、提示框、上下文菜单等场景中非常有用

用法:

<template>
  <div>
    <h1>主组件</h1>
    <button @click="showModal = true">显示模态框</button>

    <Teleport to="#modal">
      <div v-if="showModal" class="modal">
        <p>这是一个模态框!</p>
        <button @click="showModal = false">关闭</button>
      </div>
    </Teleport>

    <div id="modal"></div> <!-- 模态框会渲染到这里 -->
  </div>
</template>

<script>
import { ref } from 'vue';

export default {
  setup() {
    const showModal = ref(false); // 使用 ref 创建响应式状态

    return {
      showModal // 返回响应式状态,以便在模板中使用
    };
  }
};
</script>

<style>
.modal {
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  background: white;
  padding: 20px;
  border: 1px solid #ccc;
}
</style>

10、性能优化

vue2:性能较好,但在大型应用中,当数据变化频繁时可能出现性能瓶颈

vue3:引入了虚拟 DOM 的优化,减少了不必要的渲染;使用编译时优化,生成更小的代码,提高了运行时性能

三、总结

Vue 3 在多个方面进行了显著的改进,增强了性能、灵活性和可维护性,特别是在响应式系统、API 设计和 TypeScript 支持等方面。这些改进使得 Vue 3 更加灵活、强大,适合现代 Web 应用的需求。

转载请注明出处或者链接地址:https://www.qianduange.cn//article/19904.html
标签
评论
发布的文章
大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!