reactjs - 当我更改网站大小时,如何更改 react 中的 state?

这是 state :

const [open, setOpen] = useState(false);

state 由图标上的 onclick 事件控制,如下所示:

onclick=()=>{setOpen(!open)}

当 state setOpen(false) 在较大的窗口中时,我想设置它。现在我如何在我的代码上实现它?

回答1

尝试这个 :

import React, { useLayoutEffect, useState } from 'react';

function useWindowSize() {
  const [size, setSize] = useState([0, 0]);
  useLayoutEffect(() => {
    function updateSize() {
      setSize([window.innerWidth, window.innerHeight]);
    }
    window.addEventListener('resize', updateSize);
    updateSize();
    return () => window.removeEventListener('resize', updateSize);
  }, []);
  return size;
}

回答2

您可以通过使用媒体查询来做到这一点。通过使用媒体查询,而不是侦听任何调整大小事件,您可以只查看某些断点(lgmdsm 等)。

多合一外部库:

MUI 中的 https://mui.com/material-ui/react-use-media-query/ 易于使用且可靠。下面是一个观察 600px 屏幕尺寸的简单示例。

import * as React from 'react'
import useMediaQuery from '@mui/material/useMediaQuery'

export default function SimpleMediaQuery()
{
  const matches = useMediaQuery('(min-width:600px)')

  return <span>{`(min-width:600px) matches: ${matches}`}</span>
}

想改用预设断点吗?

const matches = useMediaQuery(theme.breakpoints.up('sm'))

打回来?

const matches = useMediaQuery((theme) => theme.breakpoints.up('sm'))

可以通过多种方式自定义此挂钩(有关更多示例,请参见上面链接的文档)。

没有外部库的自定义钩子:

如果你想在不依赖外部库的情况下做到这一点,这里有一个简单的钩子,用于监视某些断点,类似于 MUI 的 useMediaQuery

export const useMediaQuery = (width) =>
{
  const [targetReached, setTargetReached] = useState(false)

  const updateTarget = useCallback((e) =>
  {
    if (e.matches) setTargetReached(true)
    else setTargetReached(false)
  }, [])

  useEffect(() =>
  {
    const media = window.matchMedia(`(max-width: ${width}px)`)
    media.addEventListener('change', updateTarget)

    // Check on mount (callback is not called until a change occurs)
    if (media.matches) setTargetReached(true)

    return () => media.removeEventListener('change', updateTarget)
  }, [])

  return targetReached
}

用法:

// 600px
const matches = useMediaQuery(600)

相似文章

随机推荐

最新文章