찾다
웹 프론트엔드JS 튜토리얼Angular에서 Navigate() 및 NavigateByUrl() 사용 방법의 차이점에 대한 간략한 설명

라우팅은 Angular 애플리케이션의 핵심입니다. 이 기사에서는 Angular Router를 이해하고 Navigate()와 NavigationByUrl() 사용법의 차이점을 자세히 소개합니다.

Angular에서 Navigate() 및 NavigateByUrl() 사용 방법의 차이점에 대한 간략한 설명

라우팅은 Angular 애플리케이션의 핵심으로, 요청된 경로와 관련된 구성 요소를 로드하고 특정 경로에 대한 관련 데이터를 가져옵니다. 이를 통해 우리는 다양한 경로를 제어하고, 다양한 데이터를 얻고, 다양한 페이지를 렌더링할 수 있습니다. [관련 튜토리얼 추천: "angular Tutorial"]

라우터 설치

먼저 Angular Router를 설치해야 합니다. 다음 작업 중 하나를 실행하여 이 작업을 수행할 수 있습니다.

yarn add @angular/router
# OR
npm i --save @angular/router

위 명령이 실행된 후 @angular/router 모듈이 node_modules 폴더에 자동으로 다운로드됩니다. . @angular/router 模块到 node_modules 文件夹中。

Base href

我们需要做的最后一件事,是将 <base> 标签添加到我们的 index.html 文件中。路由需要根据这个来确定应用程序的根目录。例如,当我们转到 http://example.com/page1 时,如果我们没有定义应用程序的基础路径,路由将无法知道我们的应用的托管地址是 http://example.com 还是 http://example.com/page1

这件事操作起来很简单,只需打开项目中的 index.html 文件,添加相应的 <base> 标签,具体如下:

<!doctype html>
<html>
  <head>
    <base href="/">
    <title>Application</title>
  </head>
  <body>
    <app-root></app-root>
  </body>
</html>

以上配置信息告诉 Angular 路由,应用程序的根目录是 /

Using the router

要使用路由,我们需要在 AppModule 模块中,导入 RouterModule。具体如下:

import { NgModule } from &#39;@angular/core&#39;;
import { BrowserModule } from &#39;@angular/platform-browser&#39;;
import { RouterModule } from &#39;@angular/router&#39;;

import { AppComponent } from &#39;./app.component&#39;;

@NgModule({
  imports: [
    BrowserModule,
    RouterModule
  ],
  bootstrap: [
    AppComponent
  ],
  declarations: [
    AppComponent
  ]
})
export class AppModule {}

此时我们的路由还不能正常工作,因为我们还未配置应用程序路由的相关信息。RouterModule 对象为我们提供了两个静态的方法:forRoot()forChild() 来配置路由信息。

RouterModule.forRoot()

RouterModule.forRoot() 方法用于在主模块中定义主要的路由信息,通过调用该方法使得我们的主模块可以访问路由模块中定义的所有指令。接下来我们来看一下如何使用 forRoot()

// ...
import { Routes, RouterModule } from &#39;@angular/router&#39;;

export const ROUTES: Routes = [];

@NgModule({
  imports: [
    BrowserModule,
    RouterModule.forRoot(ROUTES)
  ],
  // ...
})
export class AppModule {}

我们通过使用 const 定义路由的配置信息,然后把它作为参数调用 RouterModule.forRoot() 方法,而不是直接使用 RouterModule.forRoot([...]) 这种方式,这样做的好处是方便我们在需要的时候导出 ROUTES 到其它模块中。

RouterModule.forChild()

RouterModule.forChild()Router.forRoot() 方法类似,但它只能应用在特性模块中。
友情提示:根模块中使用 forRoot(),子模块中使用 forChild()
这个功能非常强大,因为我们不必在一个地方(我们的主模块)定义所有路由信息。反之,我们可以在特性模块中定义模块特有的路由信息,并在必要的时候将它们导入我们主模块。RouterModule.forChild() 的使用方法如下:

