- redux를 사용할때 특정 action을 관찰하고 있다가 action이 실행되면서 동시에 다른 행동을 취할 수 있게 해 주는 함수이다.
- 주로 back-end 통신을 할때 많이 사용한다.
Generator function
function* name() { yield yield }
해당하는 값이 나올때까지 실행하다가 해당하는 yield 값이 있으면 거기서 return하고
next()
를 기다리는 함수이다.
redux-saga-effect
effect들은 generator function을 사용하여 이루어진다.
- call : 함수를 동기적으로 실행,
( api 사용할때 )- all : 여러 saga를 한번에 실행, 배열로
[]
내보낸다.- fork : 함수를 비동기적으로 실행
- takeLatest : 짧은 시간내에 액션이 관측되면 그 액션이 들어온 맨 마지막 것만 받아서 실행
- delay : 매개변수에 있는 시간만큼 잠깐 멈춤
- put : dispatch()와 동일
saga에서는 arrow function 을 쓸 수 없다.
/redux/sagas.js
import {all} from "redux-saga/effects";
import appSaga from "./app/saga";
import userSaga from "./user/saga";
export default function* (){
yield all([
appSaga(),
userSaga(),
])
}
all()
함수를 이용해 여러개의 saga를 한번에 실행한다./redux/store.js
import {/*createStore*/, applyMiddleware} from "redux";
//import reducers from "./reducers";
import createSagaMiddleware from "redux-saga";
import sagas from "./sagas";
const sagaMiddleware = createSagaMiddleware();
const store = createStore(/*reducers*/, applyMiddleware(sagaMiddleware));
sagaMiddleware.run(sagas);
//export default store;
createSagaMiddleware
를 redux-saga에서 가져와서 saga를 생성한다.createStore
인자 값에 생성한 saga함수를 =sagaMiddleware
applyMiddleware()
로 감싸서 추가한다.sagaMiddleware.run()
saga들을 합친 sagas
.js를 import하여 sagaMiddleware를 실행시킨다./api/index.js
import axios from "axios";
const API = {
getUsers: () => axios.get("https://jsonplaceholder.typicode.com/users")
}
export default API;
/view/pages/User/index.js
useEffect(() => {
userActions.getUsers();
},[])
/redux/user/saga.js
import {all, takeLatest, call, put} from "redux-saga/effects";
import {Action} from "../user/redux";
import API from "../../api";
import {userActions} from "../actionCreators";
export default function* (){
yield all([
takeLatest(Action.Types.GET_USERS, function* (){
const result = yield call(API.getUsers);
if(result?.data) {
yield put(userActions.updateState({
users: result.data,
}))
}
})
])
}
all
함수를 실행한다.takeLatest
함수를 작성하여 첫번째 인자로는 실행할 type의 action을 넣고, 두번째로 콜백함수 generator function을 넣어준다.yield call(API.getUsers)
함수를 동기적으로 호출한다. 이 과정에서 call을 할때 자동으로 promise가 벗겨진다.put()
을 사용하여 action 생성자 함수를 호출하고 user 객체를 redux에 dispatch한다.기본 객체구조 분해
const user = {
name: 'name',
gender: 'female'
};
const { gender } = user;
console.log(gender); // 'female'
새로운 변수명 할당하기
const user = { name: 'name', gender: 'female' }; const { gender : newGender } = user; console.log(newGender); // 'female'
객체구조 분해시 새로운 변수명을 대입해
gender : newGender
사용 할 수 있다.
기본값 할당하기
const user = {
name: 'name',
sns: [
'facebook',
'instagram',
]
};
const { sns = [] } = user;
console.log(sns); // Array
sns = []
할 수도 있다.새로운 변수명과 기본값 할당하기
const user = {
name: 'name',
sns: [
'facebook',
'instagram',
]
};
const { sns : newsns = [] } = user;
console.log(newsns); // Array
즉시 구조 분해 하기
function Home({data, dispatch}) {
}
axios는 http 통신을 위한 자바스크립트 라이브러리이다. 비동기통신으로 data를 가져올 수 있다.
useEffect( () => {
}, [])
[]
빈 배열을 넣어주면 처음 렌더링 될 때에만 실행시켜준다.axios.get()
은 url로 data를 호출해온다.
이전에는 공부하면서 메모장에 정리를 했었는데 가독성도 떨어지고 다시 열어보는 일이 적어지다 보니 코드에 주석을 쓰면서 정리하는 일이 빈번했다.
til를 작성하게 되면서 달라진 점이 있다면
공부한 개념을 까먹기 전에 정리하는 것이 일상 루틴으로 자리 잡았다는 것이다.
코드를 따라 칠 때보다 개념을 정리할때 더 확실히 이해할 수 있다는 것이 til의 매력적인 점이 아닐까 싶다.
벨로그를 접하게 된 이후로 til을 작성하면서 마크다운이라는 걸 처음 작성해봤는데 생각보다 너무 편리하다. html 에디터 보다도 좋은 것 같다. 게다가 velog 만의 uiux 디자인이 마음에 들어서 불편함이 적은 것 같다.
그래서 나는 하루를 마치고 작성하는 이 시간을 좋아하게 되었다.
이 벨로그가 나에게 더 긍정적인 에너지를 전달해주는 힘을 가질 수 있기를.