Vuex

  • 모든 컴포넌트에서 접근 가능한 js파일 내에 데이터를 몰아 넣음
  • 코드가 복잡해 질 수 있어서 사용하는 컴포넌트와 데이터가 많을 때 사용
  • 주의: 컴포넌트 안에서 직접 수정 금지!!
  • 설치(vuex v4.x기준)
  • npm install vuex@next --save
  • js파일 만들기(보통 store.js로 만드는것이 관행)
  • import { createStore } from 'vuex'
    
    // Create a new store instance.
    const store = createStore({
      state () {
        return {
          // data
          name : 'Kim'
        }
      },
    })
    
    export default store;
  • main.js 수정
  • import store from './store.js'
    ...
    app.use(store).mount('#app')

 

vuex state

  • data 사용, data대신 state라고 부름
  • 예시
  • <h4>Hello {{$store.state.name}}</h4>

 

vuex mutations

  • 데이터변경 시 사용하는 함수 정의, 데이터는 직접변경은 하지 말것, 나중에 버그 찾기 어려움
  • store.js에 state 수정 방법 정의
  • ..
    const store = createStore({
      state () {
        return {
          name : 'Kim',
          age : 20,
        }
      },
      mutations : {
          changeName(state) {
              state.name = 'zero'
          },
          addAge(state, payload) {
              state.age += payload
          }
      }
    })
    ..
  • 데이터 변경 수정 시 store.js에 요청
  • <button @click="$store.commit('changeName'); $store.commit('addAge', 10)">click</button>

 

vuex actions

  • ajax 함수 호출: mutations 함수 호출 $store.commit 대신 $store.dispatch 사용
  •   <button @click="$store.dispatch('getData')">more</button>
  • ajax 함수 정의, 데이터 변경 함수 정의
  •   ...
      mutations: {
        setMore(state, data) {
            state.more = data
        }
      },
      //   ajax 기능 구현
      actions: {
        getData(context) {
          axios
            .get("https://codingapple1.github.io/vue/more0.json")
            .then((result) => {
                console.log(result.data);
                context.commit('setMore', result.data)
            });
        },
      },

 

vuex ...mapState, ...mapMutations, ...mapActions

  • import
  • import { mapActions, mapMutations, mapState } from 'vuex';
  • ...mapState: $store.state.데이터명 축약
    • $store.state.데이터 축약을 위해서 compute 사용도 가능
  •  <p>{{myname}} {{age}}</p>
     ...
     computed : {
        // 값을 간직하고 있음, 컴퓨팅 파워 절약, 재렌더링 안함
        name() {
          return this.$store.state.name
        },
    
        // spread operator
        ...mapState(['name', 'age', 'likes']),
        ...mapState({'myname' : 'name'})
      },
  • ...mapMutations: $store.commit('함수명')축약
  • <button @click="changeName(); addAge(10)">click</button>
     methods: {
        ...mapMutations(['changeName', 'addAge', 'setMore']),
     }
  • ...mapActions: $store.dispatch('함수명')축약

'컴&프로그래밍 > Vue.js' 카테고리의 다른 글

vue.js props, slot, slot-props, custom event, mitt  (0) 2021.10.09
vue.js 데이터바인딩  (0) 2021.10.07
Vue Lifecycle, Lifecycle Hooks  (0) 2021.10.04
1234···168