所以我在html
中通过React渲染组件,如此:
<html>
<body>
<div id=app>${appHtml}</div>
<script src="/bundle.js"></script>
</body>
</html>
在我的应用程序中,我有一个汉堡按钮,onClick
全屏显示。
然而,身体是可滚动的。我通常会在body
标记中添加一个类,并将其设为overflow: hidden
以防止这种情况发生。但是,我的react组件在body
标记内呈现,因此我无法根据反应组件中的单击来控制切换类。
有没有人对我如何实现我正在寻找的东西有任何想法/建议。
谢谢!
答案 0 :(得分:20)
“我根据反应组件中的点击无法控制切换类。”
不一定是真的!
以“反应”的方式思考并且对修改DOM持谨慎态度是件好事。您希望避免执行DOM操作的主要原因是,它会导致React尝试呈现的内容与您可能尝试进行的未知更改之间发生冲突。但是在这种情况下,你不是在操纵React正在渲染的DOM,而是在操纵它的父。在这种情况下,你会完全没有这样做:
document.body.style.overflow = "hidden"
或者
document.body.classList.add("no-sroll")
或者无论如何。你完全安全,因为React只在#app
内呈现DOM而不关心其父级中发生的事情。实际上,许多应用程序和网站仅在页面的一小部分中使用React,以呈现单个组件或小部件,而不是整个应用程序。
除此之外,还有一种更好,更“反应”的方式来做你想做的事。只需重新构建您的应用,使滚动容器位于您的React应用中,而不是body
。结构可能如下所示:
<html>
<body>
<div id="app">
<div id="scroll-container">
<!-- the rest of your app -->
</div>
</div>
</body>
</html>
隐藏body
溢出,body
和#app
填满整个屏幕,您可以控制#scroll-container
是否允许在React内完全滚动。
答案 1 :(得分:3)
以上版本不适用于iOS手机。
body-scroll-lock使用CSS和JS的组合使其适用于所有设备,同时保持目标元素的可滚动性(例如模态)。
即。对于iOS,需要检测何时到达目标元素的底部或顶部,然后完全停止滚动
答案 2 :(得分:0)
这里是如何在 reactjs 中使用 body-scroll-lock 库...
import React, {useState} from 'react';
import { disableBodyScroll, enableBodyScroll } from 'body-scroll-lock';
// Components
import Hamburger from './HeaderComponents/Hamburger.js';
import MegaDropdown from './HeaderComponents/MegaDropdown.js';
const Header = props => {
// variables
const [isSideNavShown, setIsSideNavShown] = useState(false);
const [isDropdownShowing, setIsDropdownShowing] = useState(false);
isDropdownShowing ? disableBodyScroll(document) : enableBodyScroll(document)
return (
<header className="header">
<Hamburger isDropdownShowing={isDropdownShowing} setIsDropdownShowing={setIsDropdownShowing} />
<MegaDropdown isDropdownShowing={isDropdownShowing} setIsDropdownShowing={setIsDropdownShowing} />
</header>
)
}
export default Header;
特别是行 isDropdownShowing ? disableBodyScroll(document) : enableBodyScroll(document)
这允许当我的下拉列表中的内容填满到需要向其添加滚动的点时,在显示下拉列表(覆盖我的整个屏幕)时禁用窗口(主体)滚动。所以即使窗口(主体)滚动被禁用,我仍然可以滚动我的下拉菜单。
答案 3 :(得分:0)
这是我的两分钱:您可以将包含您的内容的 div 的高度设置为 100%(高度:100%) 或者在这种情况下 body { height: 100%}
答案 4 :(得分:0)
我建议使用 css position: "sticky"
,但我想这不是这里所质疑的。但它对我有用。我想其他解决方案更好。