로드가 되었는지 안되었는지
로드를 바꿔주는 액션 만들어서
단어 추가와 단어 삭제 시에도 스피너가 나오게 해보자!
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
'WEB > REACT' 카테고리의 다른 글
[REACT] props를 통해 컴포넌트 값 전달, defaultProps 기본값 설정, props.children 컴포넌트 태그 사이의 값 렌더링 (0) | 2021.07.02 |
---|---|
[REACT] 리액트가 만들어진 배경, 리액트가 뭐냐?! (0) | 2021.07.01 |
[REACT] Material UI를 설치하고 로딩하기 전에 스피너화면 보여주기 (0) | 2021.06.30 |
[REACT] 프로그래스바 완료 상태에 따라 transition줘서 움직이게 하기 (0) | 2021.06.30 |
[REACT] keyframes 애니메이션 사용하기 /위아래로 애니메이션 (0) | 2021.06.30 |