Angular 8 routerLink生成href时#被转义为%23问题求助
问题成因解析
嘿,这个问题我之前在项目里也碰到过,核心原因和Angular Router对routerLink的处理逻辑直接相关:
RouterLink的定位是路由路径,而非完整URL
Angular的routerLink指令本质是为单页应用构建路由导航,它默认会把你传入的字符串当作路由路径的组成部分,而不是包含锚点(fragment)的完整URL。所以当你直接把/some-component/description#specific这种带#的字符串传给[routerLink]时,Angular会把#视为路径中的普通特殊字符,按照URL编码规则自动转义成%23——这是路由系统对路径内特殊字符的标准处理逻辑。为什么
decodeURIComponent无效?
你尝试用decodeURIComponent解码其实起不到作用,因为Angular在处理routerLink值的流程中,会对传入的内容做编码处理。哪怕你提前解码了字符串,Angular依然会把其中的#识别为路径字符,重新编码成%23。
简单来说,Angular Router并没有把你传入的#识别为锚点标识符,而是把它当成了路径的一部分,这才导致了转义问题。如果要正确生成带锚点的路由链接,应该用routerLink的数组语法配合fragment属性,比如:
<a [routerLink]="['/some-component/description']" fragment="specific">{{ subItem.name }}</a>
这样Angular就会正确把specific解析为锚点,生成的href就是/some-component/description#specific了。
内容的提问来源于stack exchange,提问作者Marcin Wojtach
相关产品推荐
相关产品推荐