import { NgModule } from &#39;@angular/core&#39;;
import { CommonModule } from &#39;@angular/common&#39;;
import { Routes, RouterModule } from &#39;@angular/router&#39;;

export const ROUTES: Routes = [];

@NgModule({
  imports: [
    CommonModule,
    RouterModule.forChild(ROUTES)
  ],
  // ...
})
export class ChildModule {}

通过以上示例,我们知道在主模块和特性模块中,路由配置对象的类型是一样的,区别只是主模块和特性模块中需调用不同的方法,来配置模块路由。接下来我们来介绍一下如何配置 ROUTES 对象。

Configuring a route

我们定义的所有路由都是作为 ROUTES 数组中的对象。首先,为我们的主页定义一个路由:

import { Routes, RouterModule } from &#39;@angular/router&#39;;

import { HomeComponent } from &#39;./home/home.component&#39;;

export const ROUTES: Routes = [
  { path: &#39;&#39;, component: HomeComponent }
];

@NgModule({
  imports: [
    BrowserModule,
    RouterModule.forRoot(ROUTES)
  ],
  // ...
})
export class AppModule {}

示例中我们通过 path 属性定义路由的匹配路径,而 component 属性用于定义路由匹配时需要加载的组件。

友情提示:我们使用 path: '' 来匹配空的路径,例如:https://yourdomain.com

Displaying routes

配置完路由信息后,下一步是使用一个名为 router-outlet 的指令告诉 Angular 在哪里加载组件。当 Angular 路由匹配到响应路径,并成功找到需要加载的组件时,它将动态创建对应的组件,并将其作为兄弟元素,插入到 router-outlet 元素中。

在我们 AppComponent 组件中,我们可以在任意位置插入 router-outlet

Base href

마지막으로 해야 할 일은 index.html 파일에 <base> 태그를 추가하는 것입니다. 라우터는 애플리케이션의 루트 디렉터리를 결정하기 위해 이 정보가 필요합니다. 예를 들어 http://example.com/page1로 이동할 때 앱의 기본 경로를 정의하지 않으면 라우터는 앱의 호스팅 주소가 http: //example.com 또는 http://example.com/page1.

이 작업은 매우 간단합니다. 프로젝트에서 index.html 파일을 열고 다음과 같이 해당 <base> 태그를 추가하면 됩니다. 위의 구성 정보는 Angular 라우팅에 애플리케이션의 루트 디렉터리가 /임을 알려줍니다.

라우터 사용

🎜🎜라우팅을 사용하려면 AppModule 모듈에서 RouterModule을 가져와야 합니다. 자세한 내용은 다음과 같습니다. 🎜
import { Component } from &#39;@angular/core&#39;;

@Component({
  selector: &#39;app-root&#39;,
  template: `
    <div class="app">
      <h3 id="Our-nbsp-app">Our app</h3>
      <router-outlet></router-outlet>
    </div>
  `
})
export class AppComponent {}
🎜현재 애플리케이션 라우팅 정보를 구성하지 않아 라우팅이 제대로 작동하지 않습니다. RouterModule 객체는 라우팅 정보를 구성하기 위해 forRoot()forChild()라는 두 가지 정적 메서드를 제공합니다. 🎜

🎜RouterModule.forRoot()🎜

🎜RouterModule.forRoot() 이 메소드는 메인 모듈에서 주요 라우팅 정보를 정의하는 데 사용됩니다. module 라우팅 모듈에 정의된 모든 지시문에 액세스할 수 있습니다. 다음으로 forRoot() 사용법을 살펴보겠습니다. 🎜
import { HomeComponent } from &#39;./home/home.component&#39;;
import { ProfileComponent } from &#39;./profile/profile.component&#39;;

export const ROUTES: Routes = [
  { path: &#39;&#39;, component: HomeComponent },
  { path: &#39;/profile/:username&#39;, component: ProfileComponent }
];
🎜const를 사용하여 라우팅 구성 정보를 정의한 후 RouterModule.forRoot()의 매개변수로 호출합니다. <code>RouterModule.forRoot([...])를 직접 사용하는 대신 메서드를 사용하면 ROUTES를 다른 항목으로 내보내는 것이 편리하다는 장점이 있습니다. 필요할 때 모듈. 🎜

🎜RouterModule.forChild()🎜

🎜RouterModule.forChild()Router.forRoot() 메서드와 유사하지만 기능 모듈에 적용됩니다.
알림: 루트 모듈에서는 forRoot()를 사용하고 하위 모듈에서는 forChild()
를 사용하세요. 모든 라우팅 정보가 정의되어 있는 곳(메인 모듈)에서 사용할 필요는 없습니다. 대신 기능 모듈에서 모듈별 라우팅 정보를 정의하고 필요할 때 기본 모듈로 가져올 수 있습니다. RouterModule.forChild()의 사용법은 다음과 같습니다. 🎜
import { Component, OnInit } from &#39;@angular/core&#39;;
import { ActivatedRoute } from &#39;@angular/router&#39;;

@Component({
  selector: &#39;profile-page&#39;,
  template: `
    <div class="profile">
      <h3 id="nbsp-username-nbsp">{{ username }}</h3>
    </div>
  `
})
export class SettingsComponent implements OnInit {
  username: string;
  constructor(private route: ActivatedRoute) {}
  ngOnInit() {
    this.route.params.subscribe((params) => this.username = params.username);
  }
}
🎜위의 예를 통해 라우팅 구성 객체의 유형이 메인 모듈과 기능 모듈에서 동일하다는 것을 알 수 있습니다. 모듈 라우팅을 구성하려면 다른 메서드를 호출해야 합니다. 다음으로 ROUTES 객체를 구성하는 방법을 소개하겠습니다. 🎜🎜🎜경로 구성🎜🎜🎜우리가 정의하는 모든 경로는 ROUTES 배열의 객체입니다. 먼저 홈페이지에 대한 경로를 정의합니다. 🎜
import { SettingsComponent } from &#39;./settings/settings.component&#39;;
import { ProfileSettingsComponent } from &#39;./settings/profile/profile.component&#39;;
import { PasswordSettingsComponent } from &#39;./settings/password/password.component&#39;;

export const ROUTES: Routes = [
  { 
    path: &#39;settings&#39;, 
    component: SettingsComponent,
    children: [
      { path: &#39;profile&#39;, component: ProfileSettingsComponent },
      { path: &#39;password&#39;, component: PasswordSettingsComponent }
    ]
  }
];

@NgModule({
  imports: [
    BrowserModule,
    RouterModule.forRoot(ROUTES)
  ],
})
export class AppModule {}
🎜예제에서는 path 속성을 통해 경로와 일치하는 경로를 정의하고, 구성 요소 속성은 경로가 일치할 때 로드해야 하는 구성 요소를 정의하는 데 사용됩니다. 🎜🎜알림: 경로: ''를 사용하여 빈 경로를 일치시킵니다. 예: https://yourdomain.com🎜🎜🎜경로 표시 중🎜🎜🎜구성 완료 라우팅 정보를 사용하여 다음 단계는 router-outlet이라는 지시문을 사용하여 구성 요소를 로드할 위치를 Angular에 알려주는 것입니다. Angular 라우팅이 응답 경로와 일치하고 로드해야 하는 구성 요소를 성공적으로 찾으면 해당 구성 요소를 동적으로 생성하고 router-outlet 요소에 형제 요소로 삽입합니다. 🎜🎜AppComponent 구성 요소에서 router-outlet 지시문을 어디에나 삽입할 수 있습니다. 🎜
import { Component } from &#39;@angular/core&#39;;

@Component({
  selector: &#39;settings-page&#39;,
  template: `
    <div class="settings">
      <settings-header></settings-header>
      <settings-sidebar></settings-sidebar>
      <router-outlet></router-outlet>
    </div>
  `
})
export class SettingsComponent {}
🎜이제 애플리케이션의 기본 경로를 설정했으므로 다른 구성 옵션을 자세히 살펴볼 수 있습니다. 라우팅을 위해. 🎜🎜🎜추가 구성🎜🎜🎜지금까지 소개한 내용은 시작에 불과합니다. 몇 가지 다른 옵션과 기능을 살펴보겠습니다. 🎜🎜동적 경로🎜

如果路由始终是静态的,那没有多大的用处。例如 path: '' 是加载我们 HomeComponent 组件的静态路由。我们将介绍动态路由,基于动态路由我们可以根据不同的路由参数,渲染不同的页面。

例如,如果我们想要在个人资料页面根据不同的用户名显示不同的用户信息,我们可以使用以下方式定义路由:

import { HomeComponent } from &#39;./home/home.component&#39;;
import { ProfileComponent } from &#39;./profile/profile.component&#39;;

export const ROUTES: Routes = [
  { path: &#39;&#39;, component: HomeComponent },
  { path: &#39;/profile/:username&#39;, component: ProfileComponent }
];

这里的关键点是 : ,它告诉 Angular 路由,:username 是路由参数,而不是 URL 中实际的部分。

友情提示:如果没有使用 : ,它将作为静态路由,仅匹配 /profile/username 路径
现在我们已经建立一个动态路由,此时最重要的事情就是如何获取路由参数。要访问当前路由的相关信息,我们需要先从 @angular/router 模块中导入 ActivatedRoute ,然后在组件类的构造函数中注入该对象,最后通过订阅该对象的 params 属性,来获取路由参数,具体示例如下:

import { Component, OnInit } from &#39;@angular/core&#39;;
import { ActivatedRoute } from &#39;@angular/router&#39;;

@Component({
  selector: &#39;profile-page&#39;,
  template: `
    <div class="profile">
      <h3 id="nbsp-username-nbsp">{{ username }}</h3>
    </div>
  `
})
export class SettingsComponent implements OnInit {
  username: string;
  constructor(private route: ActivatedRoute) {}
  ngOnInit() {
    this.route.params.subscribe((params) => this.username = params.username);
  }
}

介绍完动态路由,我们来探讨一下如何创建 child routes。

Child routes

实际上每个路由都支持子路由,假设在我们 /settings 设置页面下有 /settings/profile/settings/password 两个页面,分别表示个人资料页和修改密码页。

我们可能希望我们的 /settings 页面拥有自己的组件,然后在设置页面组件中显示 /settings/profile/settings/password 页面。我们可以这样做:

import { SettingsComponent } from &#39;./settings/settings.component&#39;;
import { ProfileSettingsComponent } from &#39;./settings/profile/profile.component&#39;;
import { PasswordSettingsComponent } from &#39;./settings/password/password.component&#39;;

export const ROUTES: Routes = [
  { 
    path: &#39;settings&#39;, 
    component: SettingsComponent,
    children: [
      { path: &#39;profile&#39;, component: ProfileSettingsComponent },
      { path: &#39;password&#39;, component: PasswordSettingsComponent }
    ]
  }
];

@NgModule({
  imports: [
    BrowserModule,
    RouterModule.forRoot(ROUTES)
  ],
})
export class AppModule {}

在这里,我们在 setttings 路由中定义了两个子路由,它们将继承父路由的路径,因此修改密码页面的路由匹配地址是 /settings/password ,依此类推。

接下来,我们需要做的最后一件事是在我们的 SettingsComponent 组件中添加 router-outlet 指令,因为我们要在设置页面中呈现子路由。如果我们没有在 SettingsComponent 组件中添加 router-outlet 指令,尽管 /settings/password 匹配修改密码页面的路由地址,但修改密码页面将无法正常显示。具体代码如下:

import { Component } from &#39;@angular/core&#39;;

@Component({
  selector: &#39;settings-page&#39;,
  template: `
    <div class="settings">
      <settings-header></settings-header>
      <settings-sidebar></settings-sidebar>
      <router-outlet></router-outlet>
    </div>
  `
})
export class SettingsComponent {}

Component-less routes

另一个很有用的路由功能是 component-less 路由。使用 component-less 路由允许我们将路由组合在一起,并让它们共享路由配置信息和 outlet。

例如,我们可以定义 setttings 路由而不需要使用 SettingsComponent 组件:

import { ProfileSettingsComponent } from &#39;./settings/profile/profile.component&#39;;
import { PasswordSettingsComponent } from &#39;./settings/password/password.component&#39;;

export const ROUTES: Routes = [
  {
    path: &#39;settings&#39;,
    children: [
      { path: &#39;profile&#39;, component: ProfileSettingsComponent },
      { path: &#39;password&#39;, component: PasswordSettingsComponent }
    ]
  }
];

@NgModule({
  imports: [
    BrowserModule,
    RouterModule.forRoot(ROUTES)
  ],
})
export class AppModule {}

此时, /settings/profile/settings/password 路由定义的内容,将显示在 AppComponent 组件的 router-outlet 元素中。

loadChildren

我们也可以告诉路由从另一个模块中获取子路由。这将我们谈论的两个想法联系在一起 - 我们可以指定另一个模块中定义的子路由,以及通过将这些子路由设置到特定的路径下,来充分利用 component-less 路由的功能。

让我们创建一个 SettingsModule 模块,用来保存所有 setttings 相关的路由信息:

import { NgModule } from &#39;@angular/core&#39;;
import { CommonModule } from &#39;@angular/common&#39;;
import { Routes, RouterModule } from &#39;@angular/router&#39;;

export const ROUTES: Routes = [
  {
    path: &#39;&#39;,
    component: SettingsComponent,
    children: [
      { path: &#39;profile&#39;, component: ProfileSettingsComponent },
      { path: &#39;password&#39;, component: PasswordSettingsComponent }
    ]
  }
];

@NgModule({
  imports: [
    CommonModule,
    RouterModule.forChild(ROUTES)
  ],
})
export class SettingsModule {}

需要注意的是,在 SettingsModule 模块中我们使用 forChild() 方法,因为 SettingsModule 不是我们应用的主模块。

另一个主要的区别是我们将 SettingsModule 模块的主路径设置为空路径 (’’)。因为如果我们路径设置为 /settings ,它将匹配 /settings/settings ,很明显这不是我们想要的结果。通过指定一个空的路径,它就会匹配 /settings 路径,这就是我们想要的结果。

那么 /settings 路由信息,需要在哪里配置?答案是在 AppModule 中。这时我们就需要用到 loadChildren 属性,具体如下:

export const ROUTES: Routes = [
  {
    path: &#39;settings&#39;,
    loadChildren: () => import(&#39;./settings/settings.module&#39;).then(it => it.SettingsModule)
  }
];

@NgModule({
  imports: [
    BrowserModule,
    RouterModule.forRoot(ROUTES)
  ],
  // ...
})
export class AppModule {}

需要注意的是,我们没有将 SettingsModule 导入到我们的 AppModule 中,而是通过 loadChildren 属性,告诉 Angular 路由依据 loadChildren 属性配置的路径去加载 SettingsModule 模块。这就是模块懒加载功能的具体应用,当用户访问 /settings/** 路径的时候,才会加载对应的 SettingsModule 模块,这减少了应用启动时加载资源的大小。

另外我们传递一个字符串作为 loadChildren 的属性值,该字符串由三部分组成:

需要导入模块的相对路径
# 分隔符
导出模块类的名称

了解完路由的一些高级选项和功能,接下来我们来介绍路由指令。

Router Directives

除了 router-outlet 指令,路由模块中还提供了一些其它指令。让我们来看看它们如何与我们之前介绍的内容结合使用。

为了让我们链接到已设置的路由,我们需要使用 routerLink 指令,具体示例如下:

<nav>
  <a routerLink="/">Home</a>
  <a routerLink="/settings/password">Change password</a>
  <a routerLink="/settings/profile">Profile Settings</a>
</nav>

当我们点击以上的任意链接时,页面不会被重新加载。反之,我们的路径将在 URL 地址栏中显示,随后进行后续视图更新,以匹配 routerLink 中设置的值。

友情提示:我们也可以将 routerLink 的属性值,改成数组形式,以便我们传递特定的路由信息
如果我们想要链接到动态的路由地址,且该地址有一个 username 的路由变量,则我们可以按照以下方式配置 routerLink 对应的属性值:

<a [routerLink]="[&#39;/profile&#39;, username]">
  Go to {{ username }}&#39;s profile.
</a>

routerLinkActive

在实际开发中,我们需要让用户知道哪个路由处于激活状态,通常情况下我们通过向激活的链接添加一个 class 来实现该功能。为了解决上述问题,Angular 路由模块为我们提供了 routerLinkActive 指令,该指令的使用示例如下:

<nav>
  <a routerLink="/settings" routerLinkActive="active">Home</a>
  <a routerLink="/settings/password" routerLinkActive="active">Change password</a>
  <a routerLink="/settings/profile" routerLinkActive="active">Profile Settings</a>
</nav>

通过使用 routerLinkActive 指令,当 a 元素对应的路由处于激活状态时,active 类将会自动添加到 a 元素上。
最后,我们来简单介绍一下 Router API。

Router API

我们可以通过路由还提供的 API 实现与 routerLink 相同的功能。要使用 Router API,我们需要在组件类中注入 Router 对象,具体如下:

import { Component } from &#39;@angular/core&#39;;
import { Router } from &#39;@angular/router&#39;;

@Component({
  selector: &#39;app-root&#39;,
  template: `
    <div class="app">
      <h3 id="Our-nbsp-app">Our app</h3>
      <router-outlet></router-outlet>
    </div>
  `
})
export class AppComponent {
  constructor(private router: Router) {}
}

组件类中注入的 router 对象中有一个 navigate() 方法,该方法支持的参数类型与 routerLink 指令一样,当调用该方法后,页面将会自动跳转到对应的路由地址。具体使用示例如下:

import { Component, OnInit } from &#39;@angular/core&#39;;
import { Router } from &#39;@angular/router&#39;;

@Component({
  selector: &#39;app-root&#39;,
  template: `
    <div class="app">
      <h3 id="Our-nbsp-app">Our app</h3>
      <router-outlet></router-outlet>
    </div>
  `
})
export class AppComponent implements OnInit {
  constructor(private router: Router) {}
  ngOnInit() {
    setTimeout(() => {
      this.router.navigate([&#39;/settings&#39;]);
    }, 5000);
  }
}

若以上代码成功运行,用户界面将在 5 秒后被重定向到 /settings 页面。这个方法非常有用,例如当检测到用户尚未登录时,自动重定向到登录页面。

另一个使用示例是演示页面跳转时如何传递数据,具体如下:

import { Component, OnInit } from &#39;@angular/core&#39;;
import { Router } from &#39;@angular/router&#39;;

@Component({
  selector: &#39;app-root&#39;,
  template: `
    <div class="app">
      <h3 id="Users">Users</h3>
      <div *ngFor="let user of users">
        <user-component 
          [user]="user"
          (select)="handleSelect($event)">
        </user-component>
      </div>
      <router-outlet></router-outlet>
    </div>
  `
})
export class AppComponent implements OnInit {
  users: Username[] = [
    { name: &#39;toddmotto&#39;, id: 0 },
    { name: &#39;travisbarker&#39;, id: 1 },
    { name: &#39;tomdelonge&#39;, id: 2 }
  ];
  
  constructor(private router: Router) {}
  
  handleSelect(event) {
    this.router.navigate([&#39;/profile&#39;, event.name]);
  }
}

Angular 路由的功能非常强大,既可以使用指令方式也可以使用命令式 API,希望本文可以帮助你尽快入门,若要进一步了解路由详细信息,请访问 - Angular Router 官文文档。

路由传参示例
/router/823712312938123;h=h;c=c?code=code

  • HTML:
<a [routerLink]="[&#39;/router&#39;, &#39;823712312938123&#39;, {h:&#39;h&#39;,c:&#39;c&#39;}]"
     [queryParams]="{code:&#39;code&#39;}">RouterLink 跳转</a>
  <a (click)="goToDetail()">Navigate 跳转</a>
  • TS:
 this.router.navigate([`router/823712312938123`, {h: &#39;h&#39;, c: &#39;c&#39;}],
      {queryParams: {code: &#39;code&#39;}})

在component中取数据
router-demo.component.ts

import {Component, OnInit} from &#39;@angular/core&#39;
import {ActivatedRoute} from &#39;@angular/router&#39;

@Component({
  selector: &#39;app-router-demo&#39;,
  templateUrl: &#39;./router-demo.component.html&#39;,
  styleUrls: [&#39;./router-demo.component.less&#39;]
})
export class RouterDemoComponent implements OnInit {

  constructor(private activatedRoute: ActivatedRoute) {
  }

  ngOnInit(): void {
    const {params, queryParams} = this.activatedRoute.snapshot
    console.log(&#39;params&#39;, params)
    console.log(&#39;queryParams&#39;, queryParams, queryParams)

  }

}

Angular에서 Navigate() 및 NavigateByUrl() 사용 방법의 차이점에 대한 간략한 설명

Angular Router API 提供了 navigate()navigateByUrl() 两个方法来实现页面导航。两者区别如下:

  • 使用router.navigateByUrl() 方法与直接改变地址栏上的 URL 地址一样,我们使用了一个新的 URL 地址。
  • 然而 router.navigate() 方法基于一系列输入参数,产生一个新的 URL 地址。

为了更好理解两者区别,有例子,假设当前的 URL 地址是:

/inbox/11/message/22(popup:compose)

当调用 router.navigateByUrl('/inbox/33/message/44') 方法后,当前的 URL 地址将变成/inbox/33/message/44

但若是调用 router.navigate('/inbox/33/message/44') 方法,当前的 URL 地址将变成 /inbox/33/message/44(popup:compose)

更多编程相关知识,请访问:编程入门!!

위 내용은 Angular에서 Navigate() 및 NavigateByUrl() 사용 방법의 차이점에 대한 간략한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 csdn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
JavaScript 엔진 이해 : 구현 세부 사항JavaScript 엔진 이해 : 구현 세부 사항Apr 17, 2025 am 12:05 AM

보다 효율적인 코드를 작성하고 성능 병목 현상 및 최적화 전략을 이해하는 데 도움이되기 때문에 JavaScript 엔진이 내부적으로 작동하는 방식을 이해하는 것은 개발자에게 중요합니다. 1) 엔진의 워크 플로에는 구문 분석, 컴파일 및 실행; 2) 실행 프로세스 중에 엔진은 인라인 캐시 및 숨겨진 클래스와 같은 동적 최적화를 수행합니다. 3) 모범 사례에는 글로벌 변수를 피하고 루프 최적화, Const 및 Lets 사용 및 과도한 폐쇄 사용을 피하는 것이 포함됩니다.

Python vs. JavaScript : 학습 곡선 및 사용 편의성Python vs. JavaScript : 학습 곡선 및 사용 편의성Apr 16, 2025 am 12:12 AM

Python은 부드러운 학습 곡선과 간결한 구문으로 초보자에게 더 적합합니다. JavaScript는 가파른 학습 곡선과 유연한 구문으로 프론트 엔드 개발에 적합합니다. 1. Python Syntax는 직관적이며 데이터 과학 및 백엔드 개발에 적합합니다. 2. JavaScript는 유연하며 프론트 엔드 및 서버 측 프로그래밍에서 널리 사용됩니다.

Python vs. JavaScript : 커뮤니티, 라이브러리 및 리소스Python vs. JavaScript : 커뮤니티, 라이브러리 및 리소스Apr 15, 2025 am 12:16 AM

Python과 JavaScript는 커뮤니티, 라이브러리 및 리소스 측면에서 고유 한 장점과 단점이 있습니다. 1) Python 커뮤니티는 친절하고 초보자에게 적합하지만 프론트 엔드 개발 리소스는 JavaScript만큼 풍부하지 않습니다. 2) Python은 데이터 과학 및 기계 학습 라이브러리에서 강력하며 JavaScript는 프론트 엔드 개발 라이브러리 및 프레임 워크에서 더 좋습니다. 3) 둘 다 풍부한 학습 리소스를 가지고 있지만 Python은 공식 문서로 시작하는 데 적합하지만 JavaScript는 MDNWebDocs에서 더 좋습니다. 선택은 프로젝트 요구와 개인적인 이익을 기반으로해야합니다.

C/C에서 JavaScript까지 : 모든 것이 어떻게 작동하는지C/C에서 JavaScript까지 : 모든 것이 어떻게 작동하는지Apr 14, 2025 am 12:05 AM

C/C에서 JavaScript로 전환하려면 동적 타이핑, 쓰레기 수집 및 비동기 프로그래밍으로 적응해야합니다. 1) C/C는 수동 메모리 관리가 필요한 정적으로 입력 한 언어이며 JavaScript는 동적으로 입력하고 쓰레기 수집이 자동으로 처리됩니다. 2) C/C를 기계 코드로 컴파일 해야하는 반면 JavaScript는 해석 된 언어입니다. 3) JavaScript는 폐쇄, 프로토 타입 체인 및 약속과 같은 개념을 소개하여 유연성과 비동기 프로그래밍 기능을 향상시킵니다.

JavaScript 엔진 : 구현 비교JavaScript 엔진 : 구현 비교Apr 13, 2025 am 12:05 AM

각각의 엔진의 구현 원리 및 최적화 전략이 다르기 때문에 JavaScript 엔진은 JavaScript 코드를 구문 분석하고 실행할 때 다른 영향을 미칩니다. 1. 어휘 분석 : 소스 코드를 어휘 단위로 변환합니다. 2. 문법 분석 : 추상 구문 트리를 생성합니다. 3. 최적화 및 컴파일 : JIT 컴파일러를 통해 기계 코드를 생성합니다. 4. 실행 : 기계 코드를 실행하십시오. V8 엔진은 즉각적인 컴파일 및 숨겨진 클래스를 통해 최적화하여 Spidermonkey는 유형 추론 시스템을 사용하여 동일한 코드에서 성능이 다른 성능을 제공합니다.

브라우저 너머 : 실제 세계의 JavaScript브라우저 너머 : 실제 세계의 JavaScriptApr 12, 2025 am 12:06 AM

실제 세계에서 JavaScript의 응용 프로그램에는 서버 측 프로그래밍, 모바일 애플리케이션 개발 및 사물 인터넷 제어가 포함됩니다. 1. 서버 측 프로그래밍은 Node.js를 통해 실현되며 동시 요청 처리에 적합합니다. 2. 모바일 애플리케이션 개발은 재교육을 통해 수행되며 크로스 플랫폼 배포를 지원합니다. 3. Johnny-Five 라이브러리를 통한 IoT 장치 제어에 사용되며 하드웨어 상호 작용에 적합합니다.

Next.js (백엔드 통합)로 멀티 테넌트 SAAS 애플리케이션 구축Next.js (백엔드 통합)로 멀티 테넌트 SAAS 애플리케이션 구축Apr 11, 2025 am 08:23 AM

일상적인 기술 도구를 사용하여 기능적 다중 테넌트 SaaS 응용 프로그램 (Edtech 앱)을 구축했으며 동일한 작업을 수행 할 수 있습니다. 먼저, 다중 테넌트 SaaS 응용 프로그램은 무엇입니까? 멀티 테넌트 SAAS 응용 프로그램은 노래에서 여러 고객에게 서비스를 제공 할 수 있습니다.

Next.js (Frontend Integration)를 사용하여 멀티 테넌트 SaaS 응용 프로그램을 구축하는 방법Next.js (Frontend Integration)를 사용하여 멀티 테넌트 SaaS 응용 프로그램을 구축하는 방법Apr 11, 2025 am 08:22 AM

이 기사에서는 Contrim에 의해 확보 된 백엔드와의 프론트 엔드 통합을 보여 주며 Next.js를 사용하여 기능적인 Edtech SaaS 응용 프로그램을 구축합니다. Frontend는 UI 가시성을 제어하기 위해 사용자 권한을 가져오고 API가 역할 기반을 준수하도록합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경