vue-14(使用 ‘router.push‘ 和 ‘router.replace‘ 进行编程导航)

news2025/6/9 21:00:40

使用 ‘router.push’ 和 ‘router.replace’ 进行编程导航

编程导航是使用 Vue Router 构建动态和交互式 Web 应用程序的一个重要方面。它允许您根据应用程序逻辑、用户作或特定条件控制用户的导航流。您可以使用 router.pushrouter.replace 方法以编程方式导航到不同的路由,而不是仅仅依赖 <router-link> 组件。本章将深入探讨这些方法的复杂性,探索它们的功能、用例和差异,使你具备在 Vue 应用程序中实现高级导航策略的知识。

router.push

router.push 方法是在 Vue Router 中以编程方式导航到新 URL 的主要方式。它会在浏览器的历史记录堆栈中添加一个新条目,允许用户使用浏览器的后退按钮导航回上一页。

基本用法

使用 router.push 的最简单方法是传递一个字符串,表示你想要导航到的路径:

import { useRouter } from 'vue-router';

export default {
  setup() {
    const router = useRouter();

    const goToAbout = () => {
      router.push('/about');
    };

    return {
      goToAbout
    };
  },
  template: `
    <button @click="goToAbout">Go to About Page</button>
  `
};

在此示例中,单击该按钮会将用户导航到 /about 路由。浏览器的历史记录将更新,允许用户返回上一页。

使用命名路由

您可以使用命名路由,而不是直接指定路径,这可以使您的代码更具可读性和可维护性。假设您有一个路由定义如下:

import { createRouter, createWebHistory } from 'vue-router';

const routes = [
  {
    path: '/users/:id',
    name: 'user',
    component: User
  }
];

const router = createRouter({
  history: createWebHistory(),
  routes
});

export default router;

然后,您可以使用其名称导航到此路由:

import { useRouter } from 'vue-router';

export default {
  setup() {
    const router = useRouter();

    const goToUser = (userId) => {
      router.push({ name: 'user', params: { id: userId } });
    };

    return {
      goToUser
    };
  },
  template: `
    <button @click="goToUser(123)">Go to User 123</button>
  `
};

这种方法是有益的,因为如果更改 /users/:id 路由的路径,则只需在路由定义中更新它,而无需在导航到它的每个位置更新它。

传递参数

您可以使用 params 属性将参数传递给路由:

import { useRouter } from 'vue-router';

export default {
  setup() {
    const router = useRouter();

    const goToProduct = (productId) => {
      router.push({ path: `/products/${productId}` }); // Or { name: 'product', params: { id: productId } } if you have a named route
    };

    return {
      goToProduct
    };
  },
  template: `
    <button @click="goToProduct(456)">Go to Product 456</button>
  `
};

这将导航到 /products/456。如果您使用的是命名路由, 则 params 属性是传递路由参数的首选方法。

传递查询参数

您还可以使用 query 属性传递查询参数:

import { useRouter } from 'vue-router';

export default {
  setup() {
    const router = useRouter();

    const goToSearch = (searchTerm) => {
      router.push({ path: '/search', query: { q: searchTerm } });
    };

    return {
      goToSearch
    };
  },
  template: `
    <button @click="goToSearch('vue router')">Search for Vue Router</button>
  `
};

这将导航到 /search?q=vue%20router

处理 onCompleteonAbort 回调

router.push 方法还接受可选的 onCompleteonAbort 回调:

import { useRouter } from 'vue-router';

export default {
  setup() {
    const router = useRouter();

    const goToDashboard = () => {
      router.push({ path: '/dashboard' }, () => {
        // Navigation completed successfully
        console.log('Navigation to dashboard completed');
      }, () => {
        // Navigation aborted
        console.error('Navigation to dashboard aborted');
      });
    };

    return {
      goToDashboard
    };
  },
  template: `
    <button @click="goToDashboard">Go to Dashboard</button>
  `
};

当导航成功时执行 onComplete 回调,当导航中止时(例如,由导航守卫)执行 onAbort 回调。随着 async/await 和基于 promise 的导航的引入,这些回调现在不太常用。

async/awaitrouter.push 一起使用

router.push 返回一个 Promise,它允许您使用 async/await 进行更清晰的异步导航处理:

import { useRouter } from 'vue-router';

export default {
  setup() {
    const router = useRouter();

    const goToSettings = async () => {
      try {
        await router.push({ path: '/settings' });
        console.log('Navigation to settings completed');
      } catch (error) {
        console.error('Navigation to settings aborted', error);
      }
    };

    return {
      goToSettings
    };
  },
  template: `
    <button @click="goToSettings">Go to Settings</button>
  `
};

此方法使您的代码更具可读性,更易于推理,尤其是在处理复杂的导航场景时。

了解 router.replace

router.replace 方法类似于 router.push,但它替换浏览器历史堆栈中的当前条目,而不是添加新条目。这意味着用户将无法使用浏览器的后退按钮导航回上一页。

