ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • vuex - usage
    Tech/Front 2020. 8. 10. 23:38
    반응형

    - 구조

    //https://vuex.vuejs.org/kr/guide/structure.html
    - api
      index.js (vuejs-axios-공통 참고)
    - store
       ㄴ index.js
       ㄴ state.js
       ㄴ actions.js
       ㄴ mutations.js
       ㄴ getters.js

    - main.js

    //main.js
    import Vue from 'vue'
    import router from './router'
    import App from './App.vue'
    import store from './store'
    
    new Vue({
        el:'#app',
        router,
        store,
        render: h => h(App)
    })

    - index.js

    //index.js
    import Vue from 'vue'
    import Vuex from 'vuex'
    import state from './state'
    import getters from './getters'
    import mutations from './mutations'
    import actions from './actions'
    
    Vue.use(Vuex)
    const store = new Vuex.Store({
        state,
        getters,
        mutations,
        actions,
    })
    const {token} = localStorage
    store.commit('LOGIN',token)
    export default store

    - actions.js

    //actions.js
    import * as api from '../api'
    const actions = {
        LOGIN ({commit},{email,password}){
            return api.auth.login(email,password)
            .then(({accessToken}) => commit('LOGIN', accessToken)
        },
        ADD_USER(_,{name}){
            return api.user.create(name)
        },
        FETCH_USERS({commit}){
            return api.user.fetch().then(data => {
                commit('SET_USERS',data.list)
            })
        }
    }
    export default actions 

    - getters.js

    //getters.js
    const getters = {
        isAuth(state){
            return !!state.token
        }
    }
    export default getters 

    - mutations.js

    //mutations.js
    import {setAuthInHeader} from '../api'
    const mutations = {
        LOGIN(state,token){
            if(!token) return
            state.token = token
            localStorage.setItem('token',token)
            setAuthInHeader(token)
        },
        LOGOUT(state){
            state.token = null
            delete localStorage.token
            setAuthInHeader(null)
        },
        SET_IS_ADD_USER(state,toggle){
            state.isAddUser = toggle
        },
        SET_USERS(state,users){
            state.users = users
        }
    }
    export default mutations

    - actions.js

    //actions.js
    import * as api from '../api'
    
    const actions = {
        login({ commit }, {email, password}){
            return api.auth.login(email, password)
            .then(({accessToken}) => commit('LOGIN',accessToken))
        },
        ADD_USER(_, {title}) {
            return api.users.create(title)
        },
        FETCH_USER({commit}) {
            return api.user.fetch().then(data => {
                commit('SET_USERS',data.list)
            })
        }
    }
    export default actions

    - state.js

    //state.js
    const state = {
        token: null,
        isAddUser: false,
        users: [],
    }
    
    export default state

    - sample

    //sample.vue
    import {mapState, mapMutations,mapActions} from 'vuex'
    
    export default {
        data(){
            loading: false,
            error: '',
        },
        created(){
            this.fetchUserData()
        },
        computed: {
            ...mapState([
                'isAddUser',
                users: 'users'
            ])
        },
        methods: {
            ...mapMutations([
                'SET_IS_ADD_USER'
            ]),
            ...mapActions([
                'ADD_USER',
                'FETCH_USERS'
            ]),
            fetchUserData(){
                this.loading = true
                this.FETCH_USERS().finally(_=>{
                    this.loading = true
                })
            },
            addUser(){
                this.SET_IS_USER(false)
                this.ADD_USER({name: this.input}).then()=>{
                    this.FETCH_USERS()
                }
            }
        }
    }

    출처: 인프런 강좌

    반응형

    'Tech > Front' 카테고리의 다른 글

    vuejs-axios - 공통 처리 방법  (0) 2020.08.10
Designed by Tistory.