function Navbar() { const [shownavcontents, setShownavcontents] = useState(false) if(shownavcontents){ document.getElementsByClassName("navbardivofmobiledevice").style.display = "none"; }else{ document.getElementsByClassName("navbardivofmobiledevice").style.display = "block"; } return ( <> <div className="top"> <Searchbar /> <AiOutlineMenu size={20} className="outlinemenu" onClick={() => {setShownavcontents(true)}} /> </div> <div className="navbardivofmobiledevice"> <ul> <li> <a href="#home">Home</a> </li> <li> <a href="#memebers">Members</a> </li> <li> <a href="#allposts">All Posts</a> </li> <li> <a href="#myposts">My Posts</a> </li> </ul> </div> </> ); }
如您所见,我正在尝试为移动设备制作响应式导航栏。我遇到了一个问题。我在导航栏和一些导航栏内容上制作了按钮,我只想在用户单击此按钮时才显示它们,反之亦然。所以我尝试使用钩子来检查用户是否点击了完美工作的按钮,唯一不起作用的是这个 if else 语句似乎document.getElementsByClassName("navbardivofmobiledevice").style.display = "none";在这里没有效果。所以我的问题是这个的替代方案是什么?我可以在这里做什么?
document.getElementsByClassName("navbardivofmobiledevice").style.display = "none";
这是命令式代码:
使用 React,您很少会获得对 DOM 元素的引用并手动更新它们,并且无论如何,您都使用Refs,而不是使用getElement...orquerySelector...方法)。相反,您编写声明性代码并让 React 为您处理 DOM 更新。
Refs
getElement...
querySelector...
在这种情况下,只需添加或删除JSX中的hidden属性或 CSS 类:display: none
hidden
display: none
function Navbar() { const [shownavcontents, setShownavcontents] = useState(false); return ( <> <div className="top"> <Searchbar /> <AiOutlineMenu size={20} className="outlinemenu" onClick={() => {setShownavcontents(true)}} /> </div> <div className="navbardivofmobiledevice" hidden={ !shownavcontents }> <ul> <li> <a href="#home">Home</a> </li> <li> <a href="#memebers">Members</a> </li> <li> <a href="#allposts">All Posts</a> </li> <li> <a href="#myposts">My Posts</a> </li> </ul> </div> </> ); }
如果你喜欢使用一个类,假设你已经定义了一个 CSS 类.isHidden { display: none; },你可以使用这一行:
.isHidden { display: none; }
<div className={ `navbardivofmobiledevice${ shownavcontents ? '' : ' isHidden' }` }>
关于一些评论提到的关于有条件地渲染的内容:
function Navbar() { const [shownavcontents, setShownavcontents] = useState(false); return ( <> <div className="top"> <Searchbar /> <AiOutlineMenu size={20} className="outlinemenu" onClick={() => {setShownavcontents(true)}} /> </div> { shownavcontents && ( <div className="navbardivofmobiledevice"> <ul> <li> <a href="#home">Home</a> </li> <li> <a href="#memebers">Members</a> </li> <li> <a href="#allposts">All Posts</a> </li> <li> <a href="#myposts">My Posts</a> </li> </ul> </div> ) } </> ); }
我会避免这种情况,因为向 Google 和其他搜索引擎隐藏您的主要导航会损害您的 SEO。您需要在视觉上隐藏它,但仍将其保存在 DOM 中。
如果您想做得更好,请为带有嵌套子菜单的导航菜单添加所有适当的 ARIA 属性和逻辑,如下所述:
https://www.w3.org/WAI/ARIA/apg/example-index/menubar/menubar-navigation