如何在 Angular 路由中使用查询参数

简介: 如何在 Angular 路由中使用查询参数

简介

Angular 中的查询参数允许在应用程序的任何路由之间传递可选参数。查询参数与常规路由参数不同,常规路由参数仅在一个路由上可用,并且是不可选的(例如 /product/:id)。

在本文中,您将参考一个显示产品列表的应用程序示例。您将提供可选的 orderprice-range 值,接收组件可以读取并对其进行操作。提供的值将影响产品列表的排序和过滤。

先决条件

要完成本教程,您需要:

  • 对 Angular 的 RouterRouterLinkActivatedRoute 有一定的了解可能会有所帮助。

使用 Router.navigate 传递查询参数

如果您使用 Router.navigate 命令以编程方式导航到路由,您将使用 queryParams 传递查询参数。

在我们的示例中,如果我们希望将访问者导航到按热门程度排序的产品列表,代码如下:

goProducts() {
  this.router.navigate(
    ['/products'],
    { queryParams: { order: 'popular' } }
  );
}

这将导致类似以下的 URL:

http://localhost:4200/products?order=popular

您还可以提供多个查询参数。在我们的示例中,如果我们希望将访问者导航到按热门程度排序并且价格范围不便宜的产品列表,代码如下:

goProducts() {
  this.router.navigate(
    ['/products'],
    { queryParams: { order: 'popular', 'price-range': 'not-cheap' } }
  );
}

这将导致类似以下的 URL:

http://localhost:4200/products?order=popular&price-range=not-cheap

现在,您已经了解了如何使用 queryParams 设置查询参数。

使用 queryParamsHandling 保留或合并查询参数

默认情况下,查询参数在任何后续导航操作中都会丢失。为了防止这种情况发生,您可以将 queryParamsHandling 设置为 'preserve''merge'

在我们的示例中,如果我们希望将带有查询参数 { order: 'popular' } 的页面导航到 /users 页面并保留查询参数,我们将使用 'preserve'

goUsers() {
  this.router.navigate(
    ['/users'],
    { queryParamsHandling: 'preserve' }
  );
}

这将导致类似以下的 URL:

http://localhost:4200/users?order=popular

在我们的示例中,如果我们希望将带有查询参数 { order: 'popular' } 的页面导航到 /users 页面并传递查询参数 { filter: 'new' },我们将使用 'merge'

goUsers() {
  this.router.navigate(
    ['/users'],
    {
      queryParams: { filter: 'new' },
      queryParamsHandling: 'merge' }
    );
}

这将导致类似以下的 URL:

http://localhost:4200/users?order=popular&filter=new

现在,您已经了解了如何使用 queryParamsHandling 保留和合并查询参数。

使用 RouterLink 传递查询参数

在我们的示例中,如果您使用 RouterLink 指令导航到路由,您将像这样使用 queryParams

<a
  [routerLink]="['/products']"
  [queryParams]="{ order: 'popular'}"
>
  Products
</a>

在我们的示例中,如果您希望在后续导航中 'preserve''merge' 查询参数,您将像这样使用 queryParamsHandling

<a
   [routerLink]="['/users']"
   [queryParams]="{ filter: 'new' }"
   queryParamsHandling="merge"
>
  Users
</a>

现在您了解了如何在 RouterLink 中使用 queryParamsqueryParamsHandling

访问查询参数值

现在我们知道如何传递可选的查询参数到一个路由,让我们看看如何在结果路由上访问这些值。ActivatedRoute 类有一个 queryParams 属性,返回当前 URL 中可用的查询参数的 observable。

给定以下路由 URL:

http://localhost:4200/products?order=popular

我们可以这样访问 order 查询参数:

// ...
import { ActivatedRoute } from '@angular/router';
import 'rxjs/add/operator/filter';
@Component({ ... })
export class ProductComponent implements OnInit {
  order: string;
  constructor(private route: ActivatedRoute) { }
  ngOnInit() {
    this.route.queryParams
      .filter(params => params.order)
      .subscribe(params => {
        console.log(params); // { order: "popular" }
        this.order = params.order;
        console.log(this.order); // popular
      }
    );
  }
}

在控制台日志中,我们会看到 params 对象:

