Home > other >  how to rerender a page using UseEffect hook on window.innerWidth in react
how to rerender a page using UseEffect hook on window.innerWidth in react

Time:12-07

I want to make some changes depending on the screen size

useEffect(() => {
        console.log("am called");

     if (window.innerWidth < 800) {
        document.getElementsByTagName("body")[0].style.display = "none";
     }
     if (window.innerWidth > 800) {
            document.getElementsByTagName("body")[0].style.display = "block";
        }

        
    }, [window.innerWidth]);

what is the problem with this code

CodePudding user response:

You need to observe window size changing and put this value to state.

    const [width, setWidth] = useState(0)
    useEffect(() => {
        const onResize = () => setWidth(window.innerWidth)
        window.addEventListener('resize', onResize);
        return () => {
            window.removeEventListener("resize", onResize)
        }
    }, [setWidth])

    //and then
    useEffect(() => {
        console.log("am called");

        if (width< 800) {
            document.getElementsByTagName("body")[0].style.display = "none";
        } else {
            document.getElementsByTagName("body")[0].style.display = "block";
        }


    }, [width]);

better solution

export default function useMatchMedia(condition) {
    const [isMatching, setIsMatching] = useState(false);

    useEffect(
        function updateMatchMedia() {
            if (!condition) return setIsMatching(true);

            const updateIsMatching = (event) => setIsMatching(event.matches);

            const matcher = window.matchMedia(condition);

            setIsMatching(matcher.matches);

            matcher.addEventListener('change', updateIsMatching);

            return () => {
                matcher.removeEventListener('change', updateIsMatching);
            };
        },
        [condition]
    );

    return [isMatching];
}

then you can use it

   isTablet = useMatchMedia(`(max-width: 800px)`);
   useEffect(() => {
     if(isTablet){
     } else {
     }
   }, [isTablet])
  • Related