reactjs - קריאת React Hook "useState" מותנית


React מתלוננת על הקוד למטה, ואומרת ש-useState ו-useEffect נקראים באופן מותנה. הקוד עובד בסדר בלי TypeScript:

import React, { useState, useEffect } from "react";

const useScrollPosition = () => {
  if (typeof window === "undefined") return 500;

  // Store the state
  const [scrollPos, setScrollPos] = useState(window.pageYOffset);

  // On Scroll
  const onScroll = () => {
  setScrollPos(window.pageYOffset);
};

  // Add and remove the window listener
  useEffect(() => {
    window.addEventListener("scroll", onScroll);
    return () => {
      window.removeEventListener("scroll", onScroll);
    };
  });
};

export default useScrollPosition;

תשובה #1

יש לך החזרה מוקדמת ולכן זה נקרא בתנאי if (typeof window === "undefined") return 500;

אתה צריך להעביר את ה-hooks לפני החזרה המוקדמת. להסבר מפורט קרא את זה https://reactjs.org/docs/hooks-rules.html

תשובה #2

עבירו את ה-return לתחתית הפונקציה ועבירו מערך ריק לפרמטר השני של useEffect כדי שהקוד הקיים ב-useEffect ירוץ רק פעם אחת.

import React, {useState, useEffect} from "react";

const useScrollPosition = () => {
    

    // Store the state
    const [scrollPos, setScrollPos] = useState(window.pageYOffset);

    // On Scroll
    const onScroll = () => {
        setScrollPos(window.pageYOffset);
    };

    // Add and remove the window listener
    useEffect(() => {
        window.addEventListener("scroll", onScroll);
        return () => {
            window.removeEventListener("scroll", onScroll);
        };
    }, []); // set an empty array for run once existing code in the useEffect

   return typeof window === "undefined" ? return 500 : <></>; // a value must be returned
    
};

export default useScrollPosition;