Vue 2.x 项目升级到 Vue 3详细指南【修改清单】

news2024/9/20 0:52:22

文章目录

  • 前言
  • 0.迁移过程
    • 1. 安装 Vue 3
    • 2. 逐一处理迁移中的警告
    • 3. 迁移全局和内部 API
    • 4. 迁移 Vue Router 和 Vuex
    • 5. 处理其他的不兼容变更
  • 1. Vue3特性
    • 1. Composition API
    • 2. 更好的性能
    • 3. 更好的 TypeScript 支持
    • 4. 多个根元素
    • 5. Suspense 组件
    • 6. Teleport 组件
    • 7. 全局 API 的改变
    • 8. 自定义渲染器 API
  • 2.修改清单
    • 1.模板指令
    • 2. v-model
    • 3. key 使用改变
    • 4. **v-if 与 v-for 优先级
    • 5. v-bind 合并行为
    • 6. **v-on.native 移除**:
    • 8. 函数式组件
    • 9. **异步组件**:
    • 10. **emits 选项**:
    • 11. **渲染函数**:
    • 12. **移除的 APIs**:
    • 13. **按键修饰符**:
    • 14. **事件 API**:
    • 15. **过滤器**:
    • 16. **内联模板**:
    • 17. **$children**:
    • 18. **propsData 选项**:
    • 19. **Attribute 强制行为**:
    • 20. **自定义指令**:
    • 21. **Data 选项**:
    • 22. **Mount API 的改变**:
    • 23. **Props 的默认函数访问 this**:
    • 24. **Transition class 名更改**:
    • 25. **Transition 作为根节点**:
    • 26. **TransitionGroup 根元素**:
    • 27. **VNode 生命周期事件**:
    • 28. **Watch 侦听数组**:
  • 参考资料

前言

背景:有同学说我上一篇《Vue 2.x 项目升级到 Vue 3详细指南【总结版】》看的太费劲,让我直接整理一篇Vue2.x 升级到 vue3 的修改清单,所以整理了此文章。

Vue 3.0 已经发布,很多人可能都在疑惑如何将自己的 Vue 2.x 项目升级到 Vue 3.0。这篇文章将详细地介绍这个过程。它引入了许多新特性和改进,包括更好的性能、更小的包大小、更好的 TypeScript 支持,以及新的 API,如 Composition API。

从 Vue 2.x 升级到 Vue 3 并不是一个简单的任务,因为 Vue 3 引入了一些重大的不兼容变更。这些变更可能会影响你的应用的行为,或者需要你修改你的代码以适应新的 API。

在开始升级之前,我建议你先备份你的项目,或者使用版本控制系统,如Git,以便在需要时可以轻松地回滚到旧版本。此外,你应该确保你的项目的所有依赖项都已经支持 Vue 3,或者至少有可用的替代方案。

现在,让我们开始升级你的 Vue 2.x 项目到 Vue 3 吧!go go

0.迁移过程

1. 安装 Vue 3

首先,你需要安装 Vue 3 到你的项目。你可以通过 npm 或 yarn 来进行安装:

npm install vue@next
# 或者
yarn add vue@next

2. 逐一处理迁移中的警告

Vue 3 在兼容性构建中为大部分的有破坏性的改动提供了运行时警告。在你完成初始升级之后,你可以根据运行时控制台中的警告提示逐一处理新代码中的问题。

3. 迁移全局和内部 API

Vue 3 的全局 API 发生了一些改变,如Vue.prototype 被改为 config.globalProperties,Vue.mixin() 现在只适用在应用的根组件,而非全局。这些全局 API 的改变都需要在迁移时被处理和修改。

4. 迁移 Vue Router 和 Vuex

Vue Router 和 Vuex 在 Vue 3 中也有一些改变。你需要安装 vue-router@4 和 vuex@next 并根据相应文档进行迁移。

5. 处理其他的不兼容变更

Vue 3 有一些其他的不兼容变更,如新的生命周期函数名称、更改的事件行为、移除的 filters 等。你需要查阅迁移指南,了解如何处理这些不兼容变更。

