Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
August 30, 2021 10:49 am GMT

4 custom react hooks that will make your development easier

1. useToggle

Basically, what this hook does is that, it takes a parameter with value true or false and toggles that value to opposite. It's useful when we want to take some action into it's opposite action.

For example;

  • show and hide modal,
  • show more/show less text,
  • open/close side menu.
// Hook// Parameter is the boolean, with default "false" valueconst useToggle = (initialState = false) => {    // Initialize the state    const [state, setState] = useState(initialState);    // Define and memorize toggler function in case we pass down the comopnent,    // This function change the boolean value to it's opposite value    const toggle = useCallback(() => setState(state => !state), []);    return [state, toggle]}// Usagefunction App() {    // Call the hook which returns, current value and the toggler function    const [isTextChanged, setIsTextChanged] = useToggle();    return (      <button onClick={setIsTextChanged}>                {isTextChanged ? 'Toggled' : 'Click to Toggle'}            </button>    );}

2. useOnClickOutside

This hook allows you to detect clicks outside of a specified element.

By abstracting this logic out into a hook we can easily use it across all of our components that need this kind of functionality.

For Example;

  • dropdown menus,
  • tooltips,
  • modals
  • etc..
// Hookconst useOnClickOutside = (ref, handler) => {  useEffect(    () => {      const listener = (event) => {        // Do nothing if clicking ref's element or descendent elements        if (!ref.current || ref.current.contains(event.target)) {          return;        }        handler(event);      };      document.addEventListener("mousedown", listener);      document.addEventListener("touchstart", listener);      return () => {        document.removeEventListener("mousedown", listener);        document.removeEventListener("touchstart", listener);      };    },    [ref, handler]  );}
// Usagefunction App() {  // Create a ref that we add to the element for which we want to detect outside clicks  const ref = useRef();  // State for our modal  const [isModalOpen, setModalOpen] = useState(false);  // Call hook passing in the ref and a function to call on outside click  useOnClickOutside(ref, () => setModalOpen(false));  return (    <div>      {isModalOpen ? (        <div ref={ref}>           Hey, I'm a modal. Click anywhere outside of me to close.        </div>      ) : (        <button onClick={() => setModalOpen(true)}>Open Modal</button>      )}    </div>  );}

3. useSubmit

Instead of recreating loading and form states we can also move that logic inside a hook called useSubmit

// Hookconst useSubmit = submitFunction => {  const [loading, setLoading] = useState(false);  const [error, setError] = useState(null);    const handleSubmit = async () => {    try {      setLoading(true);      setError(null);      await submitFunction();    } catch (error) {      setError(error);    } finally {      setLoading(false);    }  };  return [handleSubmit, loading, error];};
// Usagefunction App() {    const mySubmitFunction = () => {      return new Promise((resolve, reject) => {        setTimeout(() => {                resolve("Timeout Finished")        }, 2000);      });    };    const [handleSubmit, loading, error] = useSubmit(mySubmitFunction);    return (        <div className="App">          <button onClick={handleSubmit} disabled={loading}>            {!loading ? "Click me" : "Loading..."}          </button>          {error && <div>{error}</div>}        </div>      );}

4. useMediaQuery

If you want to write css in js or you just want to add some sideEffect to the specific device or breakpoint this hook is for you.

// Hookconst useMediaQuery = (query = "(min-width: 576px)") => {  const [matches, setMatches] = useState(false);  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);  }, [matches, query]);  return matches;}// Usageconst isTablet = useMediaQuery("(max-width: 1200px)");

Links


Original Link: https://dev.to/afozbek/4-custom-react-hooks-that-will-make-your-development-easier-4gle

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To