2022.07.28(Thurs)
[TIL] Day65
[SEB FE] Day66
: ๋ฐ๋ณต๋๋ ๋ก์ง์ ํจ์๋ก ๋ฝ์๋ด์ด ์ฌ์ฌ์ฉ ๊ฐ๋ฅ!
โย Hook ๋ด๋ถ์ useState์ ๊ฐ์ React ๋ด์ฅ Hook ์ฌ์ฉ ๊ฐ๋ฅ!
โย ๊ฐ์ Custom Hook ์ฌ์ฉํ๋๋ผ๋ ๊ฐ์ state๋ฅผ ๊ณต์ ํ๋๊ฑด ์๋ (๋ก์ง๋ง ๊ณต์ !)
// Custom Hook Example1
// ์ฌ๋ฌ url์ fetchํ ๋ ์ฌ์ฉํ ์ ์๋ useFetch Hook
const useFetch = (initialUrl: string) => {
const [url, setUrl] = useState(initialUrl);
const [value, setValue] = useState("");
const fetchData = () => axios.get(url).then(({ data }) => setValue(data));
useEffect(() => {
fetchData();
}, [url]);
return [value];
};
export default useFetch;
// Custom Hook Example2
// ์ฌ๋ฌ input์ ์ํ ๋ณ๊ฒฝ์ ์ฌ์ฉ๋๋ useInputs Hooks
import { useState, useCallback } from "react";
function useInputs(initialForm) {
const [form, setForm] = useState(initialForm);
const onChange = useCallback((e) => {
const { name, value } = e.target;
setForm((form) => ({ ...form, [name]: value }));
}, []);
const reset = useCallback(() => setForm(initialForm), [initialForm]);
return [form, onChange, reset];
}
export default useInputs;
: ๋ฐํ์์ ์ฌ๋ฌ ๋ฒ๋ค์ ๋์ ์ผ๋ก ๋ง๋ค๊ณ ๋ถ๋ฌ์ค๋ ๊ฒ
๐ย ์ง๊ธ ๋น์ฅ ํ์ํ ์ฝ๋๊ฐ ์๋๋ฉด ๋ฐ๋ก ๋ถ๋ฆฌ์ํค๊ณ , ๋์ค์ ํ์ํ ๋ ๋ถ๋ฌ์์ ์ฌ์ฉ ๊ฐ๋ฅ
โ ํ์ด์ง ๋ก๋ฉ ์๋ ๊ฐ์ !
๐คย ์ด๋ ํ์ด์ง์์ ์ฝ๋ ์คํ์ด ๋๋ ค์ก๋์ง ํ์
ํด์ ๋ฒ๋ค์ ๋๋ ๋ค ์ง๊ธ ํ์ํ ์ฝ๋๋ง ๋ถ๋ฌ์ค๋ฉด ์ด๋จ๊น๋?
๐ย ๋ฒ๋ค์ด ๊ฑฐ๋ํด์ง๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํ Good ํด๊ฒฐ ๋ฐฉ๋ฒ: ๋ฒ๋ค์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋๋๋ ๊ฒ !!
: ๊ฐ์ธ ๊ฐ๋ฐ์ / ํ๋ก์ ํธ ํ / ์
์ฒด ๋ฑ์์ ๊ฐ๋ฐํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ์ 3์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๐ย ๋ค์ํ ๋ฉ์๋ ์ ๊ณต โ ์ฝ๋ ์ โฌ๏ธ, ๋ฒ๋ค๋ฆฌ์ ๋ง์ ๊ณต๊ฐ ์ฐจ์ง
// loash: ๋ฐฐ์ด, ์ซ์, ๊ฐ์ฒด, ๋ฌธ์์ด ์ฌ์ฉ์ ๋ฐ๋ณต ์์
์ ํ ๋ ์ฌ์ฉํ๊ธฐ ์ข์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
// loash ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ฒด๋ฅผ ๋ถ๋ฌ์์ ์ฌ์ฉ -> ๋นํจ์จ์ !
import _ from 'lodash';
_.find([]);
// loash ๋ฉ์๋ ์ค ํ๋๋ง ๋ถ๋ฌ์์ ์ฌ์ฉ -> ์ฑ ์ฑ๋ฅ์ ๋ good!
import find from 'lodash/find';
find([]);
: ๊ตฌ๋ฌธ ๋ถ์ / ์ปดํ์ผํด์ผ ํ๋ ์คํฌ๋ฆฝํธ ์ ์ต์ํ๋ฅผ ์ํด ์ง์
then()
๋ฅผ ์ฌ์ฉํด ํ์ํ ์ฝ๋๋ง ๊ฐ์ ธ์ด// Dynamic Import Example
form.addEventListener('submit', e => {
e.preventDefault();
import('library.moduleA')
.then(module => module.default)
.then(someFunction())
.catch(handleError());
});
const someFunction = () => {
// use moduleA here!!
}
โ๏ธย Static Import
: ์ฝ๋ ํ์ผ ์ต์์์ import
๋ฅผ ํตํด ์ฌ์ฉํ๊ณ ์ ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ / ํ์ผ์ ๋ถ๋ฌ์ค๋ ๋ฐฉ๋ฒ
โย React๋ SPA์ด๋ฏ๋ก ํ๋ฒ์ ์ฌ์ฉํ์ง ์๋ ์ปดํฌ๋ํธ๊น์ง ๋ถ๋ฌ์ค๋ ๋จ์ ์กด์ฌ
React.lazy()
: dynamic import
๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ ๋ ๋๋ง ๊ฐ๋ฅ โ ์ด๊ธฐ ๋ ๋๋ง ์ง์ฐ ์๊ฐ ์ด๋์ ๋ ๋จ์ถ ๊ฐ๋ฅ
import Component from './Component';
const Component = React.lazy(() => import('./Component'));
โย React.lazy
๋ก ๊ฐ์ผ ์ปดํฌ๋ํธ๋ ๋จ๋
์ฌ์ฉ ๋ถ๊ฐ โ React.suspense
์ปดํฌ๋ํธ ํ์์์ ๋ ๋๋งํด์ผ ํจ
: ์์ง ๋ ๋๋ง์ด ์ค๋น๋์ง ์์ ์ปดํฌ๋ํธ๊ฐ ์์ ๋ ๋ก๋ฉ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๊ณ ,
ย ย ๋ก๋ฉ ์๋ฃ์ ๋ ๋๋ง์ด ์ค๋น๋ ์ปดํฌ๋ํธ๋ฅผ ๋ณด์ฌ์ค
import { Suspense } from "react";
const OtherComponent = React.lazy(() => import("./OtherComponent"));
const AnotherComponent = React.lazy(() => import("./AnotherComponent"));
function MyComponent() {
return (
<div>
<Suspense fallback={<div>Loading...</div>}>
<OtherComponent />
<AnotherComponent />
</Suspense>
</div>
);
}
fallback prop
: ์ปดํฌ๋ํธ๊ฐ ๋ก๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ก๋ฉ ํ๋ฉด์ผ๋ก ๋ณด์ฌ์ค Element๋ฅผ ๋ฐ์๋ค์โย Suspense
์ปดํฌ๋ํธ ํ๋๋ก ์ฌ๋ฌ ๊ฐ lazy
์ปดํฌ๋ํธ ๋ณด์ฌ์ค ์ ์์
โจย React.lazy
& Suspense
๋ฅผ ํตํ ์ฝ๋ ๋ถํ ์ ์ค๊ฐ์ ์ ์ฉ์ํค๋ ๊ฒ๋ณด๋ค Route์ ์ ์ฉ์ํค๋ ๊ฒ์ด ์ข์!
// Router๊ฐ ๋ถ๊ธฐ๋๋ ์ปดํฌ๋ํธ์์ React.lazy๋ฅผ ์ฌ์ฉํ์ฌ import
// Route ์ปดํฌ๋ํธ๋ค์ Suspense๋ก ๊ฐ์ผ ํ, ๋ก๋ฉ ํ๋ฉด ์ปดํฌ๋ํธ๋ฅผ fallback ์์ฑ์ผ๋ก ์ค์
import { Suspense, lazy } from "react";
import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
const Home = lazy(() => import("./routes/Home"));
const About = lazy(() => import("./routes/About"));
const App = () => {
<Router>
<Suspense fallback={<div>Loading...</div>}>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</Suspense>
</Router>;
};
๐ย ์ด๊ธฐ ๋ ๋๋ง ์๊ฐ โฌ๏ธ
๐ย ํ์ด์ง ์ด๋ ๊ณผ์ ๋ง๋ค ๋ก๋ฉ ํ๋ฉด์ด ๋ณด์ฌ์ง