๐ง ๋ ๋๋ง์ด ๋ฐ์ํ๋ ์กฐ๊ฑด
1. ์ปดํฌ๋ํธ์ state๊ฐ ๋ณ๊ฒฝ๋์์ ๋
2. ์ปดํฌ๋ํธ๊ฐ ์์๋ฐ์ props๊ฐ ๋ณ๊ฒฝ๋์์ ๋
3. ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง์ด ๋ ๊ฒฝ์ฐ ์์ ์ปดํฌ๋ํธ๋ ๋ชจ๋ ๋ฆฌ๋ ๋๋ง
๐ง๋ ๋๋ง ์ฑ๋ฅ ์ต์ ํ ๋ฐฉ๋ฒ
1. hook (useMemo, useCallback)
useMemo - ๊ณ์ฐ์ ์ฌ์คํ์ ๋ฐฉ์ง
useCallback - ํจ์์ ์ฌ์์ฑ์ ๋ฐฉ์ง
2. ContextAPI, ๊ธฐํ ์ํ ๊ด๋ฆฌํด
ContextAPI - ์ปดํฌ๋ํธ ๊ฐ์ ๊ฐ์ ๊ณต์ , ์ฃผ๋ก ์ ์ญ์ ์ผ๋ก ํ์ํ ๊ฐ์ ๋ค๋ฃฐ ๋ ์ฌ์ฉ
- ํด๋น ๊ฐ์ด ํ์ํ ์ปดํฌ๋ํธ์๋ง ์ ๋ฌํ์ฌ ๋ฆฌ๋ ๋๋ง ์ํค๊ณ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ ๋ฆฌ๋ ๋๋ง ๋์ง ์๊ฒ ํ๊ธฐ
recoil - ์ ์ญ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
3. windowning - ํ์ฌ ํ๋ฉด์ ๋ณด์ด๋ ํญ๋ชฉ๋ง ๋ ๋๋ง ํ์ฌ ์ฑ๋ฅ ํฅ์ (๋ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ : React-Virtualized)
๋ ๋๋ง์ด๋?
์ปดํฌ๋ํธ๊ฐ ํ์ฌ props์ state์ ์ํ์ ๊ธฐ์ดํด UI๋ฅผ ์ด๋ป๊ฒ ๊ตฌ์ฑํ ์ง, ์ปดํฌ๋ํธ์๊ฒ ์์ ์ ์์ฒญํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
React์ ๋ ๋๋ง ๊ณผ์
๊ธฐ๋ณธ์ ์ธ ๋ฆฌ์กํธ์ ๋ ๋๋ง ๊ฐ๋ ์ ๋ฃจํธ <div id="root"></div> DOM๋ถํฐ ์์ํด ํ๋๊ทธ๊ฐ ์ง์ ๋์ด ์๋ ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ ์ฐพ์์ ๋ ๋๋ง์ ์งํํ๋ ๊ฒ์ ๋งํ๋ค.
- root id๋ public/index.html์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์ ์ด ๋์ด์๋ค.
- DOM์ HTML parser์ ์ํด ์์ฑ๋ ํธ๋ฆฌ ๊ตฌ์กฐ์ Node ๊ฐ์ฒด ๋ชจ๋ธ์ด๋ค.
const root = ReactDOM.createRoot(
document.getElementById('root')
);
const element = <h1>Hello, world</h1>;
root.render(element);
๊ธฐ๋ณธ์ ์ผ๋ก ๋ฆฌ์กํธ์ ๋ ๋๋ง์ ์ด๋ฌํ DOM ์๋ฆฌ๋จผํธ๋ฅผ ReactDOM.createRoot()์ ์ ๋ฌํ ๋ค์, ๊ทธ React Element๋ฅผ root.render()์ ์ ๋ฌํ๋ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
React Element
// createElement๋ฅผ ์ด์ฉํด์ React Element ๋ง๋ค๊ธฐ
// ์ฌ์ฉํ๊ธฐ๊ฐ ์ด๋ ต๊ณ , ์ง๊ด์ ์ด์ง ์๋ค.
// React Element๋ ๋ถ๋ณ๊ฐ์ฒด๋ก ์์ฉ
// ์๋ฆฌ๋จผํธ๊ฐ ์์ฑ๋ ์ดํ์๋ ํด๋น ์๋ฆฌ๋จผํธ์ ์์ฑ๊ณผ ์์์ ๋ณ๊ฒฝํ ์ ์๋ค.
React.createElement(
'div',
{ className: 'name' },
'React'
)
// ์์ ๊ฐ์ ์๋ฏธ (JSX ๋ฌธ๋ฒ)
<div className='name'>React</div>
// createElement๋ฅผ ์ด์ฉํด์ ๋ง๋ค์ด์ง React Element ๊ฐ์ฒด
{
type: 'div',
props: {
className: 'name',
children: 'React'
}
}
- ๋ฆฌ์กํธ ์๋ฆฌ๋จผํธ๋ type๊ณผ props๋ฅผ ๊ฐ์ง๋ React๋ง์ ๊ฐ์ฒด์ด๋ค.
- React.creatElement()๋ฅผ ์ด์ฉํด ๋ง๋ค ์ ์๋ค.
- type์ผ๋ก HTML ํ๊ทธ ์ด๋ฆ์ ๊ฐ์ง๋ค.
- ๊ทธ ์ด์ธ์ ํน์ง์ props๋ก ๊ด๋ฆฌํ๋ ๊ฐ์ฒด ํํ๋ก ์ ์๋๋ค.
React์์ ๋ ๋๋ง์ด ๋ฐ์ํ๋ ์กฐ๊ฑด
- ์ปดํฌ๋ํธ์ state๊ฐ ๋ณ๊ฒฝ๋์์ ๋
- ์ปดํฌ๋ํธ๊ฐ ์์๋ฐ์ props๊ฐ ๋ณ๊ฒฝ๋์์ ๋
- ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง์ด ๋ ๊ฒฝ์ฐ ์์ ์ปดํฌ๋ํธ๋ ๋ชจ๋ ๋ฆฌ๋ ๋๋ง
- ๋ฆฌ์กํธ์์ ๋ ๋๋ง์ด ์ผ์ด๋๋ฉด UI๋ฅผ ๋ค์ ๊ทธ๋ ค์ฃผ๋ ์์ ์ ์ค์ํ๋ค.
- ๋ฆฌ๋ ๋๋ง์ด ์์ฃผ ์ผ์ด๋๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ชจ๋๊ณ ๋น์ฉ์ด ๋ฐ์ํ๊ฒ ๋๋ค.
- ๋ถํ์ํ ๋ ๋๋ง์ด ๋ฐ์ํ์ง ์๊ธฐ ์ต์ ํ ์์ ์ ํด์ผ ํ ํ์๊ฐ ์๋ค.
๋ ๋๋ง ์ฑ๋ฅ ์ต์ ํ ๋ฐฉ๋ฒ
useMemo (react hook) : ๊ณ์ฐ์ ์ฌ์คํ์ ๋ฐฉ์ง
๊ณ์ฐ ๋น์ฉ์ด ๋์ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ฐ ์ฌ์ฉํ๋ค.
๋ฉ๋ชจ์ด์ ์ด์ (Memoization)์ ํจ์์ ๋ฐํ ๊ฐ์ ์ ์ฅํด ๋๊ณ , ๋์ผํ ์ธ์๊ฐ ์ ๋ฌ๋ ๋ ์ด์ ์ ์ ์ฅ๋ ๊ฐ์ ๋ฐํํ์ฌ ์ค๋ณต๋ ๊ณ์ฐ์ ํผํ๋ ์ต์ ํ ๊ธฐ๋ฒ์ด๋ค.
์์ : ์ฃผ์ด์ง ๋ฐฐ์ด์ ํฉ๊ณ๋ฅผ ๊ณ์ฐํ๋ ํจ์
function calculateTotal(array) {
console.log('๊ณ์ฐ์ด ์ํ๋ฉ๋๋ค.');
return array.reduce((acc, curr) => acc + curr, 0);
}
- ๋ฐฐ์ด์ ํฉ๊ณ๋ฅผ ๊ณ์ฐ
- ๊ฐ ํธ์ถ ์์ '๊ณ์ฐ์ด ์ํ๋ฉ๋๋ค.'๋ผ๋ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅ
// ์ด ํจ์๋ฅผ ์ฌ์ฉํ์ฌ React ์ปดํฌ๋ํธ์์ ๋ฐฐ์ด์ ํฉ๊ณ๋ฅผ ๊ณ์ฐํ๊ณ ๋ ๋๋งํ๋ ์์
import React, { useState } from 'react';
function MyComponent({ data }) {
const [array, setArray] = useState(data);
const total = calculateTotal(array);
return (
<div>
<p>๋ฐฐ์ด์ ํฉ๊ณ: {total}</p>
<button onClick={() => setArray([...array, Math.random() * 10])}>๊ฐ ์ถ๊ฐ</button>
</div>
);
}
- ์ด ์ปดํฌ๋ํธ์์๋ calculateTotal ํจ์๋ฅผ ํธ์ถํ์ฌ ๋ฐฐ์ด์ ํฉ๊ณ๋ฅผ ๊ณ์ฐ
- ๋ฐฐ์ด์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค calculateTotal ํจ์๊ฐ ๋ค์ ์คํ๋์ด ํฉ๊ณ๋ฅผ ๊ณ์ฐํ๊ฒ ๋จ
- ์ด๋ ๊ฒ ๋๋ฉด ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ ์ปค์ง๋ฉด ์ฑ๋ฅ์ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค.
// useMemo๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐ
import React, { useState, useMemo } from 'react';
function MyComponent({ data }) {
const [array, setArray] = useState(data);
const total = useMemo(() => calculateTotal(array), [array]);
return (
<div>
<p>๋ฐฐ์ด์ ํฉ๊ณ: {total}</p>
<button onClick={() => setArray([...array, Math.random() * 10])}>๊ฐ ์ถ๊ฐ</button>
</div>
);
}
- useMemo ํ ์ ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋ ์ข ์์ฑ ๋ฐฐ์ด์ด ๋ณ๊ฒฝ๋ ๋์๋ง ๋ฉ๋ชจ์ด์ ์ด์ ๋ ๊ฐ์ด ์ฌ๊ณ์ฐ
- ๋ฐฐ์ด์ด ๋ณ๊ฒฝ๋ ๋๋ง calculateTotal ํจ์๊ฐ ํธ์ถ
- ์ด๋ ๊ฒ ํ๋ฉด ๋ถํ์ํ ๊ณ์ฐ์ ํผํ ์ ์์ด ์ฑ๋ฅ์ด ํฅ์๋๋ค.
useCallback (react hook) : ํจ์์ ์ฌ์์ฑ์ ๋ฐฉ์ง
์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ฐ ์ฌ์ฉํ๋ค.
์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง ๋ ๋๋ง๋ค ์๋ก์ด ํจ์ ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ค.
์ฃผ๋ก ์์ ์ปดํฌ๋ํธ์ ์ฝ๋ฐฑ ํจ์๋ฅผ props๋ก ์ ๋ฌํ ๋ ์ฌ์ฉ๋๋ค.
// ์์
import React, { useState, useCallback } from 'react';
function ChildComponent({ onClick }) {
return (
<button onClick={onClick}>ํด๋ฆญ</button>
);
}
function ParentComponent() {
const [count, setCount] = useState(0);
const handleClick = useCallback(() => {
setCount(count + 1);
}, [count]); // count๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง handleClick์ด ์๋ก์ด ํจ์๋ฅผ ์์ฑ
return (
<div>
<p>ํด๋ฆญ ์: {count}</p>
<ChildComponent onClick={handleClick} />
</div>
);
}
- handleClick ํจ์๋ count ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ์ฝ๋ฐฑ ํจ์
- ์ด ํจ์๋ useCallback ํ ์ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ์ด์ ์ด์ ๋จ.
- ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก [count]๋ฅผ ์ ๋ฌํจ์ผ๋ก์จ, count ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์๋ก์ด ํจ์๊ฐ ์์ฑํ๋ค.
- ์ด๋ ๊ฒ ํ๋ฉด ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง ๋ ๋๋ง๋ค ์๋ก์ด ํจ์๊ฐ ์์ฑ๋์ง ์๊ณ , ์ด์ ์ ์์ฑ๋ ํจ์๋ฅผ ์ฌ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์๋ค.
ContextAPI
๋ฆฌ์กํธ ์ปดํฌ๋ํธ ๊ฐ์ ๊ฐ์ ๊ณต์ ํ ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฅ์ผ๋ก ์ฃผ๋ก ์ ์ญ์ ์ผ๋ก ํ์ํ ๊ฐ์ ๋ค๋ฃฐ ๋ ์ฌ์ฉํ๋ค.
๋ฆฌ์กํธ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์์ ์ปดํฌ๋ํธ์ธ ํ๋์ ๋จ๋ฐฉํฅ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด์ฃผ๋๋ฐ ๊น์ด๊ฐ ๊น๊ฑฐ๋ ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํด์ผ ํ๋ค๋ฉด ๋ณต์กํด์ง ์ ์๋ค.
Context API ํตํด prop ์ ๋ฌ์ ๋ณต์ก์ฑ์ ์ค์ด๊ณ ์ปดํฌ๋ํธ ๊ณ์ธต ๊ตฌ์กฐ์ ๊น์ ๊ณณ์์๋ ๋ฐ์ดํฐ์ ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋ค.
- ์ต์ ํ๋ ๊ฐ ์ ๋ฌ
- ์ ์ญ์ ์ธ ์ํ๋ฅผ ๊ด๋ฆฌํ ๋, ๊ฐ๋ฅํ ์ต์ํ์ ๊ฐ๋ง์ context์ ํฌํจ์ํจ๋ค.
- ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ํ์๋ก ํ๋ ๊ฐ์ context์ ํฌํจ์ํค์ง ์๊ณ ,
- ํด๋น ๊ฐ์ด ํ์ํ ์ปดํฌ๋ํธ์๋ง ์ ๋ฌํ๋ค.
- ๋ ๋๋ง ๋ฒ์ ์ต์ ํ
- ์ค์ ๋ก ํด๋น context ๊ฐ์ ํ์๋ก ํ๋ ์ปดํฌ๋ํธ์๋ง ํด๋น context๋ฅผ ์ ๋ฌํ์
- ๋ถํ์ํ ์ปดํฌ๋ํธ์๋ ์ ๋ฌํ์ง ๋ง์
- ๋ฉ๋ชจ์ด์ ์ด์
์ฌ์ฉ
- context ๊ฐ์ ์ ๋ฌํ๋ ํจ์๋ ์ปดํฌ๋ํธ๊ฐ ๋ถํ์ํ๊ฒ ์ฌ์คํ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด useMemo ๋ useCallback์ ์ฌ์ฉํ์
- ์ด๋ฅผ ํตํด context ๊ฐ์ด ๋ณ๊ฒฝ๋์ง ์๋ ํ ํด๋น ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ ๋๋ง๋์ง ์๋๋ก ํ๋ค.
- ์ปจํ
์คํธ ๊ฐ์ ๋ณ๊ฒฝ ์ต์ํ
- context ๊ฐ์ ๋ณ๊ฒฝํ ๋๋ ์ค์ ๋ก ๋ณ๊ฒฝ์ด ํ์ํ์ง๋ฅผ ๊ฒํ ํ๊ณ , ์ต์ํ์ ๋ณ๊ฒฝ๋ง ์ํํ์.
- ๋ถํ์ํ ๋ณ๊ฒฝ์ ์ปดํฌ๋ํธ ํธ๋ฆฌ ์ ์ฒด์ ์ํฅ์ ๋ฏธ์น๋ฉฐ, ์ฑ๋ฅ์ ์ ํ์ํฌ ์ ์๋ค.
- React DevTools ํ์ฉ
- React DevTools๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ ํธ๋ฆฌ์ ๋ ๋๋ง์ ๋ถ์ํ์
- ๋ถํ์ํ ๋ ๋๋ง์ด ๋ฐ์ํ๋ ๋ถ๋ถ์ ์๋ณํ์
- ์ด๋ฅผ ํตํด ์ต์ ํ๊ฐ ํ์ํ ๋ถ๋ถ์ ํ์
ํ๊ณ ๊ฐ์ ํ ์ ์๋ค.
์์ : ์ธ์ด ์ค์ ๊ฐ์ context์ ์ ์ฅํ์ฌ ๋ค๊ตญ์ด ์ง์์ ์ ๊ณตํ๋ ๊ฒฝ์ฐ
// LanguageContext.js
import React, { createContext, useState, useContext } from 'react';
const LanguageContext = createContext();
export const LanguageProvider = ({ children }) => {
const [language, setLanguage] = useState('en');
const changeLanguage = (newLanguage) => {
setLanguage(newLanguage);
};
return (
<LanguageContext.Provider value={{ language, changeLanguage }}>
{children}
</LanguageContext.Provider>
);
};
export const useLanguage = () => {
return useContext(LanguageContext);
};
- ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ์ธ์ด ์ค์ ๊ฐ์ ํ์๋ก ํ๋ ๊ฒ์ ์๋๋ค.
- ์๋ฅผ ๋ค์ด, Header์ Footer ์ปดํฌ๋ํธ๋ง ์ธ์ด ์ค์ ๊ฐ์ ํ์๋ก ํ ์ ์๋ค.
// Header.js
import React from 'react';
import { useLanguage } from './LanguageContext';
const Header = () => {
const { language } = useLanguage();
return (
<header>
<h1>{language === 'en' ? 'Hello' : '์๋
ํ์ธ์'}</h1>
</header>
);
};
export default Header;
// Footer.js
import React from 'react';
import { useLanguage } from './LanguageContext';
const Footer = () => {
const { language } = useLanguage();
return (
<footer>
<p>{language === 'en' ? '© 2024 MyWebsite. All rights reserved.' : '© 2024 ๋ด์น์ฌ์ดํธ. ํ๊ถ ์์ .'}</p>
</footer>
);
};
export default Footer;
- ์ ์ฝ๋์์๋ Header์ Footer ์ปดํฌ๋ํธ์์๋ง ์ธ์ด ์ค์ ๊ฐ์ ํ์
- ๋ฐ๋ผ์ ์ด ๋ ์ปดํฌ๋ํธ์๋ง ํด๋น ๊ฐ์ ์ ๋ฌ
- ๋ค๋ฅธ ์ปดํฌ๋ํธ์๋ ์ ๋ฌํ์ง ์๋๋ค.
- ์ด๋ฅผ ํตํด ํด๋น ์ปดํฌ๋ํธ๋ง ์ธ์ด ์ค์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋ ์ฌ๋ ๋๋ง๋๋๋ก ํ ์ ์๋ค.
// App.js
// App.js
import React from 'react';
import { LanguageProvider } from './LanguageContext';
import Header from './Header';
import Footer from './Footer';
const App = () => {
return (
<LanguageProvider>
<div className="App">
<Header />
<main>
{/* ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ค */}
</main>
<Footer />
</div>
</LanguageProvider>
);
};
export default App;
- LanguageProvider ์ปดํฌ๋ํธ๋ก ์ธ์ด ์ค์ ๊ฐ์ ์ ๊ณต
- Header์ Footer ์ปดํฌ๋ํธ๋ LanguageProvider ์ปดํฌ๋ํธ ๋ด์ ์๊ธฐ ๋๋ฌธ์ useLanguage ํ ์ ํตํด ์ธ์ด ์ค์ ๊ฐ์ ๊ฐ์ ธ์ ์ฌ์ฉ ๊ฐ๋ฅ
- Header์ Footer ์ปดํฌ๋ํธ๋ง ์ธ์ด ์ค์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋ ์ฌ๋ ๋๋ง๋๋ค.
- ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ค์ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
useContext
ํจ์ํ ์ปดํฌ๋ํธ์์ Consumer๋ฅผ ๋์ ํ์ฌ useContext hook์ ์ฌ์ฉํ์ฌ ํ์ฌ์ํ๋ฅผ ๊ตฌ๋ ํ ์ ์๋ค.
context๋ฅผ ์ฝ๊ณ ์ํ ๋ณํ๋ฅผ ๊ตฌ๋ ํ๋ ๊ฒ๋ง ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ Provider๋ฅผ ์ฌ์ฉํ์ฌ context ์ํ๋ฅผ ์ ๋ฐ์ดํธํด์ค์ผ ํ๋ค.
const value = useContext(MyContext);
Context API์ ์น๋ช ์ ๋จ์
- Context API๋ Provider ํ์์ ๋ชจ๋ Consumer๋ค์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋๋๋ง์ด ๋๋ค.
- ์ฆ, Context๋ฅผ ์ฌ์ฉํ์ง ์์ ์ปดํฌ๋ํธ๋ ๋ฆฌ๋๋๋ง์ด ๋ฐ์ํ๋ค๋ ๊ฒ!
Context ๋ด์ฉ๋ฌผ ๋์ด์ฌ๋ฆฌ๊ธฐ
์์ : ๋ง์ฐ์ค๊ฐ ์์ง์ด๋ฉด ์ํ๋ฅผ ๊ณ์ ์ ๋ฐ์ดํธ
const App = () => {
const [mousePosition, setMousePosition] = useState<[number, number]>([0, 0]);
// ๋ง์ฐ์ค ์์ง์์ ๊ฐ์งํ์ฌ mousePosition ์ํ ๊ณ์ ์
๋ฐ์ดํธ
useEffect(() => {
document.addEventListener('mousemove', (event) => {
setMousePosition([event.clientX, event.clientY]);
});
}, []);
return (
<MouseMovementContext.Provider value={mouseMovementContextValue}>
<Header />
<Article title="์ค๋๋ ์ฆ๊ฑฐ์ด ํ๋ฃจ" content="์ค๋ ์๋ฒฝ์ ์ข ๋ง์ด ์ถ์์ ๊ทธ๋ฐ์ง ์์นจ์ ํ๋ค์์ด์. ์ผ๊ต์ฐจ๊ฐ ํฌ๋ ์กฐ์ฌํ๋๋ก ํฉ์๋ค.">
<MousePositionMeter />
</Article>
<Article title="๋๋ํผ์๊ฐ 4์ฒ์์ด๋ฉด ๊ฝค ๊ด์ฐฎ์๋ฐ?" content="ํผ์์น์ฆ ์น์ด๋จน์ผ๋ฉด ๋๋์ฑ ๋ง์์ต๋๋ค. ๊ทผ๋ฐ ์ง์ ํผ์์น์ฆ๊ฐ ์์ด์ผ ํฉ๋๋ค." />
<Article title="ํ๋ค์๋ ์ผ์ฃผ์ผ์ด ๋๋์ด ๋" content="๋๋ฌด ๋นก์ผ๊ฑฐ๊ฐ๋ค. ์ผ๊ทผ๋ ์ ๋นํ ํด์ผ์ง!!" />
<Footer />
</MouseMovementContext.Provider>
);
};
- MouseMovementContext๊ฐ ์๊ณ ๋ง์ฐ์ค๊ฐ ์์ง์ด๋ฉด ์ํ๋ฅผ ๊ณ์ ์ ๋ฐ์ดํธ
- MouseMovementContext๋ก๋ถํฐ ๋ง์ฐ์ค์ ์์น ์ํ ๊ฐ์ ๋ฐ๋ ์ปดํฌ๋ํธ๋ MousePositionMeter ๋ฐ์ ์๋ค.
์ ์ฝ๋๋ ์ ์ฒด๊ฐ ๋ฆฌ๋ ๋๋ง ๋๋ค.
- App์์ setState๋ฅผ ํจ์ผ๋ก์จ App์์ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์
- ํจ์์์ ๋ Header, Article, Footer๋ฅผ ํธ์ถํ์ฌ ๋ฆฌ๋ ๋๋ง ๋๋ค.
// ๋ด์ฉ ๋์ด์ฌ๋ฆฌ๊ธฐ๋ฅผ ์ ์ฉํ ์ฝ๋
const MouseMovementProvider = ({ children }: PropsWithChildren) => {
const [mousePosition, setMousePosition] = useState<[number, number]>([0, 0]);
// ๋ง์ฐ์ค ์์ง์์ ๊ฐ์งํ์ฌ mousePosition ์ํ ๊ณ์ ์
๋ฐ์ดํธ
useEffect(() => {
document.addEventListener('mousemove', (event) => {
setMousePosition([event.clientX, event.clientY]);
});
}, []);
return (
<MouseMovementContext.Provider value={mouseMovementContextValue}>
{children}
</MouseMovementContext.Provider>
);
}
const App = () => {
return (
<MouseMovementProvider>
<Header />
<Article title="์ค๋๋ ์ฆ๊ฑฐ์ด ํ๋ฃจ" content="์ค๋ ์๋ฒฝ์ ์ข ๋ง์ด ์ถ์์ ๊ทธ๋ฐ์ง ์์นจ์ ํ๋ค์์ด์. ์ผ๊ต์ฐจ๊ฐ ํฌ๋ ์กฐ์ฌํ๋๋ก ํฉ์๋ค.">
<MousePositionMeter />
</Article>
<Article title="๋๋ํผ์๊ฐ 4์ฒ์์ด๋ฉด ๊ฝค ๊ด์ฐฎ์๋ฐ?" content="ํผ์์น์ฆ ์น์ด๋จน์ผ๋ฉด ๋๋์ฑ ๋ง์์ต๋๋ค. ๊ทผ๋ฐ ์ง์ ํผ์์น์ฆ๊ฐ ์์ด์ผ ํฉ๋๋ค." />
<Article title="ํ๋ค์๋ ์ผ์ฃผ์ผ์ด ๋๋์ด ๋" content="๋๋ฌด ๋นก์ผ๊ฑฐ๊ฐ๋ค. ์ผ๊ทผ๋ ์ ๋นํ ํด์ผ์ง!!" />
<Footer />
</MouseMovementProvider>
);
};
- Header, Article, Footer๋ฅผ children์ ํตํด์ ์ ๋ฌ
- ์ด ์ปดํฌ๋ํธ๋ค์ App์ด ๋ ๋๋ง ํ์ฌ MouseMovementProvider์ ๋๊ฒจ์ฃผ๊ธฐ ๋๋ฌธ์ App์ด ๋ฆฌ๋ ๋๋ง ๋์ง ์๋ ์ด์ Header, Article, Footer์ ๋ฆฌ๋ ๋๋ง ๋์ง ์๋๋ค
- ์ฆ MouseMovementProvider๊ฐ ๊ณ์ ๋ฆฌ๋ ๋๋ง ๋์ด๋ Header, Article, Footer๋ ๋ฆฌ๋ ๋๋ง ๋์ง ์๋๋ค.
- MousePositionMeter์์๋ useContext(MouseMovementContext)๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฆฌ๋ ๋๋ง์ด ๋๋ค.
์๋๋(Windowing)
๋๊ท๋ชจ ๋ชฉ๋ก์ด๋ ํ ์ด๋ธ๊ณผ ๊ฐ์ ํฐ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๊ฐ์ง ๋ชฉ๋ก์ ํจ์จ์ ์ผ๋ก ๋ ๋๋ง ํ๋ ๊ธฐ์ ์ด๋ค.
๋ธ๋ผ์ฐ์ ์์ ํ ๋ฒ์ ๋ง์ ํญ๋ชฉ์ ๋ ๋๋ง ํ์ง ์๊ณ , ํ์ฌ ํ๋ฉด์ ๋ณด์ด๋ ํญ๋ชฉ๋ง ๋ ๋๋ง ํ์ฌ ์ฑ๋ฅ์ ํฅ์ํ ์ ์๋ค.
๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋์ธ React-Virtualized๊ฐ ์๋ค.
์์ : ๋ฌดํ ์คํฌ๋กค ํ์ด์ง
import React from 'react';
import { List } from 'react-virtualized';
const MyListComponent = ({ data }) => {
const rowRenderer = ({ index, key, style }) => {
return (
<div key={key} style={style}>
{data[index]}
</div>
);
};
return (
<List
width={300}
height={500}
rowCount={data.length}
rowHeight={30}
rowRenderer={rowRenderer}
/>
);
};
export default MyListComponent;
- react-virtualized์ List ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ๋ชฉ๋ก์ ๋ ๋๋ง ํ๋ค.
- List ์ปดํฌ๋ํธ๋ data ๋ฐฐ์ด์ ๊ฐ ํญ๋ชฉ์ ํจ์จ์ ์ผ๋ก ๋ ๋๋ง ํ๊ธฐ ์ํด rowRenderer ํจ์๋ฅผ ํธ์ถ
- rowRenderer ํจ์๋ ๊ฐ ํญ๋ชฉ์ ์ธ๋ฑ์ค์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ ๋๋ง ํ๋ ์ญํ
์ด์ ๋ฐ์ดํฐ๊ฐ ์๋ฐฑ ๋๋ ์์ฒ ๊ฐ์ ํญ๋ชฉ์ ๊ฐ์ง ๋ชฉ๋ก์ด๋ผ๊ณ ๊ฐ์
- ์์ ์ฝ๋๋ ์ฌ์ฉ์์๊ฒ ์ค์ ๋ก ๋ณด์ด๋ ํญ๋ชฉ๋ง ๋ ๋๋ง ํ์ฌ ์ฑ๋ฅ์ด ํฌ๊ฒ ํฅ์๋๋ค.
- ์ฌ์ฉ์๊ฐ ์คํฌ๋กค์ ํ ๋๋ง๋ค List ์ปดํฌ๋ํธ๋ ํ์ฌ ํ๋ฉด์ ๋ณด์ด๋ ํญ๋ชฉ๋ง ๋ ๋๋งํด ๋ฉ๋ชจ๋ฆฌ์ CPU ๋ฆฌ์์ค๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
์ด๊ฒ์ด ์๋๋์ ์ฌ์ฉํ ๋ ๋๋ง ์ต์ ํ์ ํต์ฌ์ด๋ค. ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ์ฌ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์ํ ์ ์๋ค.
'Frontend > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React Router: push์ replace์ ์ฐจ์ด์ (0) | 2024.10.15 |
---|---|
React Hook Form์ handleSubmit์ผ๋ก ํผ ์ ์ถ ์ ํ์ด์ง ๋ฆฌ๋ ๋๋ง ๋ฐฉ์งํ๊ธฐ (0) | 2024.09.26 |
React Router v6 (0) | 2024.09.26 |
Hook์ ๊ท์น (0) | 2024.05.08 |
๋ฆฌ์กํธ๋ฒ์ 18๋ถํฐ ๋ฑ์ฅํ๋ Batching ๊ฐ๋ (0) | 2024.05.03 |