在这里插入图片描述

1. Vue3特性

在说升级之前 我们先来了解一下。Vue 3 引入了许多新特性和改进,以下是一些主要的亮点:

1. Composition API

这是 Vue 3 的一项主要新特性,它提供了一种新的方式来组织和复用代码。与 Vue 2 的 Options API 相比,Composition API 提供了更好的类型推断,使得 Vue 更易于与 TypeScript 一起使用。

import { ref, computed } from 'vue';

export default {
  setup() {
    const count = ref(0);
    const increment = () => { count.value++ };
    const decrement = () => { count.value-- };
    const isEven = computed(() => count.value % 2 === 0);

    return {
      count,
      increment,
      decrement,
      isEven
    };
  }
};

2. 更好的性能

Vue 3 的虚拟 DOM 重写和优化,使得渲染速度比 Vue 2 快约 1.3 到 2 倍。此外,Vue 3 的包大小比 Vue 2 小约 10%。

3. 更好的 TypeScript 支持

Vue 3 的源代码完全用 TypeScript 重写,这使得 Vue 3 与 TypeScript 的集成更加紧密,提供了更好的类型推断和编辑器支持。

4. 多个根元素

vue 3 允许在单文件组件中使用多个根元素,这使得组件的结构更加灵活。

<template>
  <header>...</header>
  <main>...</main>
  <footer>...</footer>
</template>

5. Suspense 组件

Vue 3 引入了新的 Suspense 组件,用于处理异步组件的加载状态。这使得你可以在异步组件加载完成之前显示一个加载指示器,或者在加载失败时显示一个错误消息。

<Suspense>
  <template #default>
    <AsyncComponent />
  </template>
  <template #fallback>
    <div>Loading...</div>
  </template>
</Suspense>

6. Teleport 组件

Vue 3 引入了新的 Teleport 组件,用于将子组件渲染到 DOM 树的其他位置。这对于实现模态对话框、通知、弹出菜单等功能非常有用。

<Teleport to="#modal-container">
  <div class="modal">...</div>
</Teleport>

7. 全局 API 的改变

Vue 3 对全局 API 进行了重大的改变,以使其更加模块化和树摇优化友好。例如,Vue.componentVue.directive 等全局 API 在 Vue 3 中被移除,取而代之的是 app.componentapp.directive 等实例方法。

8. 自定义渲染器 API

Vue 3 提供了一个新的自定义渲染器 API,使得你可以创建自己的渲染器,例如用于创建原生移动应用的渲染器。

2.修改清单

我们需要按照以下方式将项目中使用到地方进行修改。以进行适配。

1.模板指令

Vue 3 对多个模板指令进行了更新,包括 v-modelv-if/v-forv-bind 等。这意味着这些指令的行为可能与 Vue 2 不同,你需要检查你的代码以确保它们与新的行为保持一致。

2. v-model

在 Vue 3 中,v-model 的行为和语法发生了变化。现在,你需要使用 v-model:[argument]="data" 的形式来绑定数据,而不是 Vue 2 中的 v-model="data"

<!-- Vue 2 -->
<input v-model="message" />

<!-- Vue 3 -->
<input v-model:value="message" />

3. key 使用改变

在 Vue 3 中,key 的使用方式发生了变化。现在,v-for 中的 key 是必须的。这意味着你需要在所有的 v-for 指令中添加 key

<!-- Vue 2 -->
<div v-for="item in items">
  {{ item }}
</div>

<!-- Vue 3 -->
<div v-for="item in items" :key="item.id">
  {{ item }}
</div>

4. **v-if 与 v-for 优先级

在 Vue 3 中,v-ifv-for 在同一个元素上的优先级发生了变化。现在,v-if 的优先级高于 v-for。这意味着如果你在同一个元素上使用了这两个指令,你需要确保它们的使用是正确的。

<!-- Vue 2 -->
<div v-for="item in items" v-if="item.isActive">
  {{ item }}
</div>

<!-- Vue 3 -->
<div v-for="item in items" :key="item.id">
  <div v-if="item.isActive">
    {{ item }}
  </div>
