๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

โœ๏ธ

(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..