[VUE] VUEX

JIOO·2022년 12월 26일

Vue

목록 보기
15/18
post-thumbnail

Vuex

vuex는 vue에서의 전역 상태관리 라이브러리이다.

state 만들기

import { createStore } from 'vuex'

const store = createStore({
  state () {
    return {
      name : 'kim',
      age : 20,
    }
  },
  mutations :{
    한살더하기(state){
      state.age++
    }
  },
})

export default store

createApp 부분에 써주기

import store from './store.js'
app.use(store).mount('#app')

state 접근

<div>{{ $store.state.message }}</div>

getter

Vuex에서 getter는 저장소(state)의 데이터를 가공하거나 계산된 속성(computed) 처럼 사용하는 데에 유용한 메소드이다. getter를 사용하여 저장소의 데이터에 접근 및 가공할 수 있다.

아래엔 그 예시를 든 예제이다.


const store = createStore({
  state: {
    todos: [
      { id: 1, text: 'Buy groceries', done: false },
      { id: 2, text: 'Finish homework', done: true },
      { id: 3, text: 'Clean room', done: false }
    ]
  },
  getters: {
    doneTodos: state => {
      return state.todos.filter(todo => todo.done);
    },
    // getter에 다른 getter를 활용할 수도 있음
    doneTodosCount: (state, getters) => {
      return getters.doneTodos.length;
    }
  }
});
<template>
  <div>
    <h2>Done Todos</h2>
    <ul>
      <li v-for="todo in doneTodos" :key="todo.id">{{ todo.text }}</li>
    </ul>
    <p>Total Done Todos: {{ doneTodosCount }}</p>
  </div>
</template>

<script>
export default {
  computed: {
    // getter를 computed 속성으로 사용
    doneTodos() {
      return this.$store.getters.doneTodos;
    },
    doneTodosCount() {
      return this.$store.getters.doneTodosCount;
    }
  }
};
</script>

이 예제에서는 store/state에 todos라는 배열이 있고, 그 배열을 기반으로 두 개의 getter를 정의하였다. doneTodos는 완료된 할 일들을 필터링한 배열을 반환하고, doneTodosCount는 완료된 할 일의 개수를 반환하며 사용할 컴포넌트에서 computed 속성을 사용해 getter들을 활용하고 있다.

뮤테이션(mutations)

뮤테이션(mutations)은 뷰엑스에서 상태 값을 변경하는 유일한 방법이다.
상태는 항상 뮤테이션으로 변경된다.

mutations 선언

const store = createStore({
  state: {
    message: 'Hello Vue.js'
  },
  mutations: {
    reverseMessage(state) {
      state.message = state.message.split('').reverse().join('');
    }
  }
})
 

mutations 호출
컴포넌트에서 뮤테이션을 호출하려면 commit() API를 사용한다.

// Vue 파일 내에서 

  methods: {
    reverseMsg() {
      this.$store.commit('reverseMessage');
    }
  }

actions

액션(actions)은 뮤테이션 중에서 비동기 처리 로직들을 정의하는 속성이다.

예제

 mutations: {
    reverseMessage(state, data) {
      state.message = data.split('').reverse().join('');
    }
  },
  actions: {
    fetchMessage(context) {
      axios.get(url).then(function(response) {
        context.commit('reverseMessage', response.message);
      });
    }
  }


// Vuex 스토어를 생성합니다.
const store = createStore({
  // 스토어의 초기 상태를 정의
  state: {
    // 메시지를 저장하는 상태 속성을 정의
    message: ''
  },
  
  // 뮤테이션(mutations)은 스토어의 상태를 변경하는 메소드를 정의
  mutations: {
    // reverseMessage 뮤테이션은 받아온 데이터를 역순으로 바꿔서 state.message에 저장하는 함수
    reverseMessage(state, data) {
      state.message = data.split('').reverse().join('');
    }
  },
  
  // 액션(actions)은 비동기 로직을 포함한 메소드를 정의
  actions: {
    fetchMessage(context) {
      axios.get(url).then(function(response) {
      // 외부에서 데이터를 가져오는 비동기 동작 (axios를 사용하여 데이터를 가져옴)
      context.commit('reverseMessage', response.message);
      // 가져온 데이터를 reverseMessage 뮤테이션을 통해 상태에 반영
      });
    }
    // fetchMessage 액션은 외부에서 데이터를 가져와서 뮤테이션을 호출하여 스토어의 message state의 상태를 변경
  }
});
 

주요 포인트:

📖 기본원리

context.commit('reverseMessage', response.message);에서 context.commit을 사용하여 
reverseMessage 뮤테이션을 호출하고, response.message를 뮤테이션에 전달합니다. 
이로써 message 상태가 역순으로 변경됩니다.

이 코드는 비동기 작업을 수행하는 상황을 가정하고 있으며, 이를 위해 외부에서 데이터를 가져오는 것을 시뮬레이션하기 위해 actios안에서 axios를 사용하는 중이다.


이때 context의 의미를 이렇게 정의 할 수 있다고 한다 (찾아봄)

context.state: 현재 모듈의 상태에 접근합니다. context.state를 통해 현재 모듈의 상태를 읽어올 수 있습니다.

context.rootState: 루트 스토어의 상태에 접근합니다. 모듈화된 상태에서 루트 스토어의 상태를 읽어올 때 사용합니다.

context.getters: 현재 모듈의 게터에 접근합니다. context.getters를 통해 현재 모듈의 게터를 호출할 수 있습니다.

context.commit(mutationType, payload): 뮤테이션을 호출하여 상태를 변경합니다.
mutationType은 호출할 뮤테이션의 타입이며, payload는 뮤테이션에 전달되는 데이터입니다.

context.dispatch(actionType, payload): 다른 액션을 호출합니다.
actionType은 호출할 액션의 타입이며, payload는 액션에 전달되는 데이터입니다.

context는 일종의 인터페이스로서, 액션 내부에서 스토어에 접근하거나 스토어의 상태를 변경하는 메소드를 호출하는 데 사용됩니다.

주로 비동기 작업을 수행하는 액션에서 사용되며,

스토어의 데이터를 변경하거나 다른 액션을 호출하는 등의 작업을 수행할 수 있습니다.


actions를 컴포넌트에서 호출하는법

// Vue 파일 내에서
  methods: {
    getMessage() {
      this.$store.dispatch('fetchMessage');
    }
  }
})

Hellper

뷰엑스의 기술 요소 전부 헬퍼 함수를 갖고 있습니다. 사용법은 다음과 같습니다.

import { mapState, mapGetters, mapMutations, mapActions } from 'vuex';

export default {
  computed: {
    ...mapState(), // store state를 불러오는 함수
    ...mapGetters() // store getter를 불러오는 함수 
  },
  methods: {
    ...mapMutations(), // store mutations를 불러오는 함수
    ...mapActions(), // store actions를 불러오는 함수
  }
}

💡결론

동기 처리는 뮤테이션, 비동기 처리는 액션으로 생각하면 된다.

profile
프론트엔드가 좋은 웹쟁이 with Notion (요즘은 노션과 병행 중)

0개의 댓글