Redux -Middleware (Redux thunk)

2022. 2. 28. 19:45·Redux
목차
  1.  
  2. Redux Thunk
  3. Components
  4.  
  5. Reducer
  6.  
  7.  

리덕스를 사용하게 되면  어떤 시점에서 dispatch를 통해 리듀서에게 액션을 전달하게 된다.

그에 따라 리듀서는 state에 변화를 일으킨다.

 

하지만 추가적으로 브라우저에서 서버로 요청을 보내고 응답을 받을 때

즉 비동기적인 작업을 처리할 때를 생각해보아야 한다.

요청을 보내면 항상 100프로 응답이 성공적일 수는 없다.

실패할 수도 있다.

 

따라서 요청, 응답, 실패시에 따른 처리를 state에 처리해 줄 필요가 있다.

이를 통해 사용자에게 현재 어떤 상태에 있는지를 인지시킬 수 있기 떄문이다.

(여기서 인지란 비동기작업이 진행중인지? 작업완료 되었는지? 실패했는지? 를 의미 )

 

이때 사용할 수 있는 것이 Redux-Middleware이다.

Middleware로 액션을 디스패치 하고 리듀서에서 바로 처리하는 것이 아니라

Middle. 즉 단어의 뜻과 비슷하게 중간에 어떤 작업을 할 수 있게 해주는 것이다.

 


 

Redux Thunk

 

addPost라는 함수는 content라는 인자를 가진다.

프론트에서 보내고 싶은 데이터가 있다면 필요할 것이고 없다면 필요하지 않을 것이다.

 

 

함수 내에서 dispatch 사용이 가능하다.

getState로 state의 상태도 조회해 볼수가 있다.

 

처음에 Request를 dispatch

dummyPostsApi로 content를 집어넣은 결과값이 있다면 ADD_POST_SUCCESS를 dispatch

결과값이 없고 에러가 발생한다면  ADD_POST_FAILURE를 dispatch

export const addPost = (data) => async(dispatch) => {
    dispatch({
        type : ADD_POST_REQUEST,
    })
    try{
        const result = await dummyPost(data)
        dispatch({
        type: ADD_POST_SUCCESS,
        data : result
    })
    }catch(error){
        dispatch({
            type : ADD_POST_FAILURE
        })
    }
}

이제 함수 내에서 액션을 여러번 dispatch가 가능하게 되었다.

 


Components

import React from 'react'
import { useState } from 'react'
import { useDispatch, useSelector } from 'react-redux'
import { addPost } from '../reducer/user'

export default function Practice(){
    const posts = useSelector(state => state.posts)
    const dispatch = useDispatch()
    const [content, setContent] = useState('')
    
    const addPostHandler = (e) => {
      console.log(content)
      e.preventDefault();
        dispatch(addPost({content}))
    }
    const onChangeContent = (e) => {
        setContent(e.target.value)
    }
    
  return (
    <>
    <div>{posts}</div>
    <form onSubmit={addPostHandler}>
        <input value={content} type='text' onChange={onChangeContent}/>
        <button type='submit'>
        포스트작성
    </button>
    </form>
    
    </>
  )
}

 

Reducer

export const initialState ={
    posts : [],
    addPostLoading : false,
    addPostDone : false,
    addPostError : null,
}

export const ADD_POST_REQUEST = 'ADD_POST_REQUEST' 
export const ADD_POST_SUCCESS = 'ADD_POST_SUCCESS' 
export const ADD_POST_FAILURE = 'ADD_POST_FAILURE' 

export const dummyPost = (data) => (
    {
        id: 1,
        content : data.content
    }
)

export const addPost = (data) => async(dispatch) => {
    dispatch({
        type : ADD_POST_REQUEST,
    })
    try{
        const result = await dummyPost(data)
        dispatch({
        type: ADD_POST_SUCCESS,
        data : result
    })
    }catch(error){
        dispatch({
            type : ADD_POST_FAILURE
        })
    }
    
}


const reducer = (state = initialState,action) => {
    switch (action.type) {
        case ADD_POST_REQUEST:
            return {
                ...state,
            addPostLoading : true,
            addPostDone :false,
            addPostError : null,
            }
        case ADD_POST_SUCCESS:
            return {
                ...state,
                addPostLoading : false,
                addPostDone : true,
                posts : [...state.posts, action.data]
            }
        case ADD_POST_FAILURE:
            return{
            ...state,
            addPostLoading : true,
            addPostDone : false,
            addPostError : action.data,
        }
    
        default:
            return state;
    }
}
export default reducer

 

 


 

 

 

 

저작자표시 (새창열림)

'Redux' 카테고리의 다른 글

Redux-Toolkit  (0) 2022.03.07
  1.  
  2. Redux Thunk
  3. Components
  4.  
  5. Reducer
  6.  
  7.  
'Redux' 카테고리의 다른 글
  • Redux-Toolkit
king_hd
king_hd
웹 개발 공부를 위한 블로그입니다.
king_hd
웹 개발 기록
king_hd
전체
오늘
어제
  • 분류 전체보기
    • HTML
    • CSS
    • JS
    • Typescript
    • React
    • nodejs
    • Redux
    • Git
    • 오류모음
    • Webpack
    • 자료구조
    • 네트워크
    • Electron
    • 배포
    • Docker
    • 프로그래머스

블로그 메뉴

  • 홈

링크

공지사항

인기 글

태그

코딩테스트
4차산업혁명동아리
Redux-saga
자바스크립트
타입스크립트
docker
TypeScript
인증서 자동갱신
리덕스사가
env파일 환경변수 인식
Redux
webpack
프론트엔드
TAVE
https 인증서 발급
웹퍼블리셔
백엔드
mysqld: can't open file: 'mysql.ibd' (errno: 0 - )
JavaScript
const
react
ec2에 docker 설치
Hook
propertykey
next.js
리덕스
웹개발
docker mysql workbench 연동하는 법
프로그래머스
let

최근 댓글

최근 글

hELLO· Designed By정상우.v4.6.0
king_hd
Redux -Middleware (Redux thunk)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.