Introduction
今天我们来介绍一下Angular中的NavigationExtras接口,我们在使用Router进行导航时,可以通过NavigationExtras
接口来传递额外的导航参数。
NavigationExtras
接口定义如下:
1 | interface NavigationExtras { |
relativeTo
relativeTo
属性是一个ActivatedRoute
对象,用来指定导航的相对路径。假设有如下路由配置,ParentComponent
下有两个子路由ListComponent
和ChildComponent
.
1 | [{ |
如果我们当前位于ChildComponent
,想要导航到ListComponent
,可以使用relativeTo
属性来指定相对路径,其中..
表示上一级路径,也就是ParentComponent
。../list
表示导航到parent/list
路径,也就是ParentComponent下的
ListComponent`。
1 | ({...}) |
queryParams
queryParams
属性是一个Params
对象,用来指定导航时的查询参数。比如我们要导航到/list
路径,并且带上查询参数page=1
,可以使用queryParams
属性。
1 | // Navigate to /results?page=1 |
fragment
fragment
属性是一个字符串,用来指定导航时的fragment
,fragment
是以#
号开头的标识符。比如我们要导航到/list
路径,并且带上片段标识符top
,可以使用fragment
属性。
1 | // Navigate to /results#top |
queryParamsHandling
queryParamsHandling
属性是一个枚举类型,用来指定导航时如何处理查询参数。有以下几种取值:
- preserve : Preserve parameters in original url and discard new parameters in target url
- merge : Merge target url query params with original url parameters.
在下面的代码中使用了preserve
参数,表示保留原始url中的查询参数。而目标url中的查询参数{page: 2}
将被忽略。导航结束后,url为/view2?page=1
。
1 | // from /view1?page=1 to /view2?page=1 |
在下面的代码中使用了merge
参数,表示将目标url中的查询参数与原始url中的查询参数合并。导航结束后,url为/view2?page=1&otherKey=2
。
1 | // from /view1?page=1 to /view2?page=1&otherKey=2 |
需要注意,如果源url和目标url中都有相同的查询参数,那么目标url中的查询参数会覆盖源url中的查询参数。下面的例子中,导航后,url为/view2?page=2&id=2
。page
参数的值被目标url中的值覆盖了。
1 | // from /view1?page=1 to /view2?page=2&id=2 |
preserveFragment
preserveFragment
属性是一个布尔值,用来指定导航时是否保留原始url中的fragment
标识符。如果设置为true
,则保留原始url中的片段标识符,否则忽略。默认值为false
。
1 | // from /view1#top to /view2#top |
1 | // from /view1#top to /view2 |
onSameUrlNavigation
onSameUrlNavigation属性是一个枚举类型,用来指定当导航到相同url时的行为。有以下几种取值:
- reload : Reload the page
- ignore : Ignore the navigation
1 | // from /view1 to /view1 |
skipLocationChange
skipLocationChange
属性是一个布尔值,用来指定是否在url中添加一个新的历史记录。如果设置为true
,则不会添加新的历史记录,导航结束后,浏览器的历史记录不会改变。默认值为false
。
假设有如下导航:view1
-> view2
-> view3
, 如果在view2
-> view3
的导航中设置skipLocationChange
为true
,则导航结束后,浏览器的历史记录为view1
-> view2
,而不是view1
-> view2
-> view3
。导航结束后,浏览器的url为/view2
,点击浏览器的回退按钮,会回到/view1
。
注意以上只是本质行为,还有一个视觉行为,如果设置为true
,则导航结束后,浏览器的url不会改变,但是页面内容会改变。这样用户在浏览器的历史记录中看不到导航记录。
以下代码从/view1
导航到/view2
,导航结束后,浏览器的url不会改变,仍然是/view1
,但是页面内容会改变, 显示/view2
的内容。
1 | // from /view1 to /view2 |
replaceUrl
replaceUrl
属性是一个布尔值,用来指定导航时是否替换当前的历史记录。如果设置为true
,则替换当前的历史记录,默认值为false
。
假设有如下导航,view1
-> view2
-> view3
,如果在view2
-> view3
的导航中设置replaceUrl
为true
,则导航结束后,浏览器url为/view3
浏览器的历史记录为view1
-> view3
,而不是view1
-> view2
-> view3
(view2
被view3
替换掉)。导航结束后,浏览器的url为/view3
,点击浏览器的回退按钮,会回到/view1
。
1 | // from /view2 to /view3 |
state
待续
info
待续