</div>

5. v-bind 合并行为

Vue 3 改变了 v-bind 的合并行为。在 Vue 2 中,如果你有多个 v-bind,它们会被合并。但在 Vue 3 中,后面的 v-bind 会覆盖前面的。

<!-- Vue 2 -->
<div v-bind="{ id: 'foo' }" v-bind="{ id: 'bar' }"></div> <!-- id is 'foo' -->

<!-- Vue 3 -->
<div v-bind="{ id: 'foo' }" v-bind="{ id: 'bar' }"></div> <!-- id is 'bar' -->

6. v-on.native 移除:

Vue 3 移除了 v-on.native 修饰符。你需要更新你的代码,移除所有的 .native 修饰符,并使用新的 emits 选项。

<!-- Vue 2 -->
<my-component @click.native="doSomething"></my-component>

<!-- Vue 3 -->
<my-component @click="doSomething"></my-component>

8. 函数式组件

Vue 3 更改了函数式组件的写法,不再需要 functional 关键词。你需要更新你的函数式组件以适应新的写法。

  <!-- Vue 2 -->
  Vue.component('my-component', {
    functional: true,
    // ...
  })

  <!-- Vue 3 -->
  const MyComponent = (props, { slots }) => {
    // ...
  }

9. 异步组件:

Vue 3 改变了异步组件的语法。你需要将你的异步组件语法更新为新的语法。

<!-- Vue 2 -->
Vue.component('my-component', () => import('./MyComponent.vue'))

<!-- Vue 3 -->
const MyComponent = defineAsyncComponent(() => import('./MyComponent.vue'))

10. emits 选项:

Vue 3 添加了全新的 emits 选项,用于定义组件发出的事件。你需要在你的组件中添加 emits 选项。

<!-- Vue 3 -->
export default {
  emits: ['my-event'],
  methods: {
    doSomething() {
      this.$emit('my-event')
    }
  }
}

11. 渲染函数:

Vue 3 的渲染函数 API 有所改变。你需要更新你的渲染函数以适应新的 API。

   <!-- Vue 2 -->
   Vue.component('my-component', {
     render: function (createElement) {
       return createElement('div', this.$slots.default)
     }
   })

   <!-- Vue 3 -->
   const MyComponent = {
     render() {
       return h('div', this.$slots.default())
     }
   }

12. 移除的 APIs:

Vue 3 移除了一些不再需要的 APIs,例如 Vue.setVue.deleteVue.observable。这些API在Vue.js 2.x中用于添加响应式属性到对象或删除属性,Vue 3中的响应式系统使用 Proxy,所以这些API不再需要。

// Vue 2
Vue.set(object, propertyName, value);
Vue.delete(object, propertyName);
Vue.observable(object);

// Vue 3
// 整个对象都是响应式的,不需要特定的API

13. 按键修饰符:

Vue 3 不再支持按键修饰符的别名,例如 @keyup.enter@keyup.space 等。你需要将这些修饰符替换为它们的键码。

<!-- Vue 2 -->
<input @keyup.enter="submit">

<!-- Vue 3 -->
<input @keyup.13="submit">

14. 事件 API:

Vue 3 的事件 API 有所改变,例如 $on$off$once 已被移除。你需要使用新的事件 API。

// Vue 2
this.$on('event', handler);
this.$off('event', handler);
this.$once('event', handler);

// Vue 3
// 使用事件发射器如mitt或tiny-emitter

15. 过滤器:

Vue 3 不再支持过滤器。你需要将过滤器替换为计算属性或者方法。

<!-- Vue 2 -->
{{ message | filterA | filterB }}

<!-- Vue 3 -->
{{ filterB(filterA(message)) }}

16. 内联模板:

Vue 3 不再支持内联模板。你需要将内联模板替换为 render 函数或者 template

<!-- Vue 2 -->
<my-component inline-template>
  <div>{{ message }}</div>
</my-component>

<!-- Vue 3 -->
<my-component>
  <template #default="{ message }">
    <div>{{ message }}</div>
  </template>
