โ๏ธ (36) ์ธ๋ค์ผํ ๋ฆฌ์คํธํ React ๊ณต๋ถํ๊ธฐ(8) - ์ํ ๊ด๋ฆฌ, Context API of ๋ฆฌ์กํธ ํ์ ์คํฌ๋ฆฝํธ 3. ํ์ ์คํฌ๋ฆฝํธ๋ก ๋ฆฌ์กํธ ์ํ ๊ด๋ฆฌํ๊ธฐ ์นด์ดํฐ ๋ง๋ค์ด๋ณด๊ธฐ ์ธํ ์ํ ๊ด๋ฆฌํ๊ธฐ useReducer ์ฌ์ฉํด๋ณด๊ธฐ import React, { useReducer } from 'react'; type Color = 'red' | 'orange' | 'yellow'; type State = { count: number; text: string; color: Color; isGood: boolean; }; type Action = | { type: 'SET_COUNT'; count: number } | { type: 'SET_TEXT'; text: string } | { type: 'SET_COLOR'; color: Color } | { type: 'TOGGLE_GOOD' }; function reducer(st.. React ๊ณต๋ถํ๊ธฐ(8) - ๋ฆฌ์กํธ ํ๋ก์ ํธ์์ ํ์ ์คํฌ๋ฆฝํธ ์ฌ์ฉํ๊ธฐ ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ ์ด์ 1. IDE(Integrated Development Environment)๋ฅผ ๋์ฑ ๋ ์ ๊ทน์ ์ผ๋ก ํ์ฉ (์๋์์ฑ, ํ์ ํ์ธ) 2. ์ค์ ๋ฐฉ์ง 1. ํ์ ์คํฌ๋ฆฝํธ ์ฐ์ต $ mkdir ts-practice # ts-practice ๋ผ๋ ๋๋ ํฐ๋ฆฌ ์์ฑ $ cd ts-practice # ํด๋น ๋๋ ํฐ๋ฆฌ๋ก ์ด๋ $ yarn init -y # ๋๋ npm init -y ์ด๋ ๊ฒ ํ๋ฉด ts-practice ๋๋ ํฐ๋ฆฌ์ package.json ์ด๋ผ๋ ํ์ผ์ด ๋ง๋ค์ด์ง๋๋ค. ํ์ ์คํฌ๋ฆฝํธ ์ค์ ํ์ผ ์์ฑํ๊ธฐ $ yarn global add typescript ๊ทธ๋ฆฌ๊ณ ํ๋ก์ ํธ ๋๋ ํฐ๋ฆฌ ์์์ tsc --init ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด tsconfig.json ํ์ผ์ด ์๋์์ฑ๋ฉ๋๋ค. { "compilerOpti.. React ๊ณต๋ถํ๊ธฐ(7) - redux-saga of ๋ฆฌ๋์ค ๋ฏธ๋ค์จ์ด 10. redux-saga : "์ก์ ์ ๋ชจ๋ํฐ๋งํ๊ณ ์๋ค๊ฐ, ํน์ ์ก์ ์ด ๋ฐ์ํ๋ฉด ์ด์ ๋ฐ๋ผ ํน์ ์์ ์ ํ๋ค." ์๋ฅผ ๋ค์ด,,, ๋น๋๊ธฐ ์์ ์ ํ ๋ ๊ธฐ์กด ์์ฒญ์ ์ทจ์ ์ฒ๋ฆฌ ํ ์ ์์ต๋๋ค ํน์ ์ก์ ์ด ๋ฐ์ํ์ ๋ ์ด์ ๋ฐ๋ผ ๋ค๋ฅธ ์ก์ ์ด ๋์คํจ์น๋๊ฒ๋ ํ๊ฑฐ๋, ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์คํ ํ ์ ์์ต๋๋ค. ์น์์ผ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ Channel ์ด๋ผ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ๋์ฑ ํจ์จ์ ์ผ๋ก ์ฝ๋๋ฅผ ๊ด๋ฆฌ ํ ์ ์์ต๋๋ค (์ฐธ๊ณ ) API ์์ฒญ์ด ์คํจํ์ ๋ ์ฌ์์ฒญํ๋ ์์ ์ ํ ์ ์์ต๋๋ค. Generator ๋ฌธ๋ฒ ๋ฐฐ์ฐ๊ธฐ => ํจ์๋ฅผ ์์ฑํ ๋ ํจ์๋ฅผ ํน์ ๊ตฌ๊ฐ์ ๋ฉ์ถฐ ๋์ ์๋ ์๊ณ , ์ํ ๋ ๋ค์ ๋์๊ฐ๊ฒ ํ ์๋ ์๋ค. => ๊ฒฐ๊ณผ๊ฐ์ ์ฌ๋ฌ๋ฒ ๋ฐํํ ์๋ ์๋ค. function* sumGenerator() { co.. React ๊ณต๋ถํ๊ธฐ(7) - redux-thunk of ๋ฆฌ๋์ค ๋ฏธ๋ค์จ์ด 4. redux-thunk : "์ก์ ๊ฐ์ฒด๊ฐ ์๋ ํจ์๋ฅผ ๋์คํจ์น ํ ์ ์๋ค." => ํจ์๋ฅผ ๋์คํจ์น ํ ๋์๋, ํด๋น ํจ์์์ dispatch์ getState๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์์ฃผ์ด์ผ ํ๋ค. ์ด ํจ์๋ฅผ ๋ง๋ค์ด์ฃผ๋ ํจ์๋ฅผ thunk๋ผ๊ณ ๋ถ๋ฅธ๋ค. const getComments = () => (dispatch, getState) => { // ์ด ์์์๋ ์ก์ ์ dispatch ํ ์๋ ์๊ณ // getState๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ ์ํ๋ ์กฐํ ํ ์ ์์ต๋๋ค. const id = getState().post.activeId; // ์์ฒญ์ด ์์ํ์์ ์๋ฆฌ๋ ์ก์ dispatch({ type: 'GET_COMMENTS' }); // ๋๊ธ์ ์กฐํํ๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋ getComments ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ด .. React ๊ณต๋ถํ๊ธฐ(7) - ๋ฆฌ๋์ค ๋ฏธ๋ค์จ์ด ๋ณดํต ๋ฆฌ๋์ค์์ ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ๋ ์ฃผ๋ ์ฌ์ฉ ์ฉ๋๋ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ ๋์ด๋ค. (redux-thunk, redux-sage ๋ฑ) $ yarn add redux react-redux 2. ๋ฏธ๋ค์จ์ด ๋ง๋ค์ด๋ณด๊ณ ์ดํดํ๊ธฐ ๋ฆฌ๋์ค ๋ฏธ๋ค์จ์ด์ ํ ํ๋ฆฟ const middleware = store => next => action => { // ํ๊ณ ์ถ์ ์์ ... } function middleware(store) { return function (next) { return function (action) { // ํ๊ณ ์ถ์ ์์ ... }; }; }; store: ๋ฆฌ๋์ค ์คํ ์ด next: ์ก์ ์ ๋ค์ ๋ฏธ๋ค์จ์ด์๊ฒ ์ ๋ฌํ๋ ํจ์ next(action) action: ํ์ฌ ์ฒ๋ฆฌํ๊ณ ์๋ ์ก์ ๊ฐ์ฒด ๋ฏธ๋ค์จ์ด ์ง์ ์์ฑ.. React ๊ณต๋ถํ๊ธฐ(6) - ๋ฆฌ๋์ค(Redux) ๐ง ๋ฆฌ๋์ค ๊ฐ๋ฐ์๋๊ตฌ ์ ์ฉํ๊ธฐ https://react.vlpt.us/redux/06-redux-devtools.html 6. ๋ฆฌ๋์ค ๊ฐ๋ฐ์๋๊ตฌ ์ ์ฉํ๊ธฐ · GitBook 6. ๋ฆฌ๋์ค ๊ฐ๋ฐ์๋๊ตฌ ์ ์ฉํ๊ธฐ ์ด๋ฒ์๋ ๋ฆฌ๋์ค ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค. ๋ฆฌ๋์ค ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ฌ ์คํ ์ด์ ์ํ๋ฅผ ๊ฐ๋ฐ์ ๋๊ตฌ์์ ์กฐํ ํ ์ ์ react.vlpt.us 3. ๋ฆฌ๋์ค ์ฌ์ฉํ ์ค๋นํ๊ธฐ import { createStore } from 'redux'; // ์คํ ์ด ์์ฑ import { createStore } from 'redux'; // createStore๋ ์คํ ์ด๋ฅผ ๋ง๋ค์ด์ฃผ๋ ํจ์์ ๋๋ค. // ๋ฆฌ์กํธ ํ๋ก์ ํธ์์๋ ๋จ ํ๋์ ์คํ ์ด๋ฅผ ๋ง๋ญ๋๋ค. /* ๋ฆฌ๋์ค์์ ๊ด๋ฆฌ ํ ์ํ ์ .. React ๊ณต๋ถํ๊ธฐ(5) - ๋ฆฌ์กํธ ๋ผ์ฐํฐ react-router๋ฅผ ํตํ ๋ฆฌ์กํธ ์ฑ๊ธ ํ์ด์ง ์ดํ๋ฆฌ์ผ์ด์ ๋ง๋ค๊ธฐ 1. ๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ๋ฒ $ yarn add react-router-dom ํ๋ก์ ํธ์ ๋ผ์ฐํฐ ์ ์ฉ import React from 'react'; import ReactDOM from 'react-dom'; import { BrowserRouter } from 'react-router-dom'; // * BrowserRouter ๋ถ๋ฌ์ค๊ธฐ import './index.css'; import App from './App'; import * as serviceWorker from './serviceWorker'; // * App ์ BrowserRouter ๋ก ๊ฐ์ธ๊ธฐ ReactDOM.render( , document.getElementById(.. React ๊ณต๋ถํ๊ธฐ(4) - API ์ฐ๋ํ๊ธฐ 1. API ์ฐ๋์ ๊ธฐ๋ณธ $ yarn add axios GET: ๋ฐ์ดํฐ ์กฐํ POST: ๋ฐ์ดํฐ ๋ฑ๋ก PUT: ๋ฐ์ดํฐ ์์ DELETE: ๋ฐ์ดํฐ ์ ๊ฑฐ import axios from 'axios'; axios.get('/users/1'); axios.get('https://jsonplaceholder.typicode.com/users'); axios.post('/users', { username: 'blabla', name: 'blabla' }); useState์ useEffect๋ก ๋ฐ์ดํฐ ๋ก๋ฉํ๊ธฐ useState: ์์ฒญ ์ํ ๊ด๋ฆฌ ์์ฒญ์ ๊ฒฐ๊ณผ ๋ก๋ฉ ์ํ ์๋ฌ useEffect: ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋๋ ์์ ์ ์์ฒญ์ ์์ import React, { useState, useEffect } from 'rea.. ์ด์ 1 2 3 4 5 ๋ค์