Vue2升级Vue3填坑笔记

背景

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

差异处理

element常见差异:

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

  2. router引入:

    • Vue2

      js 复制代码
      import Router from 'vue-router' 
    • Vue3

      js 复制代码
      import {createRouter, createWebHistory} from "vue-router"
  3. 使用router的history功能,需要添加属性, 指定路径

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

    • vue2

      js 复制代码
      this.recordId = this.$router.history.current.params.id
    • vue3

      js 复制代码
      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规则

    json 复制代码
    {     
        "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

      js 复制代码
      <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

      js 复制代码
      <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:

      js 复制代码
      <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:

      js 复制代码
      <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

      js 复制代码
      <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

      vue 复制代码
      <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

      vue 复制代码
      <template slot="header" slot-scope="scope"></template>
    • vue3

      vue 复制代码
      <template #header></template>
  11. :value.sync页面取值为变量

    • vue2

      vue 复制代码
      <my-component :value.sync="data"></my-component>
    • vue3

      vue 复制代码
      <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

      vue 复制代码
      <div slot="footer" class="dialog-footer"></div>
    • vue3

      vue 复制代码
      <template #footer>
          <div class="dialog-footer"></div>
      </template>
    • vue2

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

      vue 复制代码
      <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:

        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:

        vue 复制代码
        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 参考之前分享博客

相关推荐
Jiaberrr几秒前
解锁 GitBook 的奥秘:从入门到精通之旅
前端·gitbook
程序员_三木18 分钟前
Three.js入门-Raycaster鼠标拾取详解与应用
开发语言·javascript·计算机外设·webgl·three.js
顾平安1 小时前
Promise/A+ 规范 - 中文版本
前端
聚名网1 小时前
域名和服务器是什么?域名和服务器是什么关系?
服务器·前端
桃园码工1 小时前
4-Gin HTML 模板渲染 --[Gin 框架入门精讲与实战案例]
前端·html·gin·模板渲染
沈剑心1 小时前
如何在鸿蒙系统上实现「沉浸式」页面?
前端·harmonyos
一棵开花的树,枝芽无限靠近你2 小时前
【PPTist】组件结构设计、主题切换
前端·笔记·学习·编辑器
m0_748237052 小时前
Chrome 关闭自动添加https
前端·chrome
prall2 小时前
实战小技巧:下划线转驼峰篇
前端·typescript
开心工作室_kaic2 小时前
springboot476基于vue篮球联盟管理系统(论文+源码)_kaic
前端·javascript·vue.js