Vue2升级Vue3填坑笔记

news2024/11/16 7:39:06

在这里插入图片描述

背景

前段时间使用Vue2完成一个流量回放的前端开发,实现了流量回放的基本功能。开发过程中,发现现主流的插件都在适配Vue3,奈何为了赶进度,只能先用自己熟悉的Vue2先顶上。恰巧最近有些许空余时间,就把项目代码逐步变更Vue3了。过程中,顺便梳理了下遇到的差异,为后面做些许积累与经验参考。

差异处理

element常见差异:

  1. deleteset在vue3中不再使用,可以直接将对应的值设置为null

  2. router引入:

    • Vue2
      import Router from 'vue-router' 
      
    • Vue3
      import {createRouter, createWebHistory} from "vue-router"
      
  3. 使用router的history功能,需要添加属性, 指定路径

    import {createRouter, createWebHistory} from "vue-router";
    const router = createRouter({
      history: createWebHistory('/'),
      routes : []})
    export default router
    
  4. 从url中获取参数。在 Vue 2 中,$route 是一个全局属性,但在 Vue 3 中它已被弃用,取而代之的是 useRoute()

    • vue2
      this.recordId = this.$router.history.current.params.id
      
    • vue3
      import { useRoute } from 'vue-router';
      
      const route = useRoute();
      this.collectionId = route.params.id;
      console.log(`录制任务ID:${this.collectionId}`);
      
  5. 处理eslint声明后未使用的报错(vue3解决no-unused-vars报错),修改eslintConfig规则

    {     
        "eslintConfig": {
            "root": false,
            "env": {
                "node": true
            },
            "extends": [
                "plugin:vue/vue3-essential",
                "eslint:recommended"
            ],
            "parserOptions": {
                "parser": "@babel/eslint-parser"
            },
            "rules": {
                "no-unused-vars": [
                    "error",
                    {
                        "varsIgnorePattern": ".*",
                        "args": "none"
                    }
                ]
            }
        },
        "browserslist": [
            "> 1%",
            "last 2 versions",
            "not dead",
            "not ie 11"
        ]
    }
    
    
  6. :visible.sync 变为 v-model

  7. 自定义按钮弹出框内容:
    在这里插入图片描述

    • Vue2
      <el-popconfirm
           title="是否确定删除?"
           confirm-button-text="确定"
           cancel-button-text="取消"
         @confirm="deleteCollectData(scope.row.id)"
      >
      <el-button slot="reference" type="text" size="small">删除
      </el-button>
      </el-popconfirm>
      
    • Vue3
      <el-popconfirm
          title="是否确定删除?"
          confirm-button-text="确定"
          cancel-button-text="取消"
          @confirm="deleteCollectData(scope.row.id)"
      > <template #reference>
        <el-button type="primary" size="small">删除
        </el-button></template>
      
  8. DatePicker

    在这里插入图片描述

    • vue2:

      <el-date-picker
         v-model="form.executionTime"
         type="datetime"
         format="yyyy-MM-dd HH:mm:ss"
         value-format="yyyy-MM-dd HH:mm:ss"
         placeholder="选择日期时间"
         :picker-options="pickerOptionsStart"
      />
      
    • vue3:

      <el-date-picker
          v-model="form.executionTime"
          type="datetime"
          format="YYYY-MM-DD HH:mm:ss"
          value-format="YYYY-MM-DD HH:mm:ss"
          placeholder="选择日期时间"
      />
      
  9. el-table表格数据中的取值方式:

    • vue2
      <el-table :data="tableData" style="width: 100%">
          <el-table-column label="Date" width="180">
             ----------- <template slot-scope="scope"> -----------
              <div style="display: flex; align-items: center">
                <el-icon><timer /></el-icon>
                <span style="margin-left: 10px">{{ scope.row.date }}</span>
              </div>
            </template> 
          </el-table-column>
      </el-table>
      
    • vue3
      <el-table :data="tableData" style="width: 100%">
          <el-table-column label="Date" width="180">
             ----------- <template #default="scope"> -----------
              <div style="display: flex; align-items: center">
                <el-icon><timer /></el-icon>
                <span style="margin-left: 10px">{{ scope.row.date }}</span>
              </div>
            </template> 
          </el-table-column>
      </el-table>
      
  10. 表格数据过滤条件
    在这里插入图片描述

    • vue2
      <template slot="header" slot-scope="scope"></template>
      
    • vue3
      <template #header></template>
      
  11. :value.sync页面取值为变量

    • vue2

      <my-component :value.sync="data"></my-component>
      
    • vue3

      <my-component v-model:data="data"></my-component>
      
  12. el-link组件在vue2中,需要使用#:
    <el-link type="primary" :href="'#/replay/jobDetail/'+replay.taskId">{{ replay.taskName }}</el-link>
    在vue3中:
    <el-link type="primary" :href="'/replay/jobDetail/'+replay.taskId">{{ replay.taskName }}</el-link>

  13. slot= Vue2、Vue3中的差异 footer、extra

    • vue2

      <div slot="footer" class="dialog-footer"></div>
      
    • vue3

      <template #footer>
          <div class="dialog-footer"></div>
      </template>
      
    • vue2

      <el-descriptions class="margin-top" title="任务配置" :column="3">
          <template slot="extra"></template>
      </el-descriptions>
      
    • vue3

      <el-descriptions class="margin-top" title="任务配置" :column="3">
          <template #extra></template>
      </el-descriptions>
      
  14. 异常处理:

    1. Invalid prop: validation failed. Expected one of ["", "default", "small", "large"], got value "mini".
      修改vue2中的size='mini'size='small'

    2. element-plus type.text is about to be deprecated in version 3.0.0, please use link instead.
      element-button的type='text'属性已移除。

    3. ResizeObserver loop completed with undelivered notifications 解决改报错,需要修改app.vuemain.js两个文件:

      • app.vue:

        <template>
        <!--  <img alt="Vue logo" src="./assets/logo.png">-->
        <!--  <HelloWorld msg="Welcome to Your Vue.js App"/>-->
          <main>
            <RouterView />
          </main>
        </template>
        
        <script>
        // app.vue写在script里面  main.js写在app挂在完之后
        const debounce = (fn, delay) => {
          let timer
           return (...args) => {
             if (timer) {
               clearTimeout(timer)
             }
             timer = setTimeout(() => {
               fn(...args)
             }, delay)
           }
        }
        
        const _ResizeObserver = window.ResizeObserver;
        window.ResizeObserver = class ResizeObserver extends _ResizeObserver{
           constructor(callback) {
             callback = debounce(callback, 200);
             super(callback);
           }
        }
        
        </script>
        
        <style>
        #app {
          font-family: Avenir, Helvetica, Arial, sans-serif;
          -webkit-font-smoothing: antialiased;
          -moz-osx-font-smoothing: grayscale;
          text-align: center;
          color: #2c3e50;
          margin-top: 60px;
        }
        </style>
        
        
      • main.js:

        import {createApp} from 'vue'
        
        const app = createApp(App)
        app.mount('#app')
        
        // app.vue写在script里面  main.js写在app挂在完之后
        const debounce = (fn, delay) => {
          let timer
           return (...args) => {
             if (timer) {
               clearTimeout(timer)
             }
             timer = setTimeout(() => {
               fn(...args)
             }, delay)
           }
        }
        
        const _ResizeObserver = window.ResizeObserver;
        window.ResizeObserver = class ResizeObserver extends _ResizeObserver{
           constructor(callback) {
             callback = debounce(callback, 200);
             super(callback);
           }
        }
        
    4. vcrontab 只适用于vue2,在vue3中可以使用vue3-cron-plus no-vue3-cron 参考之前分享博客

    5. vue-jsonpath-picker只适用于Vue2,在Vue3中可以使用vue-json-pretty 参考之前分享博客

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

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

