vue router 4.x 版本 路由跳转时使用state传参,页面会自动刷新并且传参丢失的问题记录
1. 项目中部分相关依赖的版本
"vue": "^3.2.45" "vue-router": "^4.1.6" "vite": "^4.1.0" "element-plus": "^2.2.30"
2. 封装的vue router hooks代码如下
import { useRouter } from "vue-router"; export default function useVueRouter() { const router = useRouter(); const { query } = router.currentRoute.value; const routerState = window.history.state; const jumpPage = (name, state = {}) => { if (!name) { return; } router.push({ name, state, }); }; const goBack = (step = -1) => { router.back(step); }; return { query, routerState, jumpPage, goBack, }; }
3. 出现问题的背景
出现问题的部分如下:
<el-table-column fixed="right" label="操作" width="250"> <template #default="scope"> <el-button link type="primary" @click="jumpPage('Detail', scope.row)" > 詳情 </el-button> <el-divider direction="vertical" /> <el-button link type="primary" @click="jumpPage('Edit', scope.row)" > 編輯 </el-button> </template> </el-table-column>
详情页执行如下代码发现没有接收到参数:
import useRouter from "@/hooks/useRouter.js"; const { jumpPage, routerState } = useRouter(); console.log(routerState);
由于在其他页面的表格操作列也使用同样的写法跳转,但是没有遇到该问题,所以开始寻找不同的地方,经过观察发现在点击跳转时页面会刷新然后传参丢失。
经过对比scope.row
的内容以及依次删除其它不同类型属性的测试,最终找到了导致页面刷新的属性:scope.row
中的tags数组
// scope.row 内容如下 { "shopId": 2, "shopName": "李家菜", "storeId": "218", "name": "李家宴(李家菜)", "tags": [ "704" ], "users": 0, "status": 1, "createTime": "1900-01-20", "creator": "system" }
4. 解决方案
① 使用 JSON.parse(JSON.stringify(scope.row))
② 避免传递数组或其他会导致问题的复杂数据类型参数
③ 使用query或params传参
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
2023-08-21 fetch方法请求并处理接口返回的stream流数据