如果将文本输入放在React门户覆盖中并且与其相邻的内容滚动,则任何更改状态的事件都会导致Safari滚动到门户(页面底部) .

To recreate

  • Portal必须作为兄弟元素附加到根(以及子体到身体)

  • 必须在门户网站内放置文本输入
    必须调用

  • setState

  • setState 不必影响文本输入的值

  • root中的内容必须足够长才能滚动页面

  • 仅在Safari中发生(目前使用11.1.2)

import * as React from'reaction';从'react-dom'导入;

export default class App extends React.Component {const {portalActive,randomBoolean} = this.state;

togglePortal =()=> {this.setState(()=> {return {portalActive:!portalActive};}); };

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

render(){const textInput =; const portal = this.state.portalActive? ():null;

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

}}

class 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