React 16.8+,函数式组件
const ScrollDemo = () => {
const myRef = useRef(null)
const executeScroll = () => myRef.current.scrollIntoView()
// run this function from an event handler or an effect to execute scroll
return (
<>
<div ref={myRef}>Element to scroll to</div>
<button onClick={executeScroll}> Click to scroll </button>
</>
)
}
单击此处获取有关 StackBlits 的完整演示
React 16.3+,类组件
class ReadyToScroll extends Component {
constructor(props) {
super(props)
this.myRef = React.createRef()
}
render() {
return <div ref={this.myRef}>Element to scroll to</div>
}
executeScroll = () => this.myRef.current.scrollIntoView()
// run this method to execute scrolling.
}
类组件 - Ref 回调
class ReadyToScroll extends Component {
render() {
return <div ref={ (ref) => this.myRef=ref }>Element to scroll to</div>
}
executeScroll = () => this.myRef.scrollIntoView()
// run this method to execute scrolling.
}
不要使用字符串引用。
字符串引用会损害性能,不可组合,并且即将消失(2018 年 8 月)。
字符串引用有一些问题,被认为是遗留的,可能会在未来的版本之一中被删除。[官方 React 文档]
资源 1资源 2
可选:平滑滚动动画
/* css */
html {
scroll-behavior: smooth;
}
将 ref 传递给孩子
我们希望 ref 附加到一个 dom 元素,而不是一个 react 组件。因此,当将其传递给子组件时,我们无法命名 prop ref。
const MyComponent = () => {
const myRef = useRef(null)
return <ChildComp refProp={myRef}></ChildComp>
}
然后将 ref 属性附加到 dom 元素。
const ChildComp = (props) => {
return <div ref={props.refProp} />
}