`setState` на портале React, содержащем текстовый ввод, заставляет браузер прокручиваться в Safari - PullRequest
0 голосов
/ 06 сентября 2018

Если поместить текстовый ввод в оверлей портала React и прокрутить содержимое рядом с ним, любое событие, изменяющее состояние, заставляет Safari прокручивать портал (который находится внизу страницы).

Для воссоздания

  • Портал должен быть добавлен как элемент брата к корню (и дочерний элемент к телу)
  • Ввод текста должен быть размещен внутри портала
  • setState должен называться
  • setState не должен влиять на значение ввода текста
  • Содержимое в корне должно быть достаточно длинным для прокрутки страницы
  • происходит только в Safari (в настоящее время используется 11.1.2)

    import * as React из 'реакции'; import {createPortal} из'act-dom ';

    экспорт класс по умолчанию App extends React.Component { const {portalActive, randomBoolean} = this.state;

    togglePortal = () => { this.setState (({portalActive}) => { return {portalActive:! portalActive}; }); }; * * Тысяча двадцать-семь

    toggleBoolean = () => { this.setState (({randomBoolean}) => { return {randomBoolean:! randomBoolean}; }); }; * 1 029 *

    render () { const textInput =; const portal = this.state.portalActive ? ({ввод текста}) : ноль;

    return (
      <>
        <button onClick={this.togglePortal}
        {portal}
        {Array.from({length: 40}).map(() => (
          <p>Content that causes scrolling</p>
        ))}
      </>
    );
    

    } }

    класс Portal расширяет React.Component { const {children, idPrefix} = this.props; componentWillMount () { const portalNode = document.createElement ('div'); document.body.appendChild (portalNode); } componentWillUnmount () { document.body.removeChild (portalNode); } render () { return createPortal (children, portalNode); } }

enter image description here

enter image description here

...