diff --git a/05-hooks/src/App.css b/05-hooks/src/App.css index 74b5e053..792cfd10 100644 --- a/05-hooks/src/App.css +++ b/05-hooks/src/App.css @@ -17,7 +17,7 @@ background-color: #282c34; min-height: 100vh; display: flex; - flex-direction: column; + flex-direction: row; align-items: center; justify-content: center; font-size: calc(10px + 2vmin); diff --git a/05-hooks/src/App.js b/05-hooks/src/App.js index ed337b0b..69e0c894 100644 --- a/05-hooks/src/App.js +++ b/05-hooks/src/App.js @@ -2,31 +2,98 @@ import React, { useReducer, useRef } from "react"; import logo from "./logo.svg"; import "./App.css"; +import { useImmer } from "use-immer"; + +const CharList = () => { + const [state, updateState] = useImmer({ + char: [ + { + id: 1, + name: "Yutsuo", + class: { id: "1", label: "monk" }, + level: { clvl: "120", jlvl: "70" } + }, + { + id: 2, + name: "Hee-Tae", + class: { id: "2", label: "monk" }, + level: { clvl: "80", jlvl: "55" } + } + ] + }); + + const jobLevelUp = event => { + // updateState(draft => { + // draft.char[0].level.jlvl++; + // }); + console.log("event.target.id :", event.target); + console.log('state.char :', state.char); + console.log('state.char[0] :', state.char[0]); + }; + + return state.char.map(eachItem => { + return ( +
+ + +
+ + +
+ + +
+ + +
+ +
+ ); + }); +}; + const Counter = () => { const [sum, dispatch] = useReducer((state, action) => { return state + action; }, 0); return ( - <> - {sum} - - +
+
{sum}
+ +
); }; const ShoppingList = () => { const inputRef = useRef(); const [items, dispatch] = useReducer((state, action) => { - switch ( - action.type - /** CODE HERE */ - ) { + switch (action.type) { + case "add": + return [...state, { id: state.length, name: action.name }]; + case "remove": + return state.filter((_, index) => index != action.index); + case "clear": + return []; + default: + return state; } }, []); - const handleSubmit = () => { - /** CODE HERE */ + const handleSubmit = e => { + e.preventDefault(); + dispatch({ + type: "add", + name: inputRef.current.value + }); + inputRef.current.value = ""; }; return ( @@ -34,9 +101,15 @@ const ShoppingList = () => {
+ @@ -47,23 +120,28 @@ const App = () => { return (
- logo -

- Edit src/App.js and save to reload. -

- - Learn React - -
- +
+ logo +

+ Edit src/App.js and save to reload. +

+ + Learn React +
-
- +
+ + {/*
+ +
+
+ +
*/}
diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..e6c4e7fc --- /dev/null +++ b/package-lock.json @@ -0,0 +1,18 @@ +{ + "name": "udemy-react", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "immer": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-6.0.1.tgz", + "integrity": "sha512-oXwigCKgznQywsXi1VgrqgWbQEU3wievNCVc4Fcwky6mwXU6YHj6JuYp0WEM/B1EphkqsLr0x18lm5OiuemPcA==" + }, + "use-immer": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/use-immer/-/use-immer-0.3.5.tgz", + "integrity": "sha512-0CNaJ/CtnF8/OmM4NBG7R0rhWMMQtgXPmWbakv8CK5z8dXeMaBYValFDXpkjBnToknjKJZuEPcoUZYd0rnQL2Q==" + } + } +} diff --git a/package.json b/package.json index b804129f..2346a5bb 100644 --- a/package.json +++ b/package.json @@ -3,9 +3,11 @@ "version": "0.1.0", "private": true, "dependencies": { + "immer": "^6.0.1", "react": "^16.12.0", "react-dom": "^16.12.0", - "react-scripts": "3.2.0" + "react-scripts": "3.2.0", + "use-immer": "^0.3.5" }, "scripts": { "start": "react-scripts start",