基本用法

router.replace 的基本用法类似于 router.push

import { useRouter } from 'vue-router';

export default {
  setup() {
    const router = useRouter();

    const goToHome = () => {
      router.replace('/home');
    };

    return {
      goToHome
    };
  },
  template: `
    <button @click="goToHome">Go to Home Page</button>
  `
};

单击该按钮会将用户导航到 /home 路由,但上一页将从浏览器的历史记录中删除。

何时使用 router.replace

router.replace 在您希望阻止用户导航回特定页面的情况下非常有用,例如在成功登录或注销后。

例如,在用户登录后,您可能希望使用 router.replace 将他们重定向到控制面板,以防止他们使用后退按钮导航回登录页面。

import { useRouter } from 'vue-router';

export default {
  setup() {
    const router = useRouter();

    const login = async () => {
      // Simulate login process
      await new Promise(resolve => setTimeout(resolve, 1000));

      // Replace the current route with the dashboard route
      router.replace('/dashboard');
    };

    return {
      login
    };
  },
  template: `
    <button @click="login">Login</button>
  `
};

使用 router.replace 传递参数

router.push 一样,router.replace 也支持使用命名路由、paramsquery 传递参数:

import { useRouter } from 'vue-router';

export default {
  setup() {
    const router = useRouter();

    const goToProduct = (productId) => {
      router.replace({ name: 'product', params: { id: productId } });
    };

    return {
      goToProduct
    };
  },
  template: `
    <button @click="goToProduct(789)">Go to Product 789</button>
  `
};

这会将当前路由替换为 /products/789 路由(假设您有一个名为“product”的命名路由,其参数为“id”)。

使用 router.replace 处理 onCompleteonAbort

router.replace 也接受 onCompleteonAbort 回调,并且可以像 router.push 一样与 async/await 一起使用。

router.pushrouter.replace 之间的区别

特征router.pushrouter.replace
历史记录堆栈向历史记录堆栈添加新条目替换历史记录堆栈中的当前条目
后退按钮允许导航回上一页阻止导航返回上一页
使用案例常规导航, 添加到历史记录登录/注销后重定向,阻止返回导航

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

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

相关文章

使用WPF的Microsoft.Xaml.Behaviors.Wpf中通用 UI 元素事件

Nuget下载之后记得要先引用下面的 xmlns:i"http://schemas.microsoft.com/xaml/behaviors" <!-- 鼠标事件 --> <i:EventTrigger EventName"MouseEnter"/> <!-- 鼠标进入 --> <i:EventTrigger EventName"MouseLeave"/&g…

Centos7.6图文安装mysql8.4详细步骤记录

1 前提条件 1.1 关闭数据库服务器的防火墙 # 关闭数据库服务器的防火墙 systemctl stop firewalld systemctl disable firewalld 1.2 关闭SELinux # 编辑 /etc/selinux/configvi /etc/selinux/config#内容更改为disabledSELINUXdisabled 1.3 卸载系统自身带的mysql&#…

AI短视频创富营

课程内容&#xff1a; 相关资料 【第一章】前期准备 001.【涨粉技巧】新账号如何快速涨粉?_ev(1).mp4 002.【带贷权限】如何开通账号带贷权限?(1).mp4 003.【费用缴纳】如何缴纳账号保证金?_ev(1).mp4 004.【账号检测】如何检测账号是否限流?(1).mp4 005.【风险规避…

spring中的@RabbitListener注解详解

基本用法主要属性1. queues / queueNames2. containerFactory3. id4. concurrency5. ackMode6. priority7. bindings 高级特性1. 消息转换器2. 手动确认3. 条件监听4. 错误处理 配置监听容器工厂注意事项完整示例循环依赖解决1. 使用 Setter 注入2. 使用 Lazy 注解3. 重构代码结…

MySQL-运维篇

运维篇 日志 错误日志 错误日志是 MySQL 中最重要的日志之一&#xff0c;它记录了当 mysqld 启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关信息当数据库出现任何故障导致无法正常使用时&#xff0c;建议首先查看此日志。 该日志是默认开启的&am…

深度优先算法学习

1: 从 1点出发到 15点 #include <stdio.h>#define MAX_NODES 100typedef struct {int node_id;int *nextNodes;int nextNodesSize; } Node;// 假设我们有一个节点数组&#xff0c;全局保存了所有节点 Node nodes[MAX_NODES];void dfs(int node_id) {Node *node &n…

前端技能包

ES6 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><script>// 变量定义var a1;let b5; // 现在使用let 定义变量// 对象解构let person{&quo…

【笔记】PyCharm 使用问题反馈与官方进展速览

