본문 바로가기

Frontend/React&RN

[Custom Hooks] useInput, useFetch

커스텀 훅으로 자주 사용하는 것들 모듈화(Util 파일로 만들어서 사용하기)

useInput, useFetch 만들어 쓰기


const App = () => {
  const nameHook = useInput("");
  const { payload, loading, error } = useFetch("http://aws.random.cat/meow");
  // console.log(nameHook)
  return (
    <div>
      <h1>use Hooks</h1>
      <input {...nameHook} placeholder="what your name" />
      <br/>
      {loading && <span>loading your cat</span>}
      {!loading && error && <span>{error}</span>}
      {!loading && payload && <img src={payload.file} width="150" />}
    </div>
  );
};

value와 onChange 바인딩된 input을 Hook으로 만들기


export function useInput(defaultValue) {
  const [ value, setValue ] = useState(defaultValue);

  const onChange = (e) => {
  //const value = e.target.value;
    const { target: { value } } = e; 

    setValue(value);
  };

  return { value, onChange }
}

에러 로딩 처리된 ajax


export function useFetch(url) {
  const [ payload , setPayload ] = useState(null);
  const [ loading, setLoading ] = useState(true);
  const [ error, setError ] = useState("");

  const callUrl = async () => {
    try {
      const { data } = await Axios.get(url);
      // throw Error(); 에러 제대로 뜨나 확인용
      setPayload(data);
    } catch (e) {
      setError("error!!");
    } finally {
      setLoading(false);
    }
  }

  useEffect(() => {
    // only did mount
    callUrl();
  }, []);

  return { payload, loading, error };
}

'Frontend > React&RN' 카테고리의 다른 글

[next.js] redux devtools 세팅법  (0) 2020.01.17
[Styled Components]syntex  (0) 2019.12.27
[react-router-dom]BrowserRouter, HashRouter  (0) 2019.12.27
[styled-components] syntax  (0) 2019.12.26
[총정리] useEffect(), useMemo(), useCallback()  (0) 2019.12.19