返回博客

在 Angular Router 中使用查询参数

在 Angular Router 中使用查询参数

介绍

在构建应用程序时,可能会遇到需要传入一些参数来描述路由行为的场景。在 Angular 中,这些被称为 查询 参数,并且它们是可选的。查询参数不应与常规的 路由 参数混淆,后者是必填参数,且仅绑定到单个路由。

为了弄清路由参数和查询参数之间的区别,假设您正在构建一个存储产品的应用程序。您可以拥有一个使用以下内容打开任何特定产品的路由: product_id。您还可以指定一个查询参数: read_only。当 read_only 被设置为 true 时,用户只能查看记录,而当 read_onlyfalse 时,用户还可以编辑记录。这样,仅使用一个路由,就可以同时处理编辑和查看的使用场景。这里 product_id路由参数,而 read_only(它是可选的)则是 查询 参数.

前提条件

要充分理解本文,需要熟悉使用 Angular 构建应用程序。拥有 Angular Router、RouterLink 和 ActivatedRoute 的使用经验也会有所帮助。

使用 Router.navigate 传递查询参数

如果您正在使用 Router.navigate 在路由之间进行导航,请使用 queryParams 来发送查询参数。

在上面的示例中,如果我们希望访问者看到按受欢迎程度排序的产品列表,我们将使用以下代码:

使用此代码后,URL 将变为:

然而,在某些场景下,我们可能需要在导航时传递多个参数。例如,如果我们想按受欢迎程度和价格对产品进行排序,可以使用以下代码:

这一次,URL 将变为以下内容:

以上就是如何使用以下内容设置查询参数的全部内容: queryParams.

使用 queryParamsHandling 防止查询参数丢失

在路由之间导航时,参数往往会丢失。假设我们传入一个参数 arg0,在后续路由发生时它将不会被传递。我们可以使用 queryParamsHandling 并将其值设置为 preservemerge.

在上述示例中,假设我们希望将访问者引导至 brands 页面,从 product 页面(带有路由参数 { order: 'popular' }),同时保留路由参数。为此,我们可以使用 queryParamsHandling 并将其设置为 preserve :

这将使 URL 看起来像:

接下来,假设我们想保留上一个路由的查询参数 { order: 'popular' } ,同时添加新参数 { price: 'high-to-low' }。我们可以将 queryParamsHandling 设置为 merge:

使用上述代码,URL 将变为:

到这里,我们总结了如何使用 queryParamsHandling 来保留或合并查询参数。

使用 RouterLink 传递查询参数

考虑到我们之前的链接,如果我们想使用 RouterLink 指令进行导航,我们将需要使用 queryParams 来传递查询参数,如下所示:

请注意我们是如何通过单向绑定将对象传递给 queryParams 的。我们也可以将整个对象作为 queryParams .

此外,如果我们想在后续导航中继续携带这些查询参数,可以使用 queryParamsHandling 选项。queryParamsHandling 的可选值有 merge  和 preserve:

在这里,我们已经看到了如何传递 queryParams 以及如何使用 queryParamsHandlingRouterLink 中进行处理.

读取查询参数值

到目前为止,我们已经学习了如何在路由中传递查询参数。这些参数是可选的,用于向目标页面传递一些信息。发送参数只是其中一部分,从 URL 中读取参数并使用它们也同样必要。

在 Angular 中,我们使用 ActivatedRoute 类来读取路由查询参数。 ActivatedRoute 具有一个名为 queryParams 的可观察属性,用于获取当前 URL 的参数。

假设我们正在处理以下 URL:

要在代码中访问查询参数 order,我们使用以下代码:

在这里,我们将在控制台中看到 order 查询参数的值为 popular 打印出来。如果我们有多个查询参数,我们可以使用 queryParamMap 属性,它返回一个可观察对象 paramsMap 对象。

如果我们有包含多个查询参数的 URL,例如:

我们可以使用以下代码访问这些查询参数:

使用 对象展开运算符,我们得到以下结果:

最后,您应该能够理解如何从生成的路由中访问查询参数。

结论

在本教程中,我们了解了查询参数和路由参数之间的区别。我们还研究了如何将参数作为查询参数跨路由传递,以及如何使用 queryParamsqueryParamsHandlingRouter.navigateRouterLink。我们还学习了如何处理 queryParamsqueryParamMapActivatedRoute.

Angular 的基础需要 JavaScript。如果您想进一步了解 JavaScript,可以查看以下博客:

祝您编程愉快!

author

Shreyas Patil

作者 · CloudSigma

Preslav Dobrev 是 CloudSigma 的创意设计师,专注于通过传统和创新营销渠道打造一致的企业形象。他擅长将艺术愿景与战略营销相融合,创造具有影响力的品牌叙事。

评论

暂无评论。发表第一条评论吧。