From 6ccea03ba38bfd77a9e3de93b6962b6a72b1cefd Mon Sep 17 00:00:00 2001 From: haerong22 Date: Fri, 15 Apr 2022 17:47:05 +0900 Subject: [PATCH] simple diary : optimize --- simplediary/src/App.js | 40 ++++++++++++++++++++++++--------- simplediary/src/DiaryEditor.js | 3 +-- simplediary/src/DiaryItem.js | 8 +++++-- simplediary/src/OptimizeTest.js | 39 ++++++++++++++++++++++++++++++++ simplediary/src/index.js | 18 +++++++-------- 5 files changed, 84 insertions(+), 24 deletions(-) create mode 100644 simplediary/src/OptimizeTest.js diff --git a/simplediary/src/App.js b/simplediary/src/App.js index c0d0d416..b46c088c 100644 --- a/simplediary/src/App.js +++ b/simplediary/src/App.js @@ -1,4 +1,10 @@ -import React, { useRef, useState, useEffect } from "react"; +import React, { + useRef, + useState, + useEffect, + useMemo, + useCallback, +} from "react"; import "./App.css"; import DiaryEditor from "./DiaryEditor"; import DiaryList from "./DiaryList"; @@ -30,7 +36,7 @@ const App = () => { getData(); }, []); - const onCreate = (author, content, emotion) => { + const onCreate = useCallback((author, content, emotion) => { const created_date = new Date().getTime(); const newItem = { @@ -42,26 +48,38 @@ const App = () => { }; dataId.current += 1; - setData([newItem, ...data]); - }; + setData((data) => [newItem, ...data]); + }, []); - const onRemove = (targetId) => { + const onRemove = useCallback((targetId) => { alert(`${targetId}가 삭제되었습니다.`); - const newDiaryList = data.filter((it) => it.id !== targetId); - setData(newDiaryList); - }; + setData((data) => data.filter((it) => it.id !== targetId)); + }, []); - const onEdit = (targetId, newContent) => { - setData( + const onEdit = useCallback((targetId, newContent) => { + setData((data) => data.map((it) => it.id === targetId ? { ...it, content: newContent } : it ) ); - }; + }, []); + + const getDiaryAnalysis = useMemo(() => { + const goodCount = data.filter((it) => it.emotion >= 3).length; + const badCount = data.length - goodCount; + const goodRatio = Math.round((goodCount / data.length) * 100, -1); + return { goodCount, badCount, goodRatio }; + }, [data.length]); + + const { goodCount, badCount, goodRatio } = getDiaryAnalysis; return (
+
전체 일기 : {data.length}
+
기분 좋은 일기 : {goodCount}
+
기분 나쁜 일기 : {badCount}
+
기분 좋은 일기 비율: {goodRatio} %
); diff --git a/simplediary/src/DiaryEditor.js b/simplediary/src/DiaryEditor.js index 775154d1..5a88171c 100644 --- a/simplediary/src/DiaryEditor.js +++ b/simplediary/src/DiaryEditor.js @@ -3,7 +3,6 @@ import React, { useRef, useState } from "react"; const DiaryEditor = ({ onCreate }) => { const authorInput = useRef(); const contentInput = useRef(); - const [state, setState] = useState({ author: "", content: "", @@ -77,4 +76,4 @@ const DiaryEditor = ({ onCreate }) => { ); }; -export default DiaryEditor; +export default React.memo(DiaryEditor); diff --git a/simplediary/src/DiaryItem.js b/simplediary/src/DiaryItem.js index 152b8ba0..bf54b588 100644 --- a/simplediary/src/DiaryItem.js +++ b/simplediary/src/DiaryItem.js @@ -1,4 +1,4 @@ -import { useRef, useState } from "react"; +import React, { useRef, useState, useEffect } from "react"; const DiaryItem = ({ onEdit, @@ -9,6 +9,10 @@ const DiaryItem = ({ emotion, id, }) => { + useEffect(() => { + console.log(`${id}번 째 아이템 렌더`); + }); + const [isEdit, setIsEdit] = useState(false); const [localContent, setLocalContent] = useState(content); @@ -76,4 +80,4 @@ const DiaryItem = ({ ); }; -export default DiaryItem; +export default React.memo(DiaryItem); diff --git a/simplediary/src/OptimizeTest.js b/simplediary/src/OptimizeTest.js new file mode 100644 index 00000000..ad49519c --- /dev/null +++ b/simplediary/src/OptimizeTest.js @@ -0,0 +1,39 @@ +import React, { useState } from "react"; + +const CounterA = React.memo(({ count }) => { + console.log(`counter a update - count: ${count}`); + return
{count}
; +}); + +const areEqual = (prev, next) => { + return prev.obj.count === next.obj.count; +}; + +const CounterB = React.memo(({ obj }) => { + console.log(`counter b update - obj.count: ${obj.count}`); + return
{obj.count}
; +}, areEqual); + +const OptimizeTest = () => { + const [count, setCount] = useState(1); + const [obj, setObj] = useState({ + count: 1, + }); + + return ( +
+
+

Counter A

+ + +
+
+

Counter B

+ + +
+
+ ); +}; + +export default OptimizeTest; diff --git a/simplediary/src/index.js b/simplediary/src/index.js index 1675893a..0fb617a8 100644 --- a/simplediary/src/index.js +++ b/simplediary/src/index.js @@ -1,11 +1,11 @@ -import React from 'react'; -import ReactDOM from 'react-dom/client'; -import './index.css'; -import App from './App'; +import React from "react"; +import ReactDOM from "react-dom/client"; +import "./index.css"; +import App from "./App"; -const root = ReactDOM.createRoot(document.getElementById('root')); +const root = ReactDOM.createRoot(document.getElementById("root")); root.render( - - - -); \ No newline at end of file + // + + // +);