React

 

따라하며 배우는 리액트 A-Z

 


[프론트엔드, 웹 개발] 강의입니다.

이 강의를 통해 리액트 기초부터 중급까지 배우게 됩니다. 하나의 강의로 개념도 익히고 실습도 하며, 리액트를 위해 필요한 대부분의 지식을 한번에 습득할 수 있도록 만들었습니다.

✍️
이런 걸
배워요!

리액트

NextJS

타입스크립트

정적 사이트 자동 배포

도커

 

강의:  https://www.inflearn.com/course/%EB%94%B0%EB%9D%BC%ED%95%98%EB%8A%94-%EB%A6%AC%EC%95%A1%ED%8A%B8#

 

강의 자료 :  https://github.com/braverokmc79/DiagramPDF

 

소스 : 

https://github.com/braverokmc79/react-count-app

 

 

 

 

[10]. 리덕스

 

 

94. 리덕스란?

 

강의:

https://www.inflearn.com/course/따라하는-리액트/unit/119943?tab=curriculum

 

 

 

 

 

 

 

 

 

 

 

 

 

 

95. 미들웨어 없이 리덕스 카운터 앱 만들기

 

강의:

https://www.inflearn.com/course/따라하는-리액트/unit/119944?tab=curriculum

 

 

 

$ npx create-react-app ./ --template typescript

 

 

npm install redux --save

 

 

 

 

 

 

 

 

src/reducers/index.tsx

 

const cunter =(state =0 , action:{type:string} )=>{
  
    switch(action.type){
        case "INCREMENT":
            return state+1;
        case "DECREMENT":
            return state-1;
        default:
            return state;
           
    }
};


export default cunter;

 

 

App.tsx

import React from 'react';
import logo from './logo.svg';
import './App.css';

type Props={
  value:number;
  onIncrement: ()=>void;
  onDecrement: ()=>void;
}

function App({ value,onIncrement, onDecrement } :Props) {
  return (
    <div className="App">
        Clicked : {value} times

        <button onClick={onIncrement}>
          +
        </button>

        <button onClick={onDecrement}>
          -
        </button>

    </div>
  );
}

export default App;

 

 

 

index.tsx

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import {legacy_createStore as createStore } from 'redux';
import counter from './reducers';

const root = ReactDOM.createRoot(
  document.getElementById('root') as HTMLElement
);

const store =createStore(counter);


const render = ()=>root.render(
  <React.StrictMode>
    <App  value={store.getState()} 
        onIncrement={()=> store.dispatch({type:"INCREMENT"})}
        onDecrement={()=> store.dispatch({type:"DECREMENT"})}
    />
  </React.StrictMode>
);

render();

store.subscribe(render);


// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

96. combineReducers

 

 

강의:

https://www.inflearn.com/course/따라하는-리액트/unit/119945?tab=curriculum

 

 

 

 

 

src/reducer/index.tsx

import {combineReducers} from 'redux';
import counter from './counter';
import todos from './todos';

const rootReducers = combineReducers({
    counter,
    todos
})

export default rootReducers

 

src/reducer/counter.tsx

const counter =(state =0 , action:{type:string} )=>{
  
    switch(action.type){
        case "INCREMENT":
            return state+1;
        case "DECREMENT":
            return state-1;
        default:
            return state;
           
    }
};


export default counter;

 

src/reducer/todos.tsx

enum ActionType{
    ADD_TODO = "ADD_TODO",
    DELETE_TODO ="DELETE_TODO"
}

interface Action {
    type:ActionType;
    text:string;
}

const todos = (state = [] , action :Action) => {
    switch(action.type){
        case 'ADD_TODO':
            return [...state, action.text] ;
        default :
            return state
    }
    
}

export default todos

 

 

 

 

 

index.tsx

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import {legacy_createStore as createStore } from 'redux';
import rootReducers from './reducers';

const root = ReactDOM.createRoot(
  document.getElementById('root') as HTMLElement
);

const store =createStore(rootReducers);

store.dispatch({
  type:"ADD_TODO",
  text:"USE REDUX"
})
console.log('store.getState' ,  store.getState());

const render = ()=>root.render(
  <React.StrictMode>
    <App  
    
    value={store.getState()} 
        onIncrement={()=> store.dispatch({type:"INCREMENT"})}
        onDecrement={()=> store.dispatch({type:"DECREMENT"})}
    />
  </React.StrictMode>
);

render();

store.subscribe(render);


// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

96. Redux Provider

 

강의:

https://www.inflearn.com/course/따라하는-리액트/unit/119946?tab=curriculum

 

 

 

 

설치 :

npm  i react-redux

 

index.tsx

const render = ()=>root.render(
  <React.StrictMode>
  <Provider  store={store}>
        <App  
            onIncrement={()=> store.dispatch({type:"INCREMENT"})}
            onDecrement={()=> store.dispatch({type:"DECREMENT"})}
        />
    </Provider>
  </React.StrictMode>
);

 

 

App.tsx

import React, { useState } from 'react';
import logo from './logo.svg';
import './App.css';

type Props={
  onIncrement: ()=>void;
  onDecrement: ()=>void;
}

function App({ onIncrement, onDecrement } :Props) {
  const [todoValue, setTodoValue] =useState("");

  const handleChange=(e : React.ChangeEvent<HTMLInputElement>)=>{
    setTodoValue(e.target.value);
  }

  const addTodo =(e: React.FormEvent<HTMLFormElement>)=>{
    e.preventDefault();
    setTodoValue("");
  }

  return (
    <div className="App">
        {/* Clicked : {value} times */}

        <button onClick={onIncrement}>
          +
        </button>

        <button onClick={onDecrement}>
          -
        </button>

      <form onSubmit={addTodo}>
          <input type='text' value={todoValue} onChange={handleChange} />
          <input type="submit" />
      </form>
    </div>
  );
}

export default App;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

96. useSelector & useDispatch

 

강의:

 

https://www.inflearn.com/course/따라하는-리액트/unit/119947?tab=curriculum

 

 

 

 

App.tsx

import React, { useState } from 'react';
import logo from './logo.svg';
import './App.css';
import { useSelector } from 'react-redux/es/exports';
import { RootState } from './reducers';
import { useDispatch } from 'react-redux/es/hooks/useDispatch';

type Props={
  onIncrement: ()=>void;
  onDecrement: ()=>void;
}

function App({ onIncrement, onDecrement } :Props) {
  const dispatch =useDispatch();
  const counter =useSelector((state : RootState)=>state.counter);
  const todos : string[] =useSelector((state : RootState)=>state.todos);

  const [todoValue, setTodoValue] =useState("");

  const handleChange=(e : React.ChangeEvent<HTMLInputElement>)=>{
    setTodoValue(e.target.value);
  }

  const addTodo =(e: React.FormEvent<HTMLFormElement>)=>{
    e.preventDefault();
    dispatch({
      type:"ADD_TODO",
      text:todoValue
    });
    setTodoValue("");
  }

  return (
    <div className="App">
         Clicked : {counter} times 

        <button onClick={onIncrement}>
          +
        </button>

        <button onClick={onDecrement}>
          -
        </button>
       <ul>
          {todos.map((todo, index)=><li key={index}>{todo}</li>)}
       </ul>
      <form onSubmit={addTodo}>
          <input type='text' value={todoValue} onChange={handleChange} />
          <input type="submit" />
      </form>
    </div>
  );
}

export default App;

 

 

 

 

 

src/reducers/index.tsx

import {combineReducers} from 'redux';
import counter from './counter';
import todos from './todos';

const rootReducers = combineReducers({
    counter,
    todos
})

export default rootReducers;

export type RootState = ReturnType<typeof rootReducers>;


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

about author

PHRASE

Level 60  라이트

A black ox has trod on his way. (그에게는 액운이 붙었다. = 그는 재난을 만났다.)

댓글 ( 4)

댓글 남기기

작성