it-swarm.com.ru

Обработка анимации прокрутки в React

Каков правильный способ работы с позицией прокрутки в React? Мне действительно нравится плавная прокрутка из-за лучшего UX. Поскольку манипулирование DOM в React является анти-паттерном, я столкнулся с проблемой: как плавно прокрутить до некоторой позиции/элемента? Я обычно меняю значение 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 ?

11
sympi

Вы можете просто использовать refs и метод scrollIntoViewbehavior: '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

8
bbrinx

В React есть несколько библиотек для прокрутки до якорей. Выбор зависит от того, какие функции вы ищете, и от существующей настройки вашей страницы.

React Scrollable Anchor - это легкая библиотека, специально предназначенная для прокрутки к якорям, которые сопоставлены с хешами URL. Он также обновляет хэш URL на основе текущего раздела. [Полное раскрытие: я автор этой библиотеки]

React Scroll, упомянутый в другом ответе, является более полнофункциональной библиотекой для прокрутки до якорей, без какого-либо отражения местоположения в URL.

Вы также можете подключить что-то вроде React Router Hash Link Scroll , если вы уже используете React Router, который затем будет также привязываться к вашему хешу URL.

1
gabergg

Уже есть пара хороших пакетов, которые могут с этим справиться:

https://github.com/fisshy/react-scroll - Демо

https://www.npmjs.com/package/react-scroll-to-component Простая прокрутка до компонента

Надеюсь это поможет!

1
Chase DeAnda

Мне очень нравится веб-сайт реакции-маршрутизатора в разделе API, кажется, они используют этот компонент scrollToDoc это действительно приятный перевод обычной функции плавной прокрутки VanillaJS в React, которая зависит от react-motion !

0
PaulCo

window.scroll({top: 0, left: 0, behavior: 'smooth' }) работает для меня.

Вам также необходимо проверить совместимость браузера

Или используйте polyfill

0
transang