πŸͺ Custom Hooks

지은·2022λ…„ 11μ›” 28일
0

βš›οΈ React

λͺ©λ‘ 보기
14/23
post-custom-banner

Custom Hooks

: κ°œλ°œμžκ°€ 슀슀둜 μ»€μŠ€ν…€ν•œ Hook
Custom Hook을 λ§Œλ“€λ©΄ λ°˜λ³΅λ˜λŠ” λ‘œμ§μ„ ν•¨μˆ˜λ‘œ 뽑아내어 μž¬μ‚¬μš©ν•  수 μžˆλ‹€.

  • λ°˜λ³΅λ˜λŠ” λ‘œμ§μ„ λ™μΌν•œ ν•¨μˆ˜μ—μ„œ μž‘λ™ν•˜κ²Œ ν•˜κ³  싢을 λ•Œ 주둜 μ‚¬μš©ν•œλ‹€.
  • e.g. μ—¬λŸ¬ 개의 URL을 fetchν•  λ•Œ, μ—¬λŸ¬ 개의 input에 μ˜ν•œ μƒνƒœ λ³€κ²½ λ“±

Custom Hook의 μž₯점

  1. μƒνƒœ 관리 둜직의 μž¬ν™œμš©μ΄ κ°€λŠ₯ν•˜λ‹€.

  2. 클래슀 μ»΄ν¬λ„ŒνŠΈλ³΄λ‹€ 적은 μ–‘μ˜ μ½”λ“œλ‘œ λ™μΌν•œ λ‘œμ§μ„ κ΅¬ν˜„ν•  수 μžˆλ‹€.

  3. ν•¨μˆ˜ν˜•(useSomething())으둜 μž‘μ„±ν•˜κΈ° λ•Œλ¬Έμ—, 보기에 λͺ…λ£Œν•˜λ‹€.

  4. Custom Hook λ‚΄λΆ€μ—μ„œ React λ‚΄μž₯ Hook을 μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€.
    일반 ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλŠ” React Hook을 뢈러 μ‚¬μš©ν•  수 μ—†μ§€λ§Œ, Custom Hook λ‚΄λΆ€μ—μ„œλŠ” κ°€λŠ₯ν•˜λ‹€.

  5. Custom Hook을 μ‚¬μš©ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈλ“€μ€ μ»΄ν¬λ„ŒνŠΈλ§ˆλ‹€ state와 effectλ₯Ό λ…λ¦½μ μœΌλ‘œ 가진닀. (μž¬μ‚¬μš©μ„± ↑)
    같은 Custom Hook을 μ‚¬μš©ν•œλ‹€κ³  ν•΄μ„œ 두 μ»΄ν¬λ„ŒνŠΈκ°€ 같은 stateλ₯Ό κ³΅μœ ν•˜λŠ” 것이 μ•„λ‹ˆλ‹€.
    κ·Έμ € 둜직만 κ³΅μœ ν•  뿐, stateλŠ” 각 μ»΄ν¬λ„ŒνŠΈ λ‚΄μ—μ„œ λ…λ¦½μ μœΌλ‘œ μ •μ˜λœλ‹€.


Custom Hooks λ§Œλ“€ λ•Œ κ·œμΉ™

  • ν•¨μˆ˜ 이름 μ•žμ— useλ₯Ό 뢙인닀.
  • λŒ€λΆ€λΆ„μ˜ 경우, ν”„λ‘œμ νŠΈ λ‚΄μ˜ hooks 폴더에 Custom Hook을 μœ„μΉ˜μ‹œν‚¨λ‹€.
  • Custom Hook으둜 λ§Œλ“€ λ•Œ, ν•¨μˆ˜λŠ” 쑰건뢀 ν•¨μˆ˜κ°€ μ•„λ‹ˆμ–΄μ•Ό ν•œλ‹€.
    즉, λ¦¬ν„΄ν•˜λŠ” 값이 μ‘°κ±΄λΆ€μ—¬μ„œλŠ” μ•ˆλœλ‹€.

useFetch

: fetch APIλ₯Ό 톡해 λ„€νŠΈμ›Œν¬μƒμ—μ„œ 데이터λ₯Ό κ°€μ Έμ˜¬ 수 있게 ν•΄μ£ΌλŠ” Custom Hook

App.js

import useFetch from './hooks/useFetch';

function App() {
  const url = "https://jsonplaceholder.typicode.com/users";

  const fetchedData = useFetch(url);
  console.log(fetchedData); // 데이터λ₯Ό λ°›μ•„μ˜€λŠ” 것을 확인할 수 μžˆλ‹€.

  return (
    <div></div>
  );
}

export default App;

useFetch.js

import { useEffect, useState } from "react";

const useFetch = (url) => {
  const [data, setData] = useState(null);

  const fetchUrl = () => {
    fetch(url)
    .then((res) => res.json())
    .then((data) => setData(data));
  }

  useEffect(() => {
    fetchUrl(url); // fetchUrl ν•¨μˆ˜ 호좜
  }, [url]);       // url이 변경될 λ•Œλ§ˆλ‹€ μ‹€ν–‰λœλ‹€.
  
  return data;
}

export default useFetch;

useInput

μ—¬λŸ¬ 개의 input에 μ˜ν•œ μƒνƒœ 변경을 ν•  λ•Œ μ“Έ 수 μžˆλŠ” Custom Hook

App.js

import useInput from './hooks/useInput';

const displayMessage = (message) => {
  alert(message);
};

function App() {
  const [inputValue, handleChange, handleSubmit] = useInput('', displayMessage);
 
  return (
    <div>
      <input value={inputValue} onChange={handleChange} />
      <button onClick={handleSubmit}>확인</button>
    </div>
  );
}

export default App;

useInput.js

import { useState } from "react";

const useInput = (initialValue, submitAction) => {
  const [inputValue, setInputValue] = useState(initialValue);
  
  const handleChange = (e) => {
    setInputValue(e.target.value);
  };
  
  const handleSubmit = () => {
    setInputValue('');
    submitAction(inputValue);
  };
  
  return [inputValue, handleChange, handleSubmit];
}


export default useInput;
profile
λΈ”λ‘œκ·Έ 이전 -> https://janechun.tistory.com
post-custom-banner

0개의 λŒ“κΈ€