</my-component>

17. $children:

Vue 3 不再支持 $children。你需要找到其他方式来访问子组件。要访问子组件,可以使用 refprovide/inject

<!-- Vue 2 -->
this.$children;

<!-- Vue 3 -->
// 使用 ref 或 provide/inject 访问子组件

18. propsData 选项:

Vue 3 不再支持 propsData 选项。你需要在创建组件实例时直接传递 props

// Vue 2
new Vue({
  propsData: {
    prop: value,
  },
});

// Vue 3
createApp({
  props: {
    prop: value,
  },
});

19. Attribute 强制行为:

Vue 3 现在默认将未声明的 attribute 视为 DOM attribute。如果你需要强制 attribute 来响应化,你需要使用 v-bind

<!-- Vue 2 -->
<my-component my-attr="value" />

<!-- Vue 3 -->
<my-component v-bind="{ 'my-attr': 'value' }" />

20. 自定义指令:

Vue 3 的自定义指令 API 有所改变。你需要更新你的自定义指令以适应新的 API。

// Vue 2
Vue.directive('my-directive', {
  bind(el, binding, vnode, oldVnode) { /* ... */ },
  update(el, binding, vnode, oldVnode) { /* ... */ },
});

// Vue 3
const myDirective = {
  beforeMount(el, binding, vnode, prevVnode) { /* ... */ },
  updated(el, binding, vnode, prevVnode) { /* ... */ },
};

21. Data 选项:

Vue 3 的 data 选项必须是一个函数。你需要将所有的 data 选项转换为函数。

   // Vue 2
   new Vue({
     data: {
       message: 'Hello Vue!',
     },
   });

   // Vue 3
   createApp({
     data() {
       return {
         message: 'Hello Vue!',
       };
     },
   });

22. Mount API 的改变:

Vue 3 的 mount API 有所改变。你需要更新你的 mount 调用以适应新的 API。

   // Vue 2
   new Vue({
     /* options */
   }).$mount('#app');

   // Vue 3
   createApp({
     /* options */
   }).mount('#app');

23. Props 的默认函数访问 this:

Vue 3 不再允许在 props 的默认函数中访问 this。你需要找到其他方式来获取需要的数据。

   // Vue 2
   props: {
     prop: {
       default: function () {
         return this.someData;
       },
     },
   };

   // Vue 3
   props: {
     prop: {
       default() {
         // "this" 是 undefined
       },
     },
   };

24. Transition class 名更改:

Vue 3 更改了 transition 的 class 名称,为了与 CSS 动画一致,v-enter 改为了 v-enter-fromv-leave 改为了 v-leave-from

   /* Vue 2 */
   .fade-enter, .fade-leave-to {
     opacity: 0;
   }

   /* Vue 3 */
   .fade-enter-from, .fade-leave-to {
     opacity: 0;
   }

25. Transition 作为根节点:

Vue 3 不再允许 transition 作为根节点。你需要确保你的组件有一个非 transition 的根节点。

   <!-- Vue 2 -->
   <transition>
     <div>...</div>
   </transition>

   <!-- Vue 3 -->
   <!-- transition 不能作为根节点 -->
   <div>
     <transition>
       <div>...</div>
     </transition>
   </div>

26. TransitionGroup 根元素:

Vue 3 的 TransitionGroup 不再渲染一个默认的根元素。你需要手动添加一个根元素。

   <!-- Vue 2 -->
   <transition-group>
     <div v-for="item in items" :key="item.id">{{ item }}</div>
   </transition-group>

   <!-- Vue 3 -->
   <transition-group>
     <div>
       <div v-for="item in items" :key="item.id">{{ item }}</div>
     </div>
   </transition-group>

27. VNode 生命周期事件:

Vue 3 的 VNode 生命周期事件有所改变。你需要更新你的代码以适应新的事件。

   // Vue 2
   vnode.context.$on('hook:updated', handler);

   // Vue 3
   onUpdated(handler);

28. Watch 侦听数组:

