簡體   English   中英

在 useEffect 掛鈎中使用 matchMedia 會導致無限渲染

[英]Using matchMedia in a useEffect hook is causing infinite renders

我正在使用window.matchMedia來檢測屏幕尺寸。 我想在頁面進入小屏幕時重新加載頁面。 但是,我的代碼導致無限渲染。 我怎樣才能解決這個問題?

export default function App(props) {
  const small = useMedia("(max-width: 400px)");
  const large = useMedia("(min-width: 800px)");
  if(small) {
    window.location.reload();
  }
  return (
    <div className="Media">
      <h1>Media</h1>
      <p>Small? {small ? 'Yes' : 'No'}.</p>
      <p>Large? {large ? 'Yes' : 'No'}.</p>
    </div>
  );
}

function useMedia(query) {
   const [matches, setMatches] = useState(
     window.matchMedia(query).matches
   );
   useEffect(() => {
    const media = window.matchMedia(query);
    if (media.matches !== matches) {
      setMatches(media.matches);
    }

    const listener = () => setMatches(media.matches);
    media.addListener(listener);

    return () => media.removeListener(listener);
   }, [query]);

   return matches; 
}

本文將引導您完成處理媒體查詢更改的過程以及所有部分如何組合在一起,此外,作者還給出了一些如何避免性能損失的提示(React Tips)並提出了解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM