μ°μ° κ²°κ³Ό μ¬μ¬μ© νλ λ°©λ²
β μ μ
- μ΄λ―Έ κ³μ° ν΄ λ³Έ μ°μ° κ²°κ³Όλ₯Ό κΈ°μ΅ νκ³ μλ€κ°, λκ°μ κ³μ°μ μν€λ©΄ λ€μ κ³μ°νμ§ μκ³ λ΅λ§ λ°ννλ λ°©λ²
Ex) μν μνμ λ³Ό λ, μ΄λ―Έ νμ΄λ³Έ λ¬Έμ λ λ€μ νμ΄λ³΄μ§ μμλ μ λ΅μ μκ³ μλ κ²
emotion λ³ μΌκΈ°μ κ°μμ λΉμ¨
β App.js
const getDiaryAnalysis = () => {
console.log('μΌκΈ° λΆμ μμ')
const goodCount = data.filter((it)=>it.emotion >= 3).length;
const badCount = data.length - goodCount;
const goodRatio = (goodCount / data.length) * 100;
return {goodCount, badCount, goodRatio}
}
const {goodCount, badCount, goodRatio} = getDiaryAnalysis(); // ν¨μλ‘ νΈμΆν κ²°κ³Ό κ°μ κ°μ²΄λ‘ λ°ν
getDiaryAnalysis
ν¨μλ₯Ό μ μΈνμ¬ filter λ₯Ό μ΄μ©νμ¬emotion
>= 3 μ΄μμΈ κ²μgoodCount
μ λ΄μμ΅λλ€.- 그리κ³
badCount
λ μ 체 μΌκΈ°μμgoodCount
λ₯Ό λΊ μ goodRatio
λ μ 체μμ(goodCount / data.length) * 100;
ν κ°- λ¦¬ν΄ κ°μ κ°μ²΄λ‘ λ°μ΅λλ€.
return (
<div className="App">
<DiaryEditor onCreate={onCreate} />
<div>μ 체 μΌκΈ° : {data.length}</div>
<div>κΈ°λΆ μ’μ μΌκΈ° κ°μ : {goodCount}</div>
<div>κΈ°λΆ λμ μΌκΈ° κ°μ : {badCount}</div>
<div>κΈ°λΆ μ’μ μΌκΈ° λΉμ¨ : {goodRatio}</div>
<DiaryList onEdit={onEdit} onRemove={onRemove} diaryList={data} />
</div>
);
- μ€νμ νκ³ console μ 보면
console.log('μΌκΈ° λΆμ μμ')
μ΄ 2λ² μ°νμ λμ΅λλ€. - λμ€λ μ΄μ λ ( μ 체 μ½λ )
import { useEffect, useRef, useState } from 'react';
import './App.css';
import DiaryEditor from './DiaryEditor';
import DiaryList from './DiaryList';
function App() {
// API νΈμΆ ν¨μ
const getData = async () => {
const res = await fetch(
'https://jsonplaceholder.typicode.com/comments'
).then((res) => res.json());
// κ°μ Έμμ μ¬μ©ν λ°μ΄ν° ( 0 ~ 20 )
const initData = res.slice(0, 20).map((it) => {
return {
author: it.email,
content: it.body,
emotion: Math.floor(Math.random() * 5) + 1,
create_date: new Date().getTime(),
id: dataId.current++,
};
});
setData(initData);
};
useEffect(() => {
getData();
}, []);
const [data, setData] = useState([]); // state-λ°°μ΄λ‘ μ μ₯ν μμ (리μ€νΈ)
const dataId = useRef(0);
const onCreate = (author, content, emotion) => {
const create_date = new Date().getTime();
const newItem = {
author,
content,
emotion,
create_date,
id: dataId.current, // 0 μ κ°λ¦¬ν¨λ€.
};
dataId.current += 1; // id μ κ°μ΄ 1μ© μ¦κ°νλ€.
setData([newItem, ...data]); // μλ‘μ΄ μμ΄ν
μ΄ μλ‘ μ¬λΌμ€κ² νκΈ° μν΄μ newItem μ λ¨Όμ μ¬μ©
};
const onRemove = (targetId) => {
const newDiaryList = data.filter((it) => it.id !== targetId);
setData(newDiaryList);
};
const onEdit = (targetId, newContent) => {
setData(
data.map((it) =>
it.id === targetId ? { ...it, content: newContent } : it
)
);
};
const getDiaryAnalysis = useMemo() => {
console.log('μΌκΈ° λΆμ μμ');
const goodCount = data.filter((it) => it.emotion >= 3).length;
const badCount = data.length - goodCount;
const goodRatio = (goodCount / data.length) * 100;
return { goodCount, badCount, goodRatio };
};
const { goodCount, badCount, goodRatio } = getDiaryAnalysis(); // ν¨μλ‘ νΈμΆν κ²°κ³Ό κ°μ κ°μ²΄λ‘ λ°ν
return (
<div className="App">
<DiaryEditor onCreate={onCreate} />
<div>μ 체 μΌκΈ° : {data.length}</div>
<div>κΈ°λΆ μ’μ μΌκΈ° κ°μ : {goodCount}</div>
<div>κΈ°λΆ λμ μΌκΈ° κ°μ : {badCount}</div>
<div>κΈ°λΆ μ’μ μΌκΈ° λΉμ¨ : {goodRatio}</div>
<DiaryList onEdit={onEdit} onRemove={onRemove} diaryList={data} />
</div>
);
}
export default App;
App
μ»΄ν¬λνΈκ° 첫 Mount κ° λ λ,data
state μ κ°μ λΉ λ°°μ΄μ΄μμ΅λλ€.const [data, setData] = useState([]);
- κ·Έ μκ°μ
const {goodCount, badCount, goodRatio} = getDiaryAnalysis();
ν¨μλ₯Ό ν λ² νΈμΆνκ² λ©λλ€. - κ·Έλμ μ΄ μμ return λ¬Έμ λ°μ΄ν°κ° 0, 0, 0 λ€μ΄κ°λ κ² μ²λΌ λμ ν©λλ€.
- κ·Έ ν μλμ μ½λκ° μ±κ³΅νκ³
setData(initData)
κ° μ΄λ£¨μ΄μ§κ² λλ©΄μ
const getData = async () => {
const res = await fetch(
'https://jsonplaceholder.typicode.com/comments'
).then((res) => res.json());
// κ°μ Έμμ μ¬μ©ν λ°μ΄ν° ( 0 ~ 20 )
const initData = res.slice(0, 20).map((it) => {
return {
author: it.email,
content: it.body,
emotion: Math.floor(Math.random() * 5) + 1,
create_date: new Date().getTime(),
id: dataId.current++,
};
});
setData(initData);
};
data
κ° ν λ² λ°λκ² λ©λλ€.- κ·Έλ¬λ©΄
App
μ»΄ν¬λνΈκ° 리λ λκ° μΌμ΄λκΈ° λλ¬ΈμApp
μ»΄ν¬λνΈ μμ λͺ¨λ ν¨μλ€μ΄ μ¬μμ±μ΄ λκ² λκ³ , 2λ²μ μ½λκ° λ€μ μνμ΄ λμ΄ νΈμΆ λ©λλ€.
- λ§μ½, μΌκΈ°λ₯Ό μμ νκ² λλ©΄
data
state μ μνκ° λ³νκΈ° λλ¬ΈμApp
μ»΄ν¬λνΈκ° ν λ² λ 리λ λκ° μΌμ΄λ©λλ€. κ·Έλ κ² λλ©΄getDiaryAnalysis
λ λ μ€νμ΄ λ©λλ€. - νμ§λ§ λ°μ΄ν°λ₯Ό μμ νλ κ²μ μΌκΈ° λΆμμ κ²°κ³Ό, μ¦ emotion μ μλ¬΄λ° μν₯μ λ―ΈμΉ μ μλλ° κ³μ νΈμΆμ΄ λ©λλ€.
- μ΄λ° κ²½μ°
useMemo
λ₯Ό μ¬μ© ν μ μμ΅λλ€.
β useMemo μ¬μ©
const getDiaryAnalysis = useMemo(
() => { // 첫 λ²μ§Έ μΈμ
console.log('μΌκΈ° λΆμ μμ');
const goodCount = data.filter((it) => it.emotion >= 3).length;
const badCount = data.length - goodCount;
const goodRatio = (goodCount / data.length) * 100;
return { goodCount, badCount, goodRatio };
},[data.length] // λ λ²μ§Έ μΈμ
);
import
λ₯Ό νκ³ , μ΅μ ν νκ³ μΆμ ν¨μλ₯Ό κ°μΈμ£Όλ©΄ λ©λλ€.- 첫 λ²μ§Έ μΈμλ‘ μ½λ°± ν¨μ λ₯Ό λ°μμ μ½λ°± ν¨μκ° λ¦¬ν΄νλ κ°μ μ΅μ ν ν μ μλλ‘ λμμ€λλ€.
- λ λ²μ§Έ μΈμλ‘ λ°°μ΄ μ μ λ¬ ν©λλ€. ( useEffect μμ‘΄μ± λ°°μ΄κ³Ό λμΌ )
- κ²°λ‘ , μμ μ½λλ
[data.lenght]
κ° λ³ν ν λ λ§ μ½λ°±ν¨μκ° λ€μ μννκ² λ©λλ€. data
μ state κ° λ³ν΄λ,[data.lenght]
κ° λ³νμ§ μλ μ΄μgetDiaryAnalysis
λ νΈμΆ νμ§ μμ΅λλ€.
νμ§λ§ μμ μ½λλ₯Ό κ·Έλλ‘ μ€ννλ©΄ μ€λ₯κ° λ©λλ€. useMemoλ‘ κ°μΈκ³ , μμ‘΄μ± λ°°μ΄μ μ λ¬μ ν΄μ ν¨μλ₯Ό μ΅μ νλ₯Ό νλ©΄, λ μ΄μ ν¨μκ° μλκ² λ©λλ€!
useMemo κΈ°λ₯μ ν¨μλ₯Ό μ λ¬μ λ°μμ μ½λ°±ν¨μκ° λ¦¬ν΄νλ κ°μ 리ν΄νκ² λ©λλ€.
- μ¦,
const getDiaryAnalysis
λ ν¨μκ° μλλΌ κ°μ λ¦¬ν΄ λ°κ² λ©λλ€. - μ΄λ κ² λ°κΏμΌ μ μμ μΌλ‘ λμμ΄ λ©λλ€.
//const { goodCount, badCount, goodRatio } = getDiaryAnalysis(); X
const { goodCount, badCount, goodRatio } = getDiaryAnalysis;
μ 리
β useMemo()
- μ΄λ€ ν¨μκ° μκ³ κ·Έ ν¨μκ° μ΄λ€ κ°μ 리ν΄νκ³ μλλ° κ·Έ 리ν΄κΉμ§μ μ°μ°μ μ΅μ ν νκ³ μΆλ€λ©΄,
useMemo
λ₯Ό μ¬μ©ν΄μ μμ‘΄μ± λ°°μ΄μ μ΄λ€ κ°μ΄ λ³νν λλ§ μ°μ°μ λ€μ μ€ν ν κ²μΈμ§ λͺ μνκ² λλ©΄- κ·Έ ν¨μλ₯Ό κ° μ²λΌ μ¬μ©μ ν΄μ μ°μ° μ΅μ νλ₯Ό ν μ μμ΅λλ€.
β μ¦,
- μ°μ°λμ΄ λμ μμ μ΄ λ§€λ² λ λλ§ λ λλ§λ€ λ°λ³΅λλ κ²μ νΌνκΈ° μν΄ μ¬μ©
- λ λλ§μ΄ μΌμ΄λλ λμ μ€ν λλ―λ‘, λ λλ§μ΄ μΌμ΄λλ λμ μ€νλΌμλ μλ μμ μ useMemo() μ λ£μ΄μλ μλ¨
β μ¬μ©λ²
const memoizedValue = useMemo(κ° μμ± ν¨μ, μμ‘΄μ± λ°°μ΄);
- μμ‘΄μ± λ°°μ΄μ΄ λ€μ΄μλ λ³μκ° λ³νμ κ²½μ°μλ§ μλ‘ κ° μμ± ν¨μλ₯Ό νΈμΆνμ¬ κ²°κ³Ό κ°μ λ°ν
- μμ‘΄μ± λ°°μ΄μ λ£μ§ μμ κ²½μ° λ λλ§μ΄ μΌμ΄λ λ λ§λ€ λ§€λ² κ° μμ± ν¨μκ° μ€νλλ―λ‘ μλ―Έκ° μμ
'π Front-End > React.js' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
μ΅μ ν - useCallback (0) | 2022.10.24 |
---|---|
μ΅μ ν - React.memo (0) | 2022.10.24 |
React developer tools (0) | 2022.10.24 |
Reactμμ API νΈμΆ (0) | 2022.10.24 |
useEffect (0) | 2022.10.24 |