React Router 浏览器历史推送和锚点

Posted

技术标签:

【中文标题】React Router 浏览器历史推送和锚点【英文标题】:React Router browserHistory push and anchors 【发布时间】:2018-05-16 18:17:51 【问题描述】:

使用 React Router 4 中的 browserHistory 以编程方式导航到锚点时:

import  withRouter  from 'react-router-dom'
...
props.history.push('#blah')

我可以看到地址栏中的哈希值发生了变化,但页面没有滚动到相关的锚点。我已经用标准<a href="#blah">Blah</a> 对其进行了检查,并且效果很好。知道我做错了什么吗?谢谢:)

更新 刚刚检查过,<Link to="#blah">Blah</Link> 也不起作用......我假设反应 Links 也使用历史对象工作?

【问题讨论】:

我正在使用浏览器路由器,这就是我谈论浏览器历史的原因。正如您从我上面的帖子中看到的那样,我已经完全尝试了您建议的代码行(this 除外,因为我正在使用功能组件) @Aaqib 不正确。这是完全不相关的问题。推路径工作正常,推哈希不行。 【参考方案1】:

经过一番调查,我决定添加一个函数来处理 componentDidUpdate 生命周期事件:

componentDidUpdate: props => 
  const selected = props.history.location.hash
  if(selected && selected.length > 0) 
    const elem = document.querySelector(selected)
    elem && elem.scrollIntoView()
  

这很好地解决了这个问题:)

【讨论】:

这行得通,我只需要使用querySelector() 而不是getElementById(),因为selected 包含英镑符号#。 getElementById 只需要没有 # 的 ID。 querySelector 工作正常。

以上是关于React Router 浏览器历史推送和锚点的主要内容,如果未能解决你的问题,请参考以下文章

框架和锚点

使用 react-router-dom,如何从 React 组件外部访问浏览器历史对象?

React-router 和 iframe,浏览器历史

使用 React Router 进行服务器端渲染“浏览器历史记录需要一个 DOM”

React-router:更改 URL 并清除历史记录

React/Router/MemoryRouter - 如何传递历史属性并在子组件中使用 push()?