在 React 中处理滚动动画

新手上路,请多包涵

在 React 中处理滚动位置的 正确 方法是什么?由于更好的用户体验,我真的很喜欢流畅的滚动。由于在 React 中操作 DOM 是一种反模式,我遇到了问题:如何平滑地滚动到某个位置/元素?我通常更改元素的 scrollTop 值,但这是对 DOM 的操作,这是不允许的。

JSBIN

代码:

 import React from 'react';
import ReactDOM from 'react-dom';

class App extends React.Component {
  handleClick = e => {
    for (let i = 1; i <= 100; i++) {
      setTimeout(() => (this.node.scrollTop = i), i * 2);
    }
  };

  render() {
    const someArrayToMap = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

    return (
      <div ref={node => this.node = node} style={{overflow: 'auto', height: '100vh'}}>
        <button onClick={this.handleClick}>CLICK TO SCROLL</button>
        {
            [...someArrayToMap,
            ...someArrayToMap,
            ...someArrayToMap,
            ...someArrayToMap,
            ...someArrayToMap,
            ...someArrayToMap,
            ...someArrayToMap].map((e, i) => <div key={i}>some text here</div>)
        }
      </div>
    );
  }
}

ReactDOM.render(<App />, document.getElementById('root'));

如何以 React 方式实现这一点?

原文由 sympi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 360
1 个回答

您可以只使用 refs 和 scrollIntoView 方法(使用 behavior: 'smooth' 进行平滑滚动)。它只有几行代码,不需要包。

说这是你想滚动到的地方

<p ref={this.myRef} className="scrollToHere">[1] ...</p>

还有某种按钮

<button onClick={() => {this.scroll(this.myRef)}} className="footnote">[1]</button>

调用滚动方法

class App extends Component {
  constructor() {
    super()
    this.myRef = React.createRef();

  scroll(ref) {
    ref.current.scrollIntoView({behavior: 'smooth'})
  }
}

编辑:因为这种方法还没有被所有浏览器支持( 浏览器支持概述),你可能想要使用 polyfill

原文由 bbrinx 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题