相关文章

基于单片机的人体健康监测系统的设计

本设计以STM32F103C8T6单片机作为主控&#xff0c;通过MAX30102采集心率、血氧值&#xff0c;通过MSP20血压采集模块检测血压值&#xff0c;通过MLX90614红外体温采集模块检测体温值。OLED屏可以显示以上检测的信息&#xff0c;并可以通过蓝牙模块将信息发送给手机APP。当检测值…

【QAMISRA】解决永久license文件替换后未生效的问题

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决浮动版永久license文件替换后未生效的问题。 2、 问题场景 客户替换永久版license文件且重启lserv服务后&#xff0c;license信息还是原来临时license的信息。 3、软硬件环境 1、软件版本&#xff1a; QA-MIS…

Android车载蓝牙音乐实例(附Demo源码):实现手机播放音乐后车机应用显示音乐名称,歌手,专辑名。且可控制上一曲下一曲,暂停播放功能

一、功能需求 功能需求是在Android10以上设备上实现蓝牙音乐功能&#xff0c;细分为两个功能点&#xff1a; 1、手机和车载设备实现蓝牙连接 &#xff08;本Demo文只做监听蓝牙连接状态&#xff0c;需手动到设置中连接蓝牙&#xff09; 2、连接蓝牙成功后手机播放音乐时车载…

