๐ญ Automatic Batching
- ์์์ ๋ฐฐ์ด ๊ฒ์ฒ๋ผ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ ์ํ๊ฐ ์ ๋ฐ์ดํธ๋ ๋๋ง๋ค ์ฌ๋ ๋๋ง์ด ์ด๋ค์ง๊ธฐ ๋๋ฌธ์, ํจ์ ์ปดํฌ๋ํธ์์ ๊ฐ๊ฐ์ ์คํ ์ดํธ๊ฐ ์ ๋ฐ์ดํธ๋ ๋๋ง๋ค ์ฌ๋ ๋๋ง์ด ๋ฐ์
- ์ ์ฆ ์คํ ์ดํธ ํ ์ ์ฌ์ฉํด์ ์ ์ธํ ๊ฐ ์คํ ์ดํธ๋ค์ set ํจ์๋ฅผ ๊ฑฐ์ ๋์์ ํธ์ถํ๋๋ผ๋ ํธ์ถ๋ ํ์๋งํผ ์ฌ๋ ๋๋ง์ด ๋ฐ์
- ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ์ฌ๋ฌ ์ํ์ ์ ๋ฐ์ดํธ๊ฐ ๋์์ ๋ฐ์ํ๋ฉด ์ด ์์ ๋ค์ ๋ฌถ์ด์ ํ๋ฒ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๋ฐฐ์นญ
- ๋ฐฐ์นญ์ ์ปดํจํฐ ๊ณตํ์์ ์ฌ๋ฌ ๊ฐ์ง ์์ ์ ํ ๋ฒ์ ์ฒ๋ฆฌํ๋ค๋ ์๋ฏธ๋ฅผ ๊ฐ๊ณ ์์
- ๋ฆฌ์กํธ์์์ ๋ฐฐ์นญ์ ์ฌ๋ฌ ์ํ์ ์ ๋ฐ์ดํธ ์์ ์ ํ ๋ฒ์ ๋ฌถ์ด์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด๋ผ๊ณ ์ดํดํ๋ฉด ๋จ
- ๊ธฐ์กด ๋ฆฌ์กํธ ๋ฒ์ ์์๋ ์ด๋ฌํ ๋ฐฐ์นญ์ด ๋ฆฌ์กํธ ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ด์์๋ง ์ด๋ฃจ์ด์ง
- ๋ฆฌ์กํธ ๋ฒ์ 18์์ ์คํ ๋ฉํฑ ๋ฐฐ์นญ์ด๋ผ๋ ๊ฒ์ด ์๋กญ๊ฒ ๋ฑ์ฅํ์๊ณ , ์๋์ผ๋ก ์ฌ๋ฌ ์ํ์ ์ ๋ฐ์ดํธ ์์ ์ ๋ฌถ์ด์ ํ ๋ฒ์ ์ฒ๋ฆฌ
// ๊ธฐ์กด ๋ฒ์
setTimeout(() => {
setCount((count) => count + 1);
setIsFull((isFull) => !isFull);
// ๊ฐ state์ ์
๋ฐ์ดํธ๋ง๋ค ์ฌ๋ ๋๋ง ๋ฐ์
}, 1000)
// ํ์ฌ ๋ฒ์
setTimeout(()=> {
setCount((count) => count + 1);
setIsFull((isFull) => !isFull);
// ์ฌ๋ ๋๋ง์ด ๋ง์ง๋ง์ ํ ๋ฒ๋ง ๋ฐ์
}, 1000);
- ๋จผ์ ๊ธฐ์กด ๋ฒ์ ์์๋ ๊ฐ ์คํ ์ดํธ์ ์ ๋ฐ์ดํธ๋ง๋ค ์ฌ๋ ๋๋ง์ด ๋ฐ์ํ๊ฒ ๋จ
- setCount ํจ์๊ฐ ํธ์ถ๋์์ ๋์ setIsFull ํจ์๊ฐ ํธ์ถ๋์ ๋ ๊ฐ๊ฐ ์ฌ๋ ๋๋ง ๋ฐ์
- ํ์ฌ ๋ฒ์ ์ธ ๋ฒ์ 18์์๋ ์ด๋ฌํ ์ํ ์ ๋ฐ์ดํธ ์์ ์ ์๋์ผ๋ก ๋ฌถ์ด์ ํ ๋ฒ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์คํ ๋งคํฑ ๋ฐฐ์นญ์ด๋ฉฐ ๊ฒฐ๊ณผ์ ์ผ๋ก ์ฌ๋ ๋๋ง์ด ํ ๋ฒ๋ง ๋ฐ์ํ๊ฒ ๋จ
๐ญ Transitions
- ํธ๋ ์ง์ ์ ๋ฆฌ์กํธ์์ ๊ธด๊ธํ ์ ๋ฐ์ดํธ์ ๊ธด๊ธํ์ง ์์ ์ ๋ฐ์ดํธ๋ฅผ ๊ตฌ๋ถํด์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์๋ก์ด ๊ฐ๋
- ์ ๋ฐ์ดํธ์ ํํ๋ฅผ ๋๋์ด ์ฌ์ฉ์์๊ฒ ๋ ๋น ๋ฅด๊ณ ์ข์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ ์ํจ
- ์น์ฌ์ดํธ์ ์ ๋ ฅ ์์์ ํค๋ณด๋๋ก ๊ธ์๋ฅผ ์ ๋ ฅํ๋๋ฐ ๊ธ์๊ธฐ ๋๋ฆฌ๊ฒ ์ ๋ ฅ๋๊ฑฐ๋ ๋ช ์ด๊ฐ ์ง๋์ ์ ๋ ฅ๋๋ค๋ฉด ์ฌ์ฉ์๋ ์น์ฌ์ดํธ์ ์ค๋ฅ๊ฐ ์๋ค๊ณ ํ๋จํ ์ ์๊ธฐ ๋๋ฌธ
- ๋ฆฌ์กํธ ๋ฒ์ 18์์๋ ์ ๋ฐ์ดํธ์ ์ข ๋ฅ๋ฅผ ๋๋๊ณ ๊ธด๊ธํ ์ ๋ฐ์ดํธ๋ฅผ ๋จผ์ ์ฒ๋ฆฌํจ์ผ๋ก์จ ์ฌ์ฉ์์๊ฒ ๋ ๋์ ๊ฒฝํ์ ์ ๊ณตํ๋๋ก ํ ๊ฒ
import {startTransition} from 'react';
// ๊ธด๊ธ ์
๋ฐ์ดํธ: ์
๋ ฅํ ๊ธ์๋ฅผ ํ๋ฉด์ ๋ณด์ฌ์ฃผ์ด์ผ ํจ
setInputValue(input);
// ํจ์ ๋ด์ ์๋ ๋ชจ๋ ์
๋ฐ์ดํธ๋ Transition ์
๋ฐ์ดํธ๊ฐ ๋จ
startTransition(() => {
// Transition ์
๋ฐ์ดํธ: ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ์ด์ผ ํจ
setSearchQuery(input);
});
- ๋ฆฌ์กํธ์์ ์ ๊ณตํ๋ StartTransition์ด๋ผ๋ ํจ์๋ฅผ ์ฌ์ฉํด์ ์ฌ์ฉ์๋ก๋ถํฐ ํ ๋ฒ์ ์ ๋ ฅ์ด ๋ฐ์ํ์ ๋ ์ ๋ฐ์ดํธ๋ฅผ ๋๋ ์ ์ฒ๋ฆฌํ๋ ์ฝ๋
- ์ฌ์ฉ์์ ์ ๋ ฅ์ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ๊ธด๊ธํ๊ฒ ์ฒ๋ฆฌ๋์ด์ผ ํ ์ ๋ฐ์ดํธ์ด๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด๊ณผ ๋์ผํ๊ฒ ์ํ ์ ๋ฐ์ดํธ ์งํ
- ์ดํ์ ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ์์ฃผ ๊ธด๊ธํ๊ฒ ์ฒ๋ฆฌํ์ง๋ ์์๋ ๋๋ ๋ถ๋ถ์ด๊ธฐ ๋๋ฌธ์ StartTransition ํจ์๋ฅผ ์ฌ์ฉํด์ TransitionUpdate๋ก ์ฒ๋ฆฌ
- Transition ์ ๋ฐ์ดํธ๋ ๊ธด๊ธํ์ง ์์ ๊ฒ์ผ๋ก ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ๊ทธ ์ฌ์ด์ ๋ ๊ธด๊ธํ ์ ๋ฐ์ดํธ๊ฐ ๋ค์ด์ค๋ฉด ์ค๋จ
๐ญ ์ ๋ฐ์ดํธ์ ์ข ๋ฅ
- ๊ธด๊ธํ ์
๋ฐ์ดํธ
- ์ฌ์ฉ์์ ์ง์ ์ ์ธ ์ธํฐ๋์ ์ด ์ผ์ด๋๋ ๊ฒฝ์ฐ
- ์) ๊ธ์ ์ ๋ ฅ, ๋ฒํผ ํด๋ฆญ ๋ฑ
- ๊ธด๊ธํ์ง ์์ ์
๋ฐ์ดํธ
- ์ฌ์ฉ์์ ์ง์ ์ ์ธ ์ธํฐ๋์ ์ด ์ผ์ด๋์ง ์๋ ๊ฒฝ์ฐ
- ์) ์๋ฒ๋ก๋ถํฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์์ ๋ณด์ฌ์ฃผ๋ ๊ฒฝ์ฐ
๐ญ Suspense
- React๋ก ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ค ๋ณด๋ฉด ์น์ฌ์ดํธ์ ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด์ ์ปดํฌ๋ํธ์ ์ฌ์ด์ฆ๋ ์ปค์ง๊ฒ ๋จ
- ์น๋ธ๋ผ์ฐ์ ์์ ์ด๋ฐ ํฐ ์ปดํฌ๋ํธ๋ฅผ ํ ๋ฒ์ ๋ก๋ฉํ๋ ค๊ณ ํ๋ฉด ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ๋ฌธ์ ๊ฐ ์์
- 2018๋ ๋ฆฌ์กํธ ๋ฒ์ 16.6์ด ๋ฆด๋ฆฌ์ฆ๋ ๋ ์ฒ์ ๋ฑ์ฅํ ์ปดํฌ๋ํธ
- ์ญํ ์ ํ์ ์ปดํฌ๋ํธ(children)๊ฐ ์ค๋น๋๊ธฐ ์ ๊น์ง ๋ ๋๋ง์ ์ค๋จํ๋ ๊ฒ
- ํ์ ์ปดํฌ๋ํธ๊ฐ ์ค๋น๋ ์ดํ์ ๋ ๋๋ง์ ์ํด์ผ๋ก์จ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์์ผ์ค ์ ์์
import {lazy, Suspense} from 'react';
import LoadingSpinner from './LoadingSpinner';
const OtherComponent = lazy(() => import('./OtherComponent'));
function MyComponent(props) {
return (
<Suspense fallback={<LoadingSpinner />}>
<OtherComponent />
>/Suspense>
);
}
export default MyComponent;
- Other ์ปดํฌ๋ํธ๊ฐ ์ค๋น๋๊ธฐ ์ ๊น์ง Fallback ์์ฑ์ ๋ค์ด๊ฐ์๋ Loading Spinner๋ผ๋ ์ปดํฌ๋ํธ๋ฅผ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๊ณ , Other ์ปดํฌ๋ํธ๊ฐ ์ค๋น๋๋ฉด ๊ทธ๋ Other ์ปดํฌ๋ํธ๋ฅผ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๊ฒ ๋จ
- ๊ธฐ์กด์ Suspense๋ ์ด๋ ๊ฒ ํด๋ผ์ด์ธํธ์์ ์ฝ๋ ์คํ๋ฆฌํ ๊ณผ ํจ๊ป ์ ํ์ ์ผ๋ก๋ง ์ฌ์ฉ์ด์๋๋ฐ. React ๋ฒ์ 18์์๋ Suspense๋ฅผ ์๋ฒ ๋ ๋๋ง๊ณผ ์ ํ์ ์ผ๋ก ๋ฐ์ดํฐ ํจ์นญ์์๋ ์ฌ์ฉํ ์ ์๋๋ก ์ ๋ฐ์ดํธ
- ์์ผ๋ก ๊ณ์ํด์ ๋ฐ์ ํ๋ค๊ณ ํ๋ ๊ด์ฌ์ ๊ฐ๊ณ ์ง์ผ๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค
๐ญ Code Splitting
- ๊ฐ๋ฐ์๋ค์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ์ปดํฌ๋ํธ์ ์ฝ๋๋ฅผ ์ฌ๋ฌ ์กฐ๊ฐ์ผ๋ก ๋ถ๋ฆฌํ๋ ์ฝ๋ ์คํผ๋ฆฌํ ์ด๋ผ๋ ๊ธฐ๋ฒ์ ์ ์ฉ
- ๋ถ๋ฆฌ๋ ๋ก์ง์ ์ฐ๋ฆฌ๊ฐ ํํ ๋ ์ด์ง ๋ก๋ฉ ๋๋ ๋ค์ด๋๋ฏน ๋ก๋ฉ์ด๋ผ๊ณ ๋ถ๋ฅด๋ ๋์ ๋ก๋ฉ ๊ธฐ๋ฒ์ ์ ์ฉํ์ฌ ์น์ฌ์ดํธ์ ๋ฐ์ ์๋๋ฅผ ๋์ผ ์ ์๊ฒ ๋จ
๐ญ ๋ฆฌ์กํธ DOM ํด๋ผ์ด์ธํธ
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
ReactDOM.render{
<React.StrictMode>
<App />
</React.StrictMode>
document.getElementById('root')
);
- ๊ธฐ์กด์๋ ํด๋ผ์ด์ธํธ์์ ๋ ๋๋ง์ ์ํด์ ๋ค์๊ณผ ๊ฐ์ ํํ๋ก react-dom.render ํจ์ ์ฌ์ฉ
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StricMode>
<App />
</React.StricMode>
);
- ๋ฆฌ์กํธ ๋ฒ์ 18์์๋ react-dom/client๋ผ๋ ํจํค์ง๊ฐ ์๋กญ๊ฒ ์ถ๊ฐ๋์๊ณ , create-root ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋๋ง์ ํ๊ฒ ๋จ
- ํ์ ํธํ์ฑ ๋๋ฌธ์ ๊ธฐ์กด ๋ฐฉ์๋ ์ฌ์ ํ ์ง์ํ์ง๋ง ์๋ก์ด API๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋ฆฌ์กํธ ๋ฒ์ 18์ ์๋ก์ด ๊ธฐ๋ฅ๋ค์ ์ฌ์ฉํ ์ ์์
- ํด๋ผ์ด์ธํธ์์ ๋ ๋๋ง์ ์ํด์๋ createRoot๋ฅผ ์ฌ์ฉ
๐ญ ๋ฆฌ์กํธ DOM ์๋ฒ
- renderToPipeableStream
- NodeJS ํ๊ฒฝ์์ ์คํธ๋ฆฌ๋ฐ์ ์ํ ํจ์
- renderToReadableStream
- Edge runtime ํ๊ฒฝ์ ์ํ ํจ์
๐ญ Strict Mode
- ๋ฆฌ์กํธ์ Strict ๋ชจ๋๋ ๊ฐ๋ฐ ๋ชจ๋์ผ ๋ ์ ์ฌ์ ์ธ ๋ฒ๊ทธ๋ฅผ ์ฐพ์ ์ ์๊ฒ ํด์ฃผ๋ ๋ชจ๋
- ๋ฆฌ์กํธ ๋ฒ์ 18์์๋ Strict ๋ชจ๋์ ๋์๊ธฐ ๋ณ๊ฒฝ๋์๋๋ฐ, ๊ฐ๋ฐ ๋ชจ๋์์ Strict ๋ชจ๋๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ปดํฌ๋ํธ๋ฅผ ์ธ๋ง์ดํธ ์์ผฐ๋ค๊ฐ ๋ค์ ํ ๋ฒ ๋ง์ดํธ ์ํด
- ์ปดํฌ๋ํธ์ ์๋ช ์ฃผ๊ธฐ ํจ์๋ค์ด ์์๊ณผ ๋ค๋ฅด๊ฒ ์ฌ๋ฌ ๋ฒ ํธ์ถ๋ ์ ์์
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StricMode>
<App />
</React.StricMode>
);
- ํด๋์ค ์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ ์ปดํฌ๋ํธ ๋๋ ๋ง์ดํธ๊ฐ ํ ๋ฒ ํธ์ถ๋ ๋ค์ ์ปดํฌ๋ํธ ์์ ๋ง์ดํธ๊ฐ ํธ์ถ๋๊ณ ์ดํ ๋ค์ ์ปดํฌ๋ํธ ๋๋ ๋ง์ดํธ๊ฐ ํธ์ถ
- ์ด๋ฌํ ์ ์ ์ ์ธ์งํ๊ณ ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ฌ ๋ฒ ๋ง์ดํธ ๋์ด๋ ๋ฌธ์ ๊ฐ ์๊ธฐ์ง ์๋๋ก ๊ฐ๋ฐํ๋ ๊ฒ์ด ์ค์
๐ญ useId() ํ
- ์๋ฒ์ ํด๋ผ์ด์ธํธ์์ ๊ณ ์ ํ id ๊ฐ์ ์์ฑํ๊ธฐ ์ํ ํ
- ๋ฆฌ์คํธ๋ฅผ ๋ ๋๋งํ ๋ ๋งต ํจ์ ๋ด์์ ๋ฐํํ๋ element์ key๋ก ์ฌ์ฉํ๋ ์ฉ๋๋ ์๋
๐ญ useTransitions() ํ
- ์์ ํธ๋ ์ง์ ์์ ๋ค๋ค๋ ๊ธด๊ธํ์ง ์์ ์ ๋ฐ์ดํธ๋ฅผ ์ํ ํ
- ๊ธฐ๋ณธ์ ์ผ๋ก ์ผ๋ฐ์ ์ธ ์ํ ์ ๋ฐ์ดํธ๋ ๊ธด๊ธํ ์ ๋ฐ์ดํธ๋ก ์ฒ๋ฆฌ๋๋ฉฐ, useTransitionHook์ด๋ startTransition ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ธด๊ธํ์ง ์์ ์ ๋ฐ์ดํธ๋ฅผ ๋ชจ์์ ์ฒ๋ฆฌํ ์ ์์
๐ญ useDeferredValue() ํ
- ๊ธด๊ธํ์ง ์์ ์ ๋ฐ์ดํธ๋ฅผ ์ฌ๋ ๋๋งํ๋ ๊ฒ์ ์ฐ๊ธฐํ ์ ์๊ฒ ํด์ฃผ๋ ํ
- ์งง์ ์๊ฐ์ ํ ๊ฐ์ง ์ํ์ ์ ๋ฐ์ดํธ๊ฐ ์ฌ๋ฌ ๋ฒ ๋ฐ์ํ๊ฒ ๋๋ฉด ์ต์ข ์ํ๊ฐ๋ง์ ์ ๋ฐ์ดํธ
- ๋ณดํต ๊ฐ์ด ํ๋ ๊ฒ์ ๋ง๋๋ค๋ ์๋ฏธ๋ก ๋๋ฐ์ด์ฑ์ด๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ, useDeferredValue Hook์ด ํ๋ ์ญํ ๋ ๋น์ทํ๋ค๊ณ ๋ณด๋ฉด ๋จ
- ์ง์ฐ๋ ๋ ๋๋ง์ ์ค๋จ ๊ฐ๋ฅํ๋ฉฐ ์ฌ์ฉ์์ ์ ๋ ฅ์ ์ฐจ๋จํ์ง ์์
๐ญ useSyncExternalStore() ํ
- ์ธ๋ถ ์ ์ฅ์๋ฅผ ๊ตฌ๋ ํ ์ ์๊ฒ ํด์ฃผ๋ ํ
- ์ธ๋ถ ์ ์ฅ์๋ฅผ React ์ปดํฌ๋ํธ์ State์ ์ฐ๋ํด์ ์ฌ์ฉํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๊ฒ ๋จ
- ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๊ฐ ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ์ฉํ๊ธฐ ์ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ ๋ฌธ์๋ถ๋ค์ด ์ฌ์ฉํ๋ ์ผ์ ๊ฑฐ์ ์๋ค๊ณ ๋ณด๋ฉด ๋จ
๐ญ useInsertionEffect() ํ
- CSS in JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ํ ํ
- ๋ ๋๋ง ๊ณผ์ ์์ ์คํ์ผ ์ฝ์ ์ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๊ฒ ํด์ค
- useInsertionEffect๋ ์์ ๋์จuseSyncExternalStore๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๊ฐ ์๋ CSS์ธ JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ์ฉํ๊ธฐ ์ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ธ ๋ฆฌ์กํธ ๊ฐ๋ฐ๋ถ์ด ์ฌ์ฉํ๋ ์ผ์ ๊ฑฐ์ ์์
๊ณต๋ถํ ๊ฐ์ ์๋ฃ
[์ง๊ธ ๋ฌด๋ฃ] ์ฒ์ ๋ง๋ ๋ฆฌ์กํธ(React) ๊ฐ์ | Inje Lee (์ํ) - ์ธํ๋ฐ
Inje Lee (์ํ) | ์๋ฐ์คํฌ๋ฆฝํธ์ CSS ๊ธฐ์ด ๋ฌธ๋ฒ๊ณผ ํจ๊ป ๋ฆฌ์กํธ์ ๊ธฐ์ด๋ฅผ ํํํ๊ฒ ๋ค์ง ์ ์์ต๋๋ค., ๊น๋ํ ๊ฐ์์๋ฃ, ๊ผผ๊ผผํ ์ค๋ช ์ผ๋ก์ฝ๊ฒ ๋ฐฐ์ฐ๋ ๋ฆฌ์กํธ ๊ฐ์์ ๋๋ค. ๐จ๐ซ ๋ฆฌ์กํธ์ ์ธ๊ณ๋ก
www.inflearn.com
'Front > React.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] ๋ฆฌ์กํธ Hook (ํ ) (2) | 2024.08.28 |
---|---|
[React] ๋๊ธ ์ปดํฌ๋ํธ ์ ์ (Component & Props) (0) | 2024.08.26 |
[React] ๋ฆฌ์กํธ styled-components๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ ์คํ์ผ๋ง (0) | 2024.08.20 |
[React] ๋ฆฌ์กํธ styled-components (0) | 2024.08.20 |
[React] ๋ฆฌ์กํธ ์คํ์ผ๋ง (Styling) (0) | 2024.08.19 |