WEB/REACT

[REACT] 스피너를 액션이 일어나기전에 보여주기/ 단어 추가하기전에 스피너 보여주기

자바칩 프라푸치노 2021. 6. 30. 18:34

로드가 되었는지 안되었는지

로드를 바꿔주는 액션 만들어서

단어 추가와 단어 삭제 시에도 스피너가 나오게 해보자!

2021.06.30 - [WEB/REACT] - [REACT] Material UI를 설치하고 로딩하기 전에 스피너화면 보여주기

 

 

 

 

(1) 리덕스에서 액션만들기

(2) 기본 변수 설정

 

 

(3) 액션 생성함수

 

 

 

(4) 리듀서

 

 

 

 

(5) 파이어베이스와 통신하는 곳에서

단어를 추가하기 전에는 isLoaded를 false로 설정하고

add한 후 then에서 isLoaded를 true로 설정

 

 

 

 

words.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import {firestore} from "../../firebase";
 
const word_db = firestore.collection("myDictionary");
 
const GET_WORD = "words/GET_WORD";
const ADD_WORD = "words/ADD_WORD";
const DELETE_WORD = "words/DELETE_WORD";
const LOADED = "words/LOADED";
 
const initialState = {
    list : [ ],
    is_loaded: false,
}
 
// Action creator
export const getWord = (words)=>{
    return {type: GET_WORD, words};
}
export const addWord = (words)=>{
    return {type: ADD_WORD, words};
}
 
export const deleteWord = (words)=>{
    return {type: DELETE_WORD, words};
}
 
export const isLoaded = (loaded) => {
    return {type: LOADED, loaded}
  }
 
// 파이어베이스 미들웨어
export const loadDic = ()=>{
    return function(dispatch){
        word_db.get().then((docs)=>{
            let words_data = [];
 
            docs.forEach((doc)=>{
                if(doc.exists){
                    words_data = [...words_data, {id: doc.id, ...doc.data()}]
                }
            })
            dispatch(getWord(words_data));
        });
    };
};
 
export const addDic = (words) =>{
    return function (dispatch){
        let words_data = {word:words.word, desc:words.desc, ex:words.ex};
 
        dispatch(isLoaded(false));
        word_db.add(words_data).then(docRef =>{
            words_data = {...words_data, id: docRef.id};
            dispatch(addWord(words_data));
            dispatch(isLoaded(true));
        })
    }
}
 
export const deleteDic = (words) =>{
    return function(dispatch, getState){
        const words_data = getState().words.list[words];
        dispatch(isLoaded(false));
        if(!words_data.id){
            return;
        }
        word_db.doc(words_data.id).delete().then((docRef) =>{
            dispatch(deleteWord(words));
            dispatch(isLoaded(true));
        }).catch(error=>{
            console.log(error);
        });
    }
}
 
 
// reducer
export default function reducer(state = initialState, action = {}){
    switch(action.type){
        case "words/GET_WORD":{
            if(action.words.length>0){
                return {list: action.words, is_loaded:true};
            }  
            return state;
        }
 
        case "words/ADD_WORD":{
            const new_word_list = [ action.words,...state.list];
            return {list: new_word_list};
        }
        case "words/DELETE_WORD":{
            // 원래 인덱스랑 바뀐 인덱스가 같으면 안바꾸고 다르면 바꾼다.
            const word_list = state.list.filter((l, idx)=>{
                if(idx != action.words){
                    return l;
                }
            });
            return {list: word_list};
        }
        case "words/LOADED": {
 
            return {...state, is_loaded: action.loaded};
          }
        default
            return state;
    }
}
cs
728x90