Vue 3 的 watch 对于数组的行为有所改变。你需要更新你的 watch 调用以适应新的行为。

   // Vue 2
   watch(() => [...array], handler);

   // Vue 3
   watch(() => array, handler, { deep: true });

参考资料

  1. Vue 3 Migration Guide - Vue 官方提供的迁移指南,详细介绍了从 Vue 2 到 Vue 3 的各种改变和升级策略。

  2. Vue 3 Upgrade Guide - 这篇博客文章详细介绍了 Vue 2 到 Vue 3 的升级过程,包括实践技巧和遇到的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/910077.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python 打印人口分布金字塔图

背景 今天介绍一个不使用 matplot&#xff0c;通过DebugInfo模块打印人口金字塔图的方法。 引入模块 pip install DebugInfo打印人口金字塔图 下面的代码构建了两个人口数据&#xff08;仅做功能演示&#xff0c;不承诺任何参考价值&#xff09;&#xff0c;男性人口和女性…

基础论文学习(4)——CLIP

《Learning Transferable Visual Models From Natural Language Supervision》 CLIP的英文全称是Contrastive Language-Image Pre-training&#xff0c;即一种基于对比文本-图像对的预训练模型。CLIP是一种基于对比学习的多模态模型&#xff0c;与CV中的一些对比学习方法如moc…

软考高级架构师下篇-12层次式架构设计理论与实践

目录 1. 考情分析2. 层次式体系结构概述3. 表现层框架设计4. 中间层框架设计5. 数据访问层设计6. 数据架构规划与设计7. 物联网层次架构设计7. 前文回顾1. 考情分析 根据考试大纲,层次式架构设计理论与实践知识点会涉及单选题型(约占2~5分)和案例题(25分),本小时内容偏重于方…

lesson9: C++多线程

1.线程库 1.1 thread类的简单介绍 C11 中引入了对 线程的支持 了&#xff0c;使得 C 在 并行编程时 不需要依赖第三方库 而且在原子操作中还引入了 原子类 的概念。要使用标准库中的线程&#xff0c;必须包含 < thread > 头文件 函数名 功能 thread() 构造一个线程对象…

LCD液晶屏接口静电浪涌保护用TVS/ESD二极管,如何选型?

LCD 液晶屏是Liquid Crystal Display 的简称&#xff0c;指将玻璃和LCD驱动器集成到一起的LCD显示产品&#xff0c;为用户提供了一个标准的LCD显示驱动接口&#xff0c;用户可以按照接口&#xff08;有4位、8位、VGA等不同类型&#xff09;要求进行操作来控制LCD正确显示。众所…

Fsm onehot

