10cheon00 / drf-practice

0 stars 0 forks source link

Installed vuex4 for vue3. #16

Closed 10cheon00 closed 3 years ago

10cheon00 commented 3 years ago

Created vuex store. it has some modules, AxiosApi, TokenStorage. Create axiosapi vuex modules, to replace ApiRequest.js utils.

Vuex

installation

npm install vuex@next --save vue3를 위해서 다른 패키지를 설치한다.

Get Started

createApp(App).use(router).use(vuexStore).mount('#app')

// ./store/store.js import { createStore } from 'vuex'

import AxiosApi from '/src/store/AxiosApi' import TokenStorage from '/src/store/TokenStorage'

const store = createStore({ modules: { TokenStorage, AxiosApi, } })

export default store

각 모듈은 state, getters, mutation, 같은 속성을 가진 객체면 된다.

### TokenStorage
TokenStorage는 백엔드에서 로그인의 응답으로 주는 토큰을 받아 저장하는 store다. 
아직 persistedstate를 적용하지 않아 새로고침 시 토큰이 날아가버린다.
getters와 mutation만 작성하여 정말 저장소의 역할에 충실하다. 
중요한 점은 getters에서 꼭 **state를 그대로 반환하지 않은 경우**도 있다는 것이다. 
만약 이 getters가 없었다면, 매번 `this.$store.state.TokenStorage.accessTokenKey`를 받아오는 수고로움이 들었을 것.

### AxiosApi
이 모듈은 django앱에 대응되도록 나누었다.

1. ProfileApi

가입, 로그인 요청을 담당한다. 
**actions에서 axios요청을 한 뒤 그 axios객체를 바로 반환하기로 했다.**
로그인에 성공하면 라우터에서 뷰를 전환해야 하는데 store내에선 하면 안되기 때문이다.
그래서 store에 적절한 작업들은 actions내에서 즉각 처리를 한 후 바로 반환하기로 했다.
**then().then()구문이 되나 싶어 직접 해보니 된다.**

2. ArticleApi

게시물 목록, 조회, 추가, 삭제를 담당한다. (수정도 곧 추가할거야)

각 파일별로 앱의 url을 갖고 있는 객체를 일일히 작성해야한다. 이 부분은 좀 미흡하다. 
url이 앱마다 제각각일 경우를 고려하면 이게 맞는 것 같기도 하다.

### 그 외 중요한 것들
* getters에서 다른 getters를 호출하려면..? `(state, getters) => {}`
다른 모듈의 getters를 호출하려면 rootGetters를 이용하면 된다. `rootGetters['ModuleName/GetterName']`
* computed에서 getter를 더 깔끔히 쓰고 싶다면...?

...mapGetters({ customGetterName: 'GetterName' }) //... 연산자는 결합된 데이터를 뽀개주는 연산자다.

이렇게 쓰면 템플릿에서 {{ customGetterName }}으로 가볍게 쓸 수 있다.
* actions 인자 뽀개기

actionName( context, otherParameter){ context.commit('') }

이렇게 이용해도 되지만,

actionName( { commit, rootGetters, rootState }, otherParameter){}


이렇게 이용해도 된다!