#工作记录 https://youtrack.jetbrains.com/issue/IJPL-190308 【笔记】记一次PyCharm的问题反馈_the polyglot context is using an implementation th-CSDN博客 【笔记】与PyCharm官方沟通解决开发环境问题-CSDN博客 与 JetBrains 官方沟通记录&#xff08;PyCharm 相关问题…

操作系统期末版

文章目录 概论处理机管理进程线程处理机调度生产者消费者问题 死锁简介死锁的四个必要条件解决死锁的方法 存储管理链接的三种方式静态链接装入时动态链接运行时链接 装入内存的三种方式绝对装入可重定位装入动态运行时装入 覆盖交换存储管理方式连续分配**分段存储管理方式***…

自然语言处理——语言模型

语言模型 n元文法参数估计数据平滑方法加1法 神经网络模型提出原因前馈神经网络&#xff08;FNN&#xff09;循环神经网络 n元文法 大规模语料库的出现为自然语言统计处理方法的实现提供了可能&#xff0c;统计方法的成功应用推动了语料库语言学的发展。 语句 &#x1d460; …

数据库管理与高可用-MySQL高可用

目录 #1.1什么是MySQL高可用 1.1.1MySQL主主复制keepalivedhaproxy的高可用 1.1.2优势 #2.1MySQL主主复制keepalivedhaproxy的实验案例 1.1什么是MySQL高可用 MySQL 高可用是指通过技术手段确保 MySQL 数据库在面临硬件故障、软件错误、网络中断、人为误操作等异常情况时&…

免费工具-微软Bing Video Creator

目录 引言 一、揭秘Bing Video Creator 二、轻松上手&#xff1a;三步玩转Bing Video Creator 2.1 获取与访问&#xff1a; 2.2 创作流程&#xff1a; 2.3 提示词撰写技巧——释放AI的想象力&#xff1a; 三、核心特性详解&#xff1a;灵活满足多样化需求 3.1 双重使用模…

【笔记】解决MSYS2安装后cargo-install-update.exe-System Error

#工作记录 cargo-install-update.exe-System Error The code execution cannot proceed because libgit2-1.9.dll wasnot found. Reinstalling the program may fix this problem. …

银行卡二三四要素实名接口如何用PHP实现调用?

一、什么是银行卡二三四要素实名接口 输入银行卡卡号、姓名、身份证号码、手机号&#xff0c;验证此二三四要素是否一致。 二、核心价值 1. 提升风控效率 通过实时拦截冒用身份开户&#xff0c;银行卡二三四要素实名接口显著降低了人工审核成本&#xff0c;效率提升50%以上…

itvbox绿豆影视tvbox手机版影视APP源码分享搭建教程

我们先来看看今天的主题&#xff0c;tvbox手机版&#xff0c;然后再看看如何搭建&#xff1a; 很多爱好者都希望搭建自己的影视平台&#xff0c;那该如何搭建呢&#xff1f; 后端开发环境&#xff1a; 1.易如意后台管理优化版源码&#xff1b; 2.宝塔面板&#xff1b; 3.ph…

网页抓取混淆与嵌套数据处理流程

当我们在网页抓取中&#xff0c;遇到混淆和多层嵌套的情况是比较常见的挑战。混淆大部分都是为了防止爬虫而设计的&#xff0c;例如使用JavaScript动态加载、数据加密、字符替换、CSS偏移等。多层嵌套则可能是指HTML结构复杂&#xff0c;数据隐藏在多层标签或者多个iframe中。 …

高性能MYSQL:复制同步的问题和解决方案

一、复制的问题和解决方案 中断MySQL的复制并不是件难事。因为实现简单&#xff0c;配置相当容易&#xff0c;但也意味着有很多方式会导致复制停止&#xff0c;陷入混乱并中断。 &#xff08;一&#xff09;数据损坏或丢失的错误 由于各种各样的原因&#xff0c;MySQL 的复制…

大话软工笔记—架构模型

1. 架构模型1—拓扑图 &#xff08;1&#xff09;拓扑图概念 拓扑图&#xff0c;将多个软件系统用网络图连接起来的表达方式。 &#xff08;2&#xff09;拓扑图分类 总线型结构 比较普遍采用的方式&#xff0c;将所有的系统接到一条总线上。 星状结构 各个系统通过点到…

javaweb -html -CSS

HTML是一种超文本标记语言 超文本&#xff1a;超过了文本的限制&#xff0c;比普通文本更强大&#xff0c;除了文字信息&#xff0c;还可以定义图片、音频、视频等内容。 标记语言&#xff1a;由标签"<标签名>"构成的语言。 CSS:层叠样式表&#xff0c;用于…

spring task定时任务快速入门

spring task它基于注解和配置&#xff0c;可以轻松实现任务的周期性调度、延迟执行或固定频率触发。按照我们约定的时间自动执行某段代码。例如闹钟 使用场景 每月还款提醒&#xff0c;未支付的订单自动过期&#xff0c;收到快递后自动收货&#xff0c;系统自动祝你生日快乐等…