【python报错已解决】“IndexError: list index out of range”

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 你是否在处理Python列表时遇到了“IndexError: list index out of range”的错误&#xff1f;这个错误可能会让你的程序中…

51单片机最快能生成多高频率的方波?

前言 在嵌入式系统开发中&#xff0c;51 单片机作为一种非常非常非常经典&#xff0c;贯穿上下几十年的微控制器&#xff0c;被广泛应用于各种电子项目中。其中&#xff0c;生成特定频率的方波信号是一项常见的需求。 那么&#xff0c;51 单片机究竟能以多快的速度生成方波呢&…

STM32——GPS模块(GY-NEO-6M)

1连接 1-1 使用 USB-TTL 工具&#xff0c;安装好驱动&#xff0c;可以在”设备管理器看到对应COM”按照如下链接测试模块&#xff1a; USB-TTL GPS 模块 3.3V--------------------------------->VCC GND------------------------------>GND RXD--------------------…

应用程自定义协议与序列化反序列化

本篇将主要介绍在应用层中自定义的协议&#xff0c;自定义协议的同时还需要将我们的数据继续序列化和反序列化&#xff0c;所以本篇的重点为序列化、反序列化的原因以及如何自定义协议&#xff0c;接着探讨了关于为什么 tcp 协议可以支持全双工协议。还根据用户自定义协议结合 …

⼆⼿⻋交易系统前景分析

二手车交易系统开发小程序在当前市场中具有显著的优势和潜力。以下是对二手车交易系统小程序功能的综合分析&#xff1a; 车辆信息展示&#xff1a;小程序应提供详细的车辆信息展示&#xff0c;包括车辆的图片、品牌、型号、年份、里程数、价格等关键信息&#xff0c;方便用户…

Python爬虫—常用的网络爬虫工具推荐

以下列举几个常用的网络爬虫工具 1. 八爪鱼&#xff08;Bazhuayu&#xff09; 简介&#xff1a; 八爪鱼是一款面向非技术用户的桌面端爬虫软件&#xff0c;以其可视化操作和强大的模板库而受到青睐。它支持从各种网站上抓取数据&#xff0c;包括文本、图片、文档等&#xff…

特殊类设计和类型转换

前言 这一篇博客我们讲特殊类设计和类型转换 1. 特殊类设计 1.1 请设计一个类&#xff0c;不能被拷贝 这个比较简单 第一种方法就是将赋值和拷贝构造只定义不声明然后设置为私有就可以了 第二种方法就是直接令它为delete 1.2 请设计一个类&#xff0c;只能在堆上创建对象 …

自学成才:通过自学成为软件开发者——之入行成为软件开发者

一些优秀的程序员&#xff0c;可能以前从事的是其他职业&#xff0c;他们大都发现工作中的很多固定化的流程内容&#xff0c;如果可以实现自动化&#xff0c;不仅效率能够得到提高和保证&#xff0c;提高自己的生成力&#xff0c;同时自己也会从中释放出来&#xff0c;有更多的…

