锚点href与Angular路由器链接的区别

36

我正在尝试在我的Angular 7应用程序中使用带有href的锚标签。 当我单击链接时,浏览器中的URL会更改,但页面不会导航到该链接。 如果我加上target="_self"就可以正常工作。

<a href="/abcd" target="_self">Abcd</a>

但这并不起作用,只有浏览器中的URL更改了,但没有任何反应。

<a href="/abcd">Abcd</a>

然而,如果我使用Angular路由并使用RouterLink,它就可以工作。

<a routerLink="/abcd" routerLinkActive="active">Abcd</a>

有人能解释一下这种行为吗?


在到达<a routerLink="/abcd" routerLinkActive="active">Abcd</a>之前,请确保你放置了<router-outlet>。从这里,我们可以知道我们正在使用路由功能。 - Dhanushka sasanka
你确定你按照语法正确的方式编写代码吗?尝试使用方括号括起来……<a [routerLink]="['/abcd']" ></a> 请确保你在 route.ts 文件中正确指定了路径。 - Aayush
如果你使用 href,那么就是调用不在你的应用程序中的页面;而 routerLink 则相反。 - user10863293
我知道 href 是调用应用程序外部页面的方法,但为什么需要 target="_self" 呢?否则浏览器 URL 值会改变,但浏览器不会跳转到该网址。 - tangokhi
8个回答

47

Href是由Html提供的基本属性,用于通过点击链接导航到不同页面并在点击后重新加载页面

routerLink是由Angular提供的属性,用于在不重新加载页面的情况下导航到不同的组件。

两者之间的主要区别在于href会清除当前页面的状态,而routerLink不会丢失页面的状态

例如,如果页面中存在一个输入文本框,则在导航后,routerLink将保留其值。可以通过覆盖某些功能(如页面重载)来将routerLink视为href在Angular中的自定义属性


7

使用 href 导航:

href 是浏览器提供的默认属性,用于在页面之间导航(切换),在此过程中整个页面将会重新加载,丢失当前状态。

而 hack 的方法是通过阻止默认行为来实现。

例如:

在模板中:

 <a href="route" (click)=onClick($event) />

组件内部:

onClick(event :Event){
    event.preventDefault();
}

在 href 中使用 target 属性:

Please refer to https://www.w3schools.com/tags/att_link_target.asp

使用routerLink进行导航:

Angular在routerLink指令中模拟了上述行为。


6
Angular应用程序是单页应用程序(SPA)。使用href会破坏这个设计模式。这样的效果是每次使用href导航时都会完全重置你的应用程序状态。在使用Angular或其他SPA时,要避免使用href。
routerLink加载内部到Angular的资源,并且在浏览器加载的页面中从未完全重新加载(因此应用状态得以维护)。表明这一点的线索是浏览器的加载指示器:
当跟随传统链接时,在浏览器中,您将看到旋转器正在运转(在大多数情况下,在选项卡上或地址栏旁边)。当您等待Angular组件加载时,该旋转器将处于空闲状态。
在开发过程中,当我的状态重置时,我总是检查这一点。有时问题是我使用了href而不是routerLink。

4

直接使用href会告诉浏览器打开新链接,应用程序将重新加载,并仍然连接到已配置的确切页面。

根据文档routerLink使用内部 API 在不重新加载的情况下导航应用程序。

您可以单击使用hrefrouterLink的链接以查看差异演示


1
编程相关内容的翻译如下:附上演示链接,简洁明了更佳。 - Steve Whitmore

3

有时候你不能使用routerLink,比如说,你在一个非angular的web组件中。

我用的一种解决刷新问题的方法是检查所有的"a"标签点击事件,如果没有routerlink属性,则阻止默认行为,然后使用路由进行导航。

  @HostListener('window:click', ['$event'])
  onClick(e: any) {
    const path = e.composedPath() as Array<any>;
    const firstAnchor = path.find(p => p.tagName.toLowerCase() === 'a');
    if (firstAnchor && !firstAnchor.hasAttribute('routerlink')) {
      const href = firstAnchor.getAttribute('href');

      this.router.navigateByUrl(href);

      e.preventDefault();
    }
  }

我的“有时无法使用routerLink”的情况是:实现一个管道,将标记文本转换为经过消毒的HTML。通过管道处理的自定义标记将呈现的HTML中的某些部分设置为粗体等。它失败的地方是将管道装饰文本作为链接 - 我想导航到下一个视图而不重新加载页面。什么都没用。另一个问题的答案解释说:呈现的HTML无法处理angular(例如routerLink)-太晚了。但是@Lee Gunn的上面的onClick侦听器为我提供了一个很好的解决方法。谢谢。 - StackOverflowUser

1
Bytech有一个正确的答案,但是在某些情况下,您可能希望在angular中使用href。例如,我有一个单一的应用程序,其中包含多个项目。在链接上,我想从store项目导航到成员门户项目。在这种情况下,由于它们在两个不同的基本URL上提供服务(在这种情况下,对于开发环境,它们是localhost:4201和localhost:4202),使用路由链接实际上不会将您路由到其他基本路由位置。必须使用href,否则它将无法将您路由到正确的URL。

0
差异:
routerLink: 
 - URL changes without page reload -> activates angular router 
 - maintains the page state
       
href: 
- if href is used instead of routerLink - it will work but page will reload 
- href kills the state of the current page

-1
如果你在 Angular 应用中使用 href,请避免这样做。Angular 有路由器功能,其中 routerLink 是其中的一部分。
<p routerLink='/path'>Text</p>

为了更好地理解,请阅读这篇文章 Angular 路由


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接