vue2项目改造为vue3遇到的问题以及解决办法

一、关键问题及解决办法

1. 布局组件改造问题

问题: Vue 2的Options API需要改造成Vue 3的Composition API
解决办法:

  • 使用<script setup>语法替代export default {}
  • 使用ref、computed、onMounted等Vue 3的组合式API
  • 使用defineProps和defineEmits定义props和emits
  • 使用useRouter、useRoute替代this.$router、this.$route
  • 使用useMainStore替代this.$store

2. 侧边栏菜单显示问题

问题: 菜单数据结构错误或渲染逻辑问题,导致一级菜单不显示

解决办法:

  • 确保mock数据中的菜单层级结构正确
  • 使用el-sub-menu作为一级菜单容器
  • 使用el-menu-item作为二级菜单项
  • 使用#title替代slot="title"

3. 头像下拉箭头不显示

问题: 使用了旧的图标用法,在Element Plus中不兼容
解决办法:

  • 导入Element Plus的图标组件:import { ArrowDown } from "@element-plus/icons-vue"
  • 使用<el-icon><ArrowDown /></el-icon>替代<i class="el-icon-arrow-down"></i>
  • 添加内联样式确保颜色和显示:style="color: #fff;"

4. 登录过期问题

问题: 响应拦截器检测到登录过期时,没有清除store中的状态

解决办法:

  • 导入useMainStore钩子函数

  • 在检测到登录过期时,清除store中的状态:

    javascript 复制代码
    const mainStore = useMainStore();
    mainStore.setToken("");
    mainStore.setUserInfo({});
    mainStore.setMenus([]);
    router.replace({ name: "Login" });

5. 退出登录问题

问题: 当登录已经过期时,api.logout()接口调用可能会失败,导致退出登录功能无法正常工作
解决办法:

  • 移除对api.logout()接口的调用,直接清除store中的状态并跳转到登录页
  • 这样无论登录状态是否过期,退出登录功能都能正常工作

6. API请求问题

问题: 请求拦截器中token的携带逻辑被注释掉了,导致服务器无法验证用户的登录状态
解决办法:

  • 在请求拦截器中添加token携带逻辑:

    javascript 复制代码
    const mainStore = useMainStore();
    const token = mainStore.token;
    if (token) {
      config.headers["token"] = token;
    }

7. 模板语法问题

问题: Vue 2和Vue 3的模板语法有一些差异
解决办法:

  • slot="footer"改为#footer
  • slot="append"改为#append
  • ref="form"改为ref="formRef"
  • visible改为v-model="dialogVisible"
  • #default="{ row, $index }"改为#default="{ row }"(移除未使用的$index)

二、改造的内容

1. 布局组件 (src/page/layout/index.vue)

  • 从Vue 2的Options API改造成Vue 3的Composition API
  • 使用<script setup>语法
  • 使用ref、computed、onMounted等Vue 3的组合式API
  • 修复头像下拉箭头的显示问题
  • 修复退出登录的逻辑

2. 员工管理页面 (src/views/user/staff/index.vue)

  • 从Vue 2的Options API改造成Vue 3的Composition API
  • 使用<script setup>语法
  • 使用ref、onMounted等Vue 3的组合式API
  • 使用ElMessage和ElMessageBox等Element Plus组件

3. 员工新增/编辑页面 (src/views/user/staff/add.vue)

  • 从Vue 2的Options API改造成Vue 3的Composition API
  • 使用<script setup>语法
  • 使用ref、computed、onMounted等Vue 3的组合式API
  • 使用defineProps和defineEmits定义props和emits
  • 修复合同有效期选择器的逻辑
  • 修复模板中的一些语法问题

4. API文件 (src/views/user/staff/api.js)

  • 修复toggleStaffStatus方法中的bug:htt改为http

5. HTTP请求拦截器 (src/util/http.js)

  • 导入useMainStore钩子函数
  • 在请求拦截器中添加token携带逻辑
  • 在响应拦截器中添加登录过期时的状态清除逻辑

6. 登录组件 (src/page/login/index.vue)

  • 从Vue 2的Options API改造成Vue 3的Composition API
  • 使用<script setup>语法
  • 使用ref、onMounted等Vue 3的组合式API
  • 使用useRouter替代this.$router
  • 使用useMainStore替代this.$store

7. 路由权限控制 (src/router/permission.js)

  • 导入useMainStore钩子函数
  • 使用useMainStore()替代store.state.main

8. Store状态管理 (src/store/modules/main.js)

  • 使用Pinia替代Vuex
  • 使用defineStore定义store
  • 使用ref定义state
  • 使用computed定义getters
  • 使用普通函数定义actions

三、改造的关键点

  1. 语法转换:Vue 2的Options API → Vue 3的Composition API
  2. 状态管理:Vuex → Pinia
  3. 路由:Vue Router 3 → Vue Router 4
  4. UI组件:Element UI → Element Plus
  5. 模板语法:Vue 2的slot语法 → Vue 3的slot语法
  6. 生命周期 :mounted → onMounted
  7. 响应式数据 :data() → ref()
  8. 计算属性 :computed → computed()
  9. 方法 :methods → 普通函数
  10. 组件引用 :this.$refs → ref()

四、验证结果

  • 没有任何lint或type错误
  • 所有文件都基于Vue 2原版代码进行改造
  • 保持了原有的功能和逻辑不变
  • 代码符合Vue 3的语法规范
  • 所有数据都是通过API动态请求过来的,不是mock的死数据

现在您的Vue 2项目已经成功改造为Vue 3项目,可以正常运行了。

相关推荐
蜗牛攻城狮2 小时前
微前端四大方案选型对比与最佳实践:qiankun、micro-app、wujie、Module Federation
前端·微前端·qiankun·前端架构·micro-app·wujie
她说可以呀4 小时前
Vue插槽
前端·javascript·vue.js
qq_448011164 小时前
Vue + Jinja2两套模版与法冲突造成undefinedError
前端·javascript·vue.js
aixingpan4 小时前
aixingpan.cn API开发文档:前端查询夏令时和时区接口指南
前端·php
2601_958352905 小时前
23.5×19mm 换掉一整条音频链?|A-68 集成了什么:ADC / DAC / 24.576MHz 时钟 / AEC / 波束降噪,主控仅需 6 根线
前端·音视频·ai降噪·回声消除·语音模块
志尊宝5 小时前
AI原生前端开发(039):AI辅助的Nuxt 4全栈开发
前端·vue.js·ai-native
FRing036 小时前
JavaScript入门到精通三十二(深拷贝、浅拷贝、递归函数)
开发语言·前端·javascript
excel6 小时前
双 Token 与前端使用 Crypto 公私钥鉴权换 Token,哪种方案更好?
前端·后端
外收内放6 小时前
Python基础语法练习题(73)
java·前端·python
风骏时光牛马7 小时前
面向复杂场景的大模型应用落地与能力优化实践
前端