【问题标题】:Rendering html on top without changing viewport in React?在 React 中在不更改视口的情况下在顶部渲染 html?
【发布时间】:2020-10-18 03:50:49
【问题描述】:

我想在 React 中将一个组件 <Top /> 渲染到另一个组件 <Bottom /> 之上。 结构是这样的:

...
[top, setTop] = useState(false);
[bottom, setBottom] = useState(true);
...

return (
<div>
 top && (<Top />)
 bottom && (<Bottom />)
 <button onClick = { () => setTop(true) } />
</div>
)

问题是,当用户看到&lt;Bottom /&gt; 并单击呈现&lt;Top /&gt; 的按钮时,视口会发生变化,因为“即时滚动”到&lt;Top /&gt;

有没有办法渲染组件但保持视口(用户当前看到的)静止?

我应该使用 CSS 还是 javascript 技巧?

【问题讨论】:

标签: html css reactjs render viewport


【解决方案1】:

要保持滚动位置,您可以使用 useEffect 钩子和对元素的引用。这里有一个提示:

useEffect(() => {
  // keep scroll position of bottom elememnt
  let currentPosition = bottomElementRef.scrollTop // first run
  if (top) {
   // update scroll position when top element is appended
   bottomElementRef.scrollTop = currentPosition // second run when top
  }
},[top])

希望,这可以帮助您解决问题。

【讨论】:

  • 您能解释一下这如何解决我的问题吗? ref的变化会影响滚动位置吗?
  • 是的,我明白这一点,但这如何阻止页面立即滚动到 &lt;Top /&gt; 的事实,即使我知道 &lt;Bottom /&gt; 的新位置?
【解决方案2】:

试试这个:

return (
  <div>
    {top && <Top />}
    {bottom && <Bottom />}
    <button onClick={() => setTop(true)} />
  </div>
);

【讨论】:

  • &lt;button onClick={() =&gt; setTop(!top)} /&gt; 更好
  • 是的,我的意思是,无论如何都不能解决我的问题
  • 为什么!top 更好?只是逻辑不同...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
  • 1970-01-01
  • 2019-06-14
  • 2017-12-31
  • 2022-06-10
  • 2020-02-06
  • 2016-09-11
相关资源
最近更新 更多