Go使用MongoDB应用指南

Go使用MongoDB应用指南 MongoDB 是一种高性能、开源、文档型的 NoSQL 数据库&#xff0c;广泛应用于 Web 应用、大数据以及云计算领域。Go 语言则以其快速、开发效率高、代码可维护性强著称。本指南将详细介绍如何在 Go 语言中使用 MongoDB 进行数据库操作&#xff0c;包括连接…

鸿蒙HarmonyOS开发知识:命令行工具Command Line Tools

该命令行工具集合了HarmonyOS应用开发所用到的系列工具&#xff0c;包括代码检查codelinter、三方库的包管理ohpm、命令行解析hstack、编译构建hvigorw。 命令行工具获取 请前往下载中心获取并下载命令行工具Command Line Tools。 配置环境变量 Windows 将解压后command-l…

英语四六级有多重要你不知道

卷出天际 IT业内卷严重大家都知道 因此也就打击了很多想入行的新人 到底什么是核心竞争力 放在十年前 稍微会Spring, CRUD 就能达到入门的台阶 那也是培训机构最繁荣的一段时期 而今顶峰已经过去 IT业从含金量上 已经大不如前 在野蛮发展期 如果不太挑的话 大专也是…

云轴科技ZStack AIOS平台智塔亮相FDS金融领袖峰会

人工智能&#xff08;AI&#xff09;正以前所未有的速度渗透到金融系统&#xff0c;推动着金融服务的创新和变革。这种深度融合不仅可以提高金融服务的效率和准确性&#xff0c;未来还可催生全新的金融产品和服务模式。尤其是生成式人工智能&#xff08;GenAI&#xff09;的出现…

算法的学习笔记—复杂链表的复制(牛客JZ35)

&#x1f600;前言 在许多实际应用中&#xff0c;我们会遇到复杂链表的复制问题。复杂链表不同于一般的单链表&#xff0c;不仅每个节点有指向下一个节点的指针&#xff0c;还有一个特殊的指针 random&#xff0c;可以指向链表中的任意节点或 null。如何高效地复制这样一个复杂…

CACTER直播预告:聚焦EDLP邮件数据防泄露实战重点

在信息高速流通的今天&#xff0c;邮件作为商务沟通的桥梁&#xff0c;不仅承载着日常沟通&#xff0c;更是企业机密和知识产权的重要载体。然而&#xff0c;邮件系统的开放性也使其成为网络攻击的主要目标。数据泄露不仅会导致商业损失&#xff0c;还可能对企业声誉造成不可逆…

【请安全下载】黑神话:悟空 单机游戏 它是如何保证安全的 怎样防破解的?安全措施:D加密,反外挂,代码加密,资源保护

单机 《黑神话&#xff1a;悟空》是一款单机游戏&#xff0c;由游戏科学开发&#xff0c;并于2024年8月20日全球同步上线。游戏以其独特的暗黑国风、深度的故事背景以及精致的游戏画面&#xff0c;重塑了西游题材&#xff0c;为玩家呈现了一个前所未有的悟空传奇。 黑神话&…

[Linux]在Ubuntu中安装samba并且正确配置(详细)

一、我们为什么需要samba服务 samba是一种实现windows和linux包括macos文件共享的套件。它能让我们像访问自己的磁盘一样去访问别的系统的文件。可以看得出来这种一种快速并且高效的文件传输协议。看到这里&#xff0c;大家可能会有些疑问。向linux传输文件&#xff0c;我们可以…

常用网络测试工具以及解决tcp协议带来得问题

一、解决粘包问题 1.1、tcp的特点 面向字节流特点&#xff0c;会造成可能数据与数据发送到一块&#xff0c;成为粘包&#xff0c;数据之间不区分 1.2、拆包 因为缓冲区的大小&#xff0c;一次性发送的数据会进行拆分&#xff08;大小不符合的时候&#xff09; 就和水一样一…