module top_module(input in,input [9:0] state,output [9:0] next_state,output out1,output out2);assign out1(state[8]|state[9])?1:0;assign out2(state[9]|state[7])?1:0;assign next_state[0](state[0]&(~in)) |(state[1]&(~in)) |(state[2]&(~in)) |(sta…

LVS+Keepalived 实验

Keepalived 是什么 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案&#xff0c;可以解决静态路由出现的单点故障问题的一款检查工具 在一个LVS服务集群中通常有主服务器&#xff08;MASTER&#xff09;和备份服务器&#xff08;BACKUP&#xff09;两种角色的服务器…

ShardingSphere01-docker环境安装

使用docker安装数据库是一个非常好的选择&#xff0c;后续的读写分离、数据分片等功能的数据库都是由docker创建。 一、安装准备 1、前提条件 Docker可以运行在Windows、Mac、CentOS、Ubuntu等操作系统上 Docker支持以下的CentOS版本&#xff1a; CentOS 7 (64-bit)CentOS …

LLM预训练大型语言模型Pre-training large language models

在上一个视频中&#xff0c;您被介绍到了生成性AI项目的生命周期。 如您所见&#xff0c;在您开始启动您的生成性AI应用的有趣部分之前&#xff0c;有几个步骤需要完成。一旦您确定了您的用例范围&#xff0c;并确定了您需要LLM在您的应用程序中的工作方式&#xff0c;您的下…

第59步 深度学习图像识别:误判病例分析(TensorFlow)

基于WIN10的64位系统演示 一、写在前面 本期内容对等于机器学习二分类系列的误判病例分析&#xff08;传送门&#xff09;。既然前面的数据可以这么分析&#xff0c;那么图形识别自然也可以。 本期以mobilenet_v2模型为例&#xff0c;因为它建模速度快。 同样&#xff0c;基…

Linux下Jenkins安装 (最新)

环境概述 随着软件开发需求及复杂度的不断提高&#xff0c;团队开发成员之间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题。Jenkins自动化部署可以解决集成、测试、部署等重复性的工作&#xff0c;工具集成的效率明显高于人工操作&#xff1b…

Android动画进阶指北

原文链接 Android Animation Advanced Tricks 前面的文章介绍了动画的基本使用方法&#xff0c;本文来聊一聊涉及到动画的高级技巧&#xff0c;以及一些非常优质的学习资源和动画三方库和框架。 页面之间的过渡动画 常规的动画都是针对某一页面上的某个元素做动画&#xff0c…

3、Spring_容器执行

容器执行点 1.整合 druid 连接池 添加依赖 <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version> </dependency>1.硬编码方式整合 新建德鲁伊配置 <?xml version"1.…

微信小程序 车牌号输入组件

概述 一个小组件&#xff0c;用于方便用户输入车牌号码 详细 概述 有时候我们开发过程中会遇到需要用户输入车牌号的情况&#xff0c;让客户通过自带键盘输入&#xff0c;体验不好且容易出错&#xff0c;例如车牌号是不能输入O和I的&#xff0c;因此需要有一个自定义的键盘…

FPGA中锁存器(latch)、触发器(flip-flop)以及寄存器(register)详解

文章目录 1 定义1.1 锁存器&#xff08;latch&#xff09;1.2 触发器&#xff08;flip-flop&#xff09;1.3 寄存器&#xff08;register&#xff09; 2 比较2.1 锁存器&#xff08;Latch&#xff09;危害即产生原因2.2 寄存器和锁存器的区别2.3 锁存器和触发器的区别 3 结构3.…

dvwa环境搭建

靶场搭建 环境作用apache网站代理&#xff0c;部署网站php一种开源通用脚本语言&#xff0c;用来处理程序mysql数据库&#xff0c;用来存储数据 1.打开sever 2008&#xff0c;远程桌面连接&#xff0c;将文件拷贝到虚拟机&#xff0c;打开微软常用集合运行库&#xff0c;等待…

「Vue|网页开发|前端开发」01 快速入门:用vue-cli快速写一个Vue的HelloWorld项目

本文主要介绍如何用vue开发的标准化工具vue-cli快速搭建一个符合实际业务项目结构的hello world网页项目并理解vue的代码文件结构以及页面渲染流程。 文章目录 一、准备工作&#xff1a;安装node.js二、项目搭建创建项目目录全局安装vue-cli使用Webpack初始化项目启动项目学会…

RedisDesktopManager 连接redis

redis查看是否启动成功 ps -ef | grep redis以上未启动成功 cd /usr/local/bin/ 切换根目录 sudo -i 开启服务端 ./redis-server /usr/local/redis/redis.conf 开启客户端 ./redis-cli

Ganache 本地测试网远程连接

文章目录 前言1. 安装Ganache2. 安装cpolar3. 创建公网地址4. 公网访问连接5. 固定公网地址 前言 Ganache 是DApp的测试网络&#xff0c;提供图形化界面&#xff0c;log日志等&#xff1b;智能合约部署时需要连接测试网络。 Ganache 是一个运行在本地测试的网络,通过结合cpol…

MySQL如何进行表之间的关联更新

在实际编程工作或运维实践中&#xff0c;对MySQL数据库表进行关联更新是一种比较常见的应用场景&#xff0c;比如在电商系统中&#xff0c;订单表里保存了商品名称的信息&#xff08;冗余字段设计&#xff09;&#xff0c;但如果商品名称发生变化&#xff0c;则需要通过关联商品…