{ order: "popular" }

以及 params.order 的值:

popular

还有 queryParamMap,它返回一个带有 paramMap 对象的 observable。

给定以下路由 URL:

http://localhost:4200/products?order=popular&filter=new

我们可以这样访问查询参数:

this.route.queryParamMap
  .subscribe((params) => {
    this.orderObj = { ...params.keys, ...params };
  }
);

我们在这里使用了对象展开运算符,这是 orderObj 中数据的结果形式:

{
  "0": "order",
  "1": "filter",
  "params": {
    "order": "popular",
    "filter": "new"
  }
}

现在,您已经了解了如何使用 queryParamsqueryParamMap 来访问结果路由上的值。

结论

在本文中,您使用不同的示例来设置和获取 Angular 中的查询参数。您了解了在 Router.navigateRouterLink 中使用 queryParamsqueryParamsHandling,以及在 ActivatedRoute 中使用 queryParamsqueryParamMap

如果您想了解更多关于 Angular 的知识,请查看我们的 Angular 专题页面,了解更多练习和编程项目。


目录
相关文章
|
JavaScript 前端开发 应用服务中间件
angular引入包、路由权限配置、打包问题与nginx配置问题(简单部署)
angular引入包、路由权限配置、打包问题与nginx配置问题(简单部署)
300 0
【拦截器】Angular10轻松实现请求头传参数,针对性不同情况下,拦截器HttpInterceptor的创建和使用
【拦截器】Angular10轻松实现请求头传参数,针对性不同情况下,拦截器HttpInterceptor的创建和使用
【拦截器】Angular10轻松实现请求头传参数,针对性不同情况下,拦截器HttpInterceptor的创建和使用
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
几个经常用到的angular路由Router、ActivatedRoute 知识点:嵌套路由、路由跳转、路由传参、路由参数获取
几个经常用到的angular路由Router、ActivatedRoute 知识点:嵌套路由、路由跳转、路由传参、路由参数获取
几个经常用到的angular路由Router、ActivatedRoute 知识点:嵌套路由、路由跳转、路由传参、路由参数获取
|
JavaScript
解决vue项目build之后部署到服务器访问的时候出现报错:Uncaught SyntaxError: Unexpected token ‘<‘ chunk-vendors:XXXXXX
解决vue项目build之后部署到服务器访问的时候出现报错:Uncaught SyntaxError: Unexpected token ‘<‘ chunk-vendors:XXXXXX
解决vue项目build之后部署到服务器访问的时候出现报错:Uncaught SyntaxError: Unexpected token ‘<‘ chunk-vendors:XXXXXX
|
SEO 搜索推荐 数据采集
让 JSF 应用秒变搜索引擎宠儿!揭秘 SEO 优化的神奇魔法,让你的网站脱颖而出!
【8月更文挑战第31天】随着互联网的发展,搜索引擎已成为用户获取信息的主要途径,SEO 对 Web 应用至关重要。本文介绍如何提升 JavaServer Faces(JSF)应用的 SEO 友好性,包括关键词优化、网页结构优化和外部链接建设等基础知识,并提出了使用语义化 HTML 标签、优化页面标题和描述、生成静态 HTML 页面及 URL 重写等具体策略,帮助您的网站在搜索引擎中获得更高排名。
84 0
|
安全 开发者
精通Angular路由管理:从基础设置到高级配置,打造复杂SPA导航系统的全方位指南
【8月更文挑战第31天】在单页应用(SPA)中,路由管理至关重要。Angular通过其强大的路由模块提供灵活高效的解决方案。本文通过代码示例详细介绍如何在Angular中设置和管理路由,包括基础路由配置、懒加载、路由保护及高级配置,帮助开发者构建高效安全的导航系统,满足复杂SPA需求。随着Angular的发展,路由管理将更加完善,值得持续关注。
165 0
|
JavaScript 前端开发 API
如何在 Angular 路由中使用路由解析器
如何在 Angular 路由中使用路由解析器
84 0
如何在 Angular 路由中使用路由守卫
如何在 Angular 路由中使用路由守卫
164 0
|
JavaScript 前端开发 测试技术
如何在 Angular 中使用懒加载路由
如何在 Angular 中使用懒加载路由
138 0