[React]Thunk

지냐킴·2022년 8월 10일
0

React

목록 보기
20/20
post-thumbnail
import { applyMiddleware, createAsyncThunk, createSlice } from '@reduxjs/toolkit';
import axios from 'axios';
import React from 'react';
//제이슨 서버를 띄었다고 가정을 하고 제이슨 서버에 있는 데이터 가져오기 


 const initial_State = {
    todos:[],
 }

// 1. Thunk 함수 만들기  export const getTodosThunk = createAsyncThunk(); <- 기본뼈대
// => 툴킷에서 제공하는 createAsyncThunk 기능을 이용해서  thunk 함수를 만든다
// createAsyncThunk() 괄호안에 "액션이름", ()=>{} 함수가 들어감
// ()=>{}함수가 중간에 내가 할거 
// dispatch(todos) 원래 액션패치가 디스패치를 통해서 리듀서로 바로가는데
//thunk 이용해서 서버에와서 todos를 가져오고 그걸 가지고 리듀서로 가 라는 중간작업을 ()=>{} 함수에서 이뤄짐
export const getTodosThunk = createAsyncThunk("getTodos",async(payload,thunkAPI)=>{
 // 해야할거 2. 중간 작업 (=서버에서 가져오는거니까 여기서 Axios를 쓴다 )
 // 해야할거 3.dispatch(원래 하려고 했던 디스패치) - app.js에서 

 //4. 중간작업 Axios와 dispatch가 동시에 실행되지 않도록 async await 써줌
 //5. 가져온 값을 변수에 할당함 const data = 
 const data = await axios.get("url"); //10번째에 해줘야하는 일해주고 지워줌=35번에 붙여주고 지워줌
 // async await을 통해서 axios~("url"); get을 하고 가져온 값을 data에 넣고 나서 dispatch 작업 해줌 
 // 6. consol.log(data.data);
 
  
  // 8. 6번 콘솔로 확인할 우리가 가져온 데이터를 스토에 넣기 -> 툴킷에서는 자동화되어있음 
  // async(payload, thunkAPI) 써줌 thunkAPI 이름 맘대로 지어도됨
  // console.log(thunkAPI (쓰면 자동완성으로 기능들 나오는데).필요한기능 점 뒤에 적어줌) 
 // thunkAPI.fulfillwithValue(); 
 // fulfillwithValue:  기능 :  자동 디스패치 해줌 요청에 성공했을만, 실패하면 실패한쪽에 디스패치해주고, 진행중이면 진행중인 상태 유지
 // 9. 23번째 줄 그냥 두면 이게 실패했는지 성공인지 몰라 그래서 try catch 쓴다 
 try { //10. 트라이 안에 23번째 넣어줌 
    const data = await axios.get("url");
    return thunkAPI.fulfillWithValue(data.data)
    //11.thunkAPI.fulfillWithValue() 넣어줌 6번째 순서인 콘솔에서 확인한 받아와야할 값 괄호에 넣어줌
    // 12. 정리 => const~ ("url") 성공했을때 디스패치 해줌 
    //13. 이제 받는곳 만들어줌 => extraReducers 에서 모듈을 만들어 줘야함 
 } catch (error) {
   return thunkAPI.rejectWithValue(e);
    //12-1. 실패했을떄    
 }                       

});

export const TodoSlice = createSlice({
    name : "todos",
    initial_State,
    reducers:{},
    extraReducers:{
        //14. [thunk함수.fulfilled] 가 try안에서 디스패치했을때 여기서 받아줌
        [getTodosThunk.fulfilled]: (state.action)=>{
            //15. console.log(action) try이 [getTodoThunk]~ 애 온거 확인 할 수 있음 
            state.todos=action.payload;
            //16.
        },
        [getTodosThunk.rejected]:(state.action)=>{
            // console.log(action);
        },
    }
})

export const {} = TodoSlice.actions;
export default TodoSlice.reducer;

//7.컴퍼넌트가 마운트가 됫을떄 디스패치를 해서 겟투드떤크를 실행시키면 콘솔로그에 가져온 데이터 나옴 
// app.js
// useEffet(()=>{
// dispatch(getTodosThunk());
// })
//
profile
코린이일기

0개의 댓글