当前位置: 首页 > news >正文

[Vue]编程式导航

在 Vue 中,编程式导航是通过 JavaScript 代码(而非 <router-link> 标签)动态控制路由跳转的核心方式。这个方法依赖于 Vue Router 提供的 API,能更灵活地处理复杂场景(如异步操作、条件跳转等)。


一、核心方法

Vue Router 提供了以下方法实现编程式导航:

方法作用
router.push()跳转新页面,会向浏览器历史记录添加新条目(可后退)
router.replace()替换当前页面,不会留下历史记录(不可后退)
router.go(n)前进/后退 n 步(正数前进,负数后退)
router.back()后退一步(等价于 router.go(-1)
router.forward()前进一步(等价于 router.go(1)

二、router.push() 详解

这是最常用的方法,支持多种参数格式:

1. 路径字符串
// 跳转到指定路径
this.$router.push('/user');
2. 对象描述(推荐)
// 通过路径跳转
this.$router.push({ path: '/user' });// 通过命名路由跳转(需在路由配置中定义 name)
this.$router.push({ name: 'UserProfile', params: { userId: 123 } // 动态参数(需路由配置占位符)
});
3. 携带参数
  • query 参数(URL 可见,适合非敏感数据):

    this.$router.push({path: '/user',query: { id: 1, name: '王博涵' }
    });
    // URL: /user?id=1&name=John
    
  • params 参数(需路由配置占位符,URL 更简洁):

    // 路由配置
    { path: '/user/:userId', name: 'User', component: User }// 跳转代码
    this.$router.push({name: 'User', // 必须使用命名路由params: { userId: 123 }
    });
    // URL: /user/123
    

三、router.replace() 使用

push 类似,但不会留下历史记录:

// 替换当前页面(不可后退)
this.$router.replace({ path: '/login' });

四、router.go() 控制历史记录

// 后退一步
this.$router.go(-1);// 前进两步
this.$router.go(2);

五、动态路由参数处理

在目标组件中,通过 $route.paramsprops 接收参数:

1. 通过 $route 获取
// 目标组件中
export default {mounted() {const userId = this.$route.params.userId;console.log(userId); // 123}
}
2. 通过 props 解耦(推荐)
// 路由配置中启用 props
{ path: '/user/:userId', component: User, props: true 
}// 目标组件声明 props
export default {props: ['userId'],mounted() {console.log(this.userId); // 123}
}

六、高级用法

1. 异步跳转处理
this.$router.push('/target').catch(error => {// 处理导航错误(如重复跳转同一路由)if (error.name === 'NavigationDuplicated') {console.log('重复跳转');}
});
2. 导航守卫结合

在全局或路由独享守卫中控制跳转:

// 全局前置守卫
router.beforeEach((to, from, next) => {if (to.path === '/admin' && !isAdmin) {next('/login'); // 中断跳转并重定向} else {next();}
});

七、注意事项

  1. params 必须使用 name:若使用 params,跳转时必须通过 name 而非 path
  2. 路由配置匹配:确保路由路径中包含参数占位符(如 /user/:id)。
  3. 可选参数:在路由路径中使用 ? 修饰符定义可选参数:
    { path: '/user/:id?' } // id 为可选
    

八、完整示例

1. 路由配置
// router.js
import Vue from 'vue';
import VueRouter from 'vue-router';Vue.use(VueRouter);const routes = [{path: '/user/:userId',name: 'User',component: () => import('./User.vue'),props: true}
];const router = new VueRouter({ routes });
export default router;
2. 跳转代码
// 在组件方法中
methods: {navigateToUser() {this.$router.push({name: 'User',params: { userId: 123 }});}
}
3. 目标组件
<!-- User.vue -->
<template><div>User ID: {{ userId }}</div>
</template><script>
export default {props: ['userId']
};
</script>

相关文章:

  • 回溯算法详解(Java实现):从组合到排列的全面解析
  • 延时启动windows中程序
  • MARM:推荐系统中的记忆增强突破
  • Cycleresearcher:通过自动化评审改进自动化研究
  • C# 方法(控制流和方法调用)
  • SQL笔记——左连接、右连接、内连接
  • pip命令
  • #Paper Reading# DeepSeek-R1
  • 在 Trae CN IDE 中配置 Python 3.11的指南
  • 修改ollama.service都可以实现什么?
  • 【网络编程】HTTP(超文本传输协议)详解
  • 头歌数据库课程实验(索引与数据库完整性)
  • 计算方法实验五 插值多项式的求法
  • AI超级智能体教程(五)---自定义advisor扩展+结构化json输出
  • FreeRtos实战从入门到精通--任务创建和删除(动态方法)--事了拂衣去,深藏功与名
  • 先知AIGC超级工场,撬动运营效率新杠杆
  • ASP.NET MVC​ 入门与提高指南八
  • (超2万字数详解)C++学习之类与对象
  • D. 例题3.2.2 整数划分问题
  • python进阶(2)二进制
  • 跳水世界杯女子单人10米台决赛,陈芋汐、全红婵包揽金银牌
  • 消费持续升温,这个“五一”假期有何新亮点?
  • 贵州赤水丹霞大瀑布附近山体塌方车辆被埋,景区:无伤亡,道路已恢复
  • 图忆|上海车展40年:中国人的梦中情车有哪些变化(下)
  • 4月一二线城市新房价格环比上涨,沪杭涨幅居百城前列
  • 美乌矿产协议签署被曝“临门一脚”时生变,美方提附加条件