当用户通过锚链接导航时,我希望页面向下滚动到我的锚标签。
我正在使用react-router 4,我已按如下方式定义:
导航栏:
export default (props) => {
const {
updateModal,
updateRoute,
} = props
return(
<Navbar fluid collapseOnSelect>
<Nav>
<NavDropdown eventKey="4" title="Solutions" id="nav-dropdown" noCaret>
<MenuItem eventKey="4.1">
<Link to='/solution#ipos'>TESTING ANCHOR</Link>
</MenuItem>
...
某些路线:
export default class extends Component {
constructor() {
super()
this.state = {
isLoading: true
}
}
render() {
return (
<Grid className='solutions' fluid>
<Row className='someClass'>
<div>
<h2><a href='ipos' id='ipos'>Ipos morna santos paros</a></h2>
...
当我点击navebar中的锚链接时,我可以在url和我的redux商店中看到哈希锚标记,它确实导航到新路由,但它不会向下滚动到标记本身。
由我来创建滚动功能或它应该如何正常工作?
答案 0 :(得分:9)
要向下滚动到锚标记,您需要安装React Router Hash Link,其中包含:
npm install --save react-router-hash-link
然后导入哈希链接:
import { HashLink as Link } from 'react-router-hash-link';
然后使用Hash Link,例如:
<Link to="/pathLink#yourAnchorTag">Your link text</Link>
并在目标组件中,例如:
<div id= "yourAnchorTag">
<p>Linked to here<p>
</div>
答案 1 :(得分:7)
反应路由器是一个已知问题。 (https://github.com/ReactTraining/react-router/issues/394#issuecomment-220221604)
也有解决方案。 https://www.npmjs.com/package/react-router-hash-link这个包解决了这个问题。
您必须使用此Hash Link
作为Link
,如下所示。
import { HashLink as Link } from 'react-router-hash-link';
答案 2 :(得分:3)
如果只有很少的可预测锚点链接,则实现正常行为的最简单方法是手动scrollIntoView()
元素,前提是Window.location.href
中有预期的锚点标签。
class Page extends react.Component {
componentDidMount() {
if (this.$ref && location.href.includes('#my-ref')) {
this.$ref.scrollIntoView({
// optional params
behaviour: 'smooth',
block: 'start',
inline: 'center',
});
}
}
render() {
return (
// This is the div you want to scroll to
<div ref={ref => {
this.$ref = ref;
}}>
Other content
</div>
);
}
}
答案 3 :(得分:2)
您可以像这样将对象传递给Link
<Link
to={{
pathname: "/courses",
search: "?sort=name",
hash: "#the-hash",
state: { fromDashboard: true }
}}
/>
答案 4 :(得分:0)
类似于@filippo,但带有React钩子和一些Typescript。
import React, { Functioncomponent, useEffect, useRef } from 'react';
import { useLocation } from 'react-router-dom';
const MyFunc: FunctionComponent = () => {
const myRef = useRef<null | HTMLDivElement>(null);
useEffect(() => {
if (myRef && location.hash.includes('#my-ref')) {
myRef?.current?.scrollIntoView({
behavior: 'smooth',
block: 'start',
inline: 'center'
});
}
}, [myRef, location.hash]);
return (
<div> Some stuff before </div>
<div ref={myRef}> Scroll to me </div>
<div> Some stuff after </div>
)
}
export default MyFunc;
答案 5 :(得分:0)
我使用的是盖茨比,我的解决方案是使用@reach/router
的形式:
import { navigate } from '@reach/router';
navigate('#some-link');
答案 6 :(得分:0)
在锚标记中使用哈希片段的另一种方法是查询 DOM 并使用 scrollIntoView()
作为 onClick
事件的一部分。
function handleClick(evt) {
...
document.querySelector('[id="label-input-1"]').scrollIntoView();
}
...
<a href={''} onClick={e => handleClick(e)}>Foo</a>
当窗口位置用哈希地址更新时,这只是绕过路由器刷新页面。