如果将文本输入放在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); }}