【问题标题】:Collapse React Sidebar using Hooks使用 Hooks 折叠 React 侧边栏
【发布时间】:2021-02-19 16:59:01
【问题描述】:

我需要根据屏幕大小折叠边栏。到目前为止,我的所有尝试都不是很幸运。我想知道是否有人可以通过使用 Hooks 给我一些提示。 状态设置为“isOpen={true}”,当宽度达到 768px 或更低时,我需要将其设为 false。

提前致谢

 return (
    <div className="menu-bar">
      <Menu
        width={210}
        isOpen={true}
        noOverlay
        noTransition
        pageWrapId={"page-wrap"}
        outerContainerId={"outer-container"}
        customBurgerIcon={false}
        customCrossIcon={false}
        disableAutoFocus
        disableCloseOnEsc
      >

【问题讨论】:

    标签: reactjs typescript react-hooks sidebar


    【解决方案1】:

    这个自定义钩子使用Window.matchMedia()根据传递的查询返回一个布尔值:

    const { useMemo, useState, useEffect } = React
    
    const useMediaQuery = query => {
      const mql = useMemo(() => window.matchMedia(query))
    
      const [match, setMatch] = useState(mql.matches)
    
      useEffect(() => {
        const handler = e => setMatch(e.matches)
        mql.addListener(handler)
        
        return () => {
          mql.removeListener(handler)
        }
      }, [mql])
      
      return match
    }
    
    const Demo = () => {
      const close = useMediaQuery('(max-width: 600px)')
      
      return (
        <div className="container">
          {close || <aside />}
          <main />
        </div>
      )
    }
    
    ReactDOM.render(
      <Demo />,
      root
    )
    .container {
      display: flex;
      height: 75vh;
    }
    
    main {
      flex: 4;
      height: 100%;
      background: purple;
    }
    
    aside {
      flex: 1;
      height: 100%;
      background: gold;
    }
    <script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
    
    <div id="root"></div>

    【讨论】:

      【解决方案2】:

      这是一个缩小的例子:

      
      import React, { useState, useEffect } from "react";
      
      export default function App() {
        const [isNavOpen, setIsNavOpen] = useState(true);
      
        useEffect(() => {
          window.addEventListener("resize", () => {
            if (window.innerWidth <= 768) {
              setIsNavOpen(false)
            }
          })
          return window.removeEventListener("resize", () => {
            if (window.innerWidth <= 768) {
              setIsNavOpen(false)
            }
          })
        })
      
        return (
          <div className="nav">
            <Nav isOpen{isNavOpen}/>
          </div>
        );
      }
      
      
      

      【讨论】:

      • 您必须使用相同的函数来添加/删除事件监听器。提取函数并使用它来添加和删除。另外,在useEffect()上设置一个空的依赖列表,因为它没有任何依赖,可以在mount上运行。
      猜你喜欢
      • 2016-11-14
      • 2013-10-24
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      • 1970-01-01
      • 2017-05-29
      • 2016-10-14
      • 2014-06-20
      相关资源
      最近更新 更多