React Hook(4)

ํ•œ์ƒํ˜„ยท2021๋…„ 2์›” 2์ผ
0

Hook

๋ชฉ๋ก ๋ณด๊ธฐ
4/4
post-thumbnail

๐Ÿ“Œ useScroll

  • ์œ ์ €๊ฐ€ ์Šคํฌ๋กค ํ•ด์„œ ๋ฌด์–ธ๊ฐˆ ์ง€๋‚˜์ณค์„ ๋•Œ ์ƒ‰์ƒ์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š”๋Œ€๋กœ.
const useScroll = () => {
  const [state, setState] = useState({
    x: 0,
    y: 0
  });
  const onScroll = () => {
    setState({ y: window.scrollY, x: window.scrollX });
  };
  useEffect(() => {
    window.addEventListener("scroll", onScroll);
    return () => {
      window.removeEventListener("scroll", onScroll);
    };
  });
  return state;
};

const App = () => {
  const { y } = useScroll();
  return (
    <div className="App" style={{ height: "1000vh" }}>
      <h1 style={{ position: "fixed", color: y > 100 ? "red" : "blue" }}>Hi</h1>
    </div>
  );
};

๐Ÿ˜€ ์ฝ”๋“œ ์„ค๋ช…

  1. useScroll()
    • state์˜ ๊ฐ’ x,y์˜ ๊ฐ’์„ ๋„ฃ์–ด์คŒ.
    • onScrollํ•จ์ˆ˜์—์„œ window.scrollY, window.scrollX๋กœ x,y์˜ ์ขŒํ‘œ๋ฅผ ๋ฐ›์•„์˜ด.
    • useEffect๋กœ event ์ถ”๊ฐ€ ๋ฐ ์ƒ์„ฑ.
  2. App()
    • y์˜ ๊ฐ’๋งŒ ๋ฐ›์•„์˜ด.
    • y ์ขŒํ‘œ๊ฐ’์— ๋”ฐ๋ฅธ h1์˜ ์ƒ‰์„ ๋ฐ”๊ฟ”์คŒ. red or blue
    • style์—์„œ 1000vh๋ฅผ ํ†ตํ•ด ์Šคํฌ๋กค์„ ๋งŒ๋“ค์–ด์คŒ.

๐Ÿ“Œ useFullscreen

const useFullscreen = (callback) => {
  const element = useRef();
  const runCb = (isFull) => {
    if (callback && typeof callback === "function") {
      callback(isFull);
    }
  };
  const triggerFull = () => {
    if (element.current) {
      if (element.current.requestFullscreen) {
        element.current.requestFullscreen();
      } else if (element.current.mozRequestFullScreen) {
        element.current.mozRequestFullScreen();
      } else if (element.current.webkitRequestFullscreen) {
        element.current.webkitRequestFullscreen();
      } else if (element.current.msRequestFullscreen) {
        element.current.msRequestFullscreen();
      }
      runCb(true);
    }
  };
  const exitFull = () => {
    document.exitFullscreen();
    if (callback && typeof callback === "function") {
      callback(false);
    }
  };
  return { element, triggerFull, exitFull };
};
const App = () => {
  const onFullS = (isFull) => {
    console.log(isFull ? "We are full" : "We are small");
  };
  const { element, triggerFull, exitFull } = useFullscreen();
  return (
    <div className="App" style={{ height: "1000vh" }}>
      <div>
        <img
          ref={element}
          src="https://t1.daumcdn.net/cfile/blog/2455914A56ADB1E315"
        />
        <button onClick={exitFull}> Exit fullscreen</button>
      </div>
      <button onClick={triggerFull}> Make fullscreen</button>
    </div>
  );
};

๐Ÿ˜€ ์ฝ”๋“œ ์„ค๋ช…

  1. useFullscreen
    • triggerFull ํ•จ์ˆ˜ : ๋ธŒ๋ผ์šฐ์ € ์ข…๋ฅ˜์— ๋”ฐ๋ฅธ if๋ฌธ. fullscreen์œผ๋กœ ๋งŒ๋“ค์–ด์คŒ.
    • runCb ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด callback ํ•จ์ˆ˜ ์‹คํ–‰. callbackํ•จ์ˆ˜ : App์˜ onFullS ํ•จ์ˆ˜.
    • exitFull ํ•จ์ˆ˜ : document ํ•จ์ˆ˜๋ฅผ ํ†ตํ•œ ์ „์ฒดํ™”๋ฉด exit.

๐Ÿ“Œ useNotification

  • ์•Œ๋žŒ์ด ์‹คํ–‰๋˜๋Š” function
  • notification API ์‚ฌ์šฉ.
  • ์—„์—ฐํžˆ Hook์€ ์•„๋‹˜.
const useNotification = (title, options) => {
  if (!("Notification" in window)) {
    return;
  }
  const fireNotif = () => {
    if (Notification.permission !== "granted") {
      Notification.requestPermission().then((permission) => {
        if (permission === "granted") {
          new Notification(title, options);
        } else {
          return;
        }
      });
    } else {
      new Notification(title, options);
    }
  };
  return fireNotif;
};

const App = () => {
  const triggerNotif = useNotification("Can I steal your kimchi?");
  return (
    <div className="App" style={{ height: "1000vh" }}>
      <button onclick={triggerNotif}>Hello</button>
    </div>
  );
};

๐Ÿ“Œ useAxios

  • HTTP request๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ.
index.js
import React, { useState, useEffect, useRef } from "react";
import ReactDOM from "react-dom";
import useAxios from "./useAxios";

const App = () => {
  const { loading, data, error, refetch } = useAxios({
    url: "https://yts.am/api/v2/list_movies.json"
  });
  return (
    <div className="App" style={{ height: "1000vh" }}>
      <h1>{data && data.status}</h1>
      <h2>{loading && "Loading"}</h2>
      <button onClick={refetch}>Refetch</button>
    </div>
  );
};
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, document.getElementById("root"));
useAxios.js
import defaultAxios from "axios";
import { useEffect, useState } from "react";

const useAxios = (opts, axiosInstance = defaultAxios) => {
  const [state, setState] = useState({
    loading: true,
    error: null,
    data: null
  });
  const [trigger, setTrigger] = useState(0);
  if (!opts.url) {
    return;
  }
  const refetch = () => {
    setState({
      ...state,
      loading: true
    });
    setTrigger(Date.now());
  };
  useEffect(() => {
    axiosInstance(opts)
      .then((data) => {
        setState({
          ...state,
          loading: false,
          data
        });
      })
      .catch((error) => {
        setState({ ...state, loading: false, error });
      });
  }, [trigger]);
  return { ...state, refetch };
};

export default useAxios;

<์ถœ์ฒ˜ : ๋…ธ๋งˆ๋“œ์ฝ”๋”>

profile
์˜ ๊ณต๋ถ€ ๋…ธํŠธ.

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด