[Vue.js] state 추적해서 화면에 보여주기

아현·2024년 6월 20일
0

Vue

목록 보기
2/4


Vue.js에서 state 값을 변경하고 이를 추적하여 화면에 표시하기 위해서는 Vue의 반응형 시스템과 컴포넌트 상태 관리를 이해해야 합니다.

이를 위해 Vuex를 사용할 수 있습니다.

Vuex


1) Vuex Store 생성

  • 먼저, Vuex Store를 만들어 줍니다.

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    count: 0 // 이 값을 추적할 예정입니다.
  },
  mutations: {
    increment (state) {
      state.count++  // count 값을 증가시키는 mutation입니다.
    }
  }
})



그런 다음, count 값이 변경될 때마다 이를 추적하고 화면에 표시하려면 Vue 컴포넌트에서 computed 프로퍼티를 사용할 수 있습니다.



2) component와 method를 이용한 state값 추적


import { mapState } from 'vuex'

export default {
  computed: {
    ...mapState([
      'count' // Store의 count state를 mapping 합니다.
    ])
  },
  methods: {
    incrementCount() {
      this.$store.commit('increment')  // count 값을 증가시킵니다.
    }
  }
}

그런 다음 이 컴포넌트의 템플릿에서 {{ count }}을 사용하여 count 값을 화면에 출력할 수 있습니다. 이렇게 하면 count 값이 변경될 때마다 UI가 자동으로 업데이트됩니다. 또한, 원한다면 버튼을 누르는 등의 이벤트로 incrementCount 메소드를 호출하여 count 값을 증가시킬 수 있습니다.



3) HTML 코드 수정



<template>
  <div>
    <p>Count: {{ count }}</p>
    <button @click="incrementCount">Increment</button>
  </div>
</template>

이 예제는 가장 기본적인 방법을 보여주며, Vue와 Vuex의 특징을 이용하여 더 복잡한 상태 관리를 구현할 수도 있습니다.



자식 컴포넌트에서 해당 state 값 사용하기


1) mapState로 state 값 매핑

  • 만약 자식 컴포넌트에서 Vuex Store의 state를 사용하려면, 마찬가지로 mapState를 사용하면 됩니다.

  • 먼저 위에서 구현한 Store를 import 한 후 아래와 같은 방식으로 컴포넌트에 적용해줄 수 있습니다.


import { mapState } from 'vuex'

export default {
  computed: {
    ...mapState([
      'count'  // Store의 count state를 mapping 합니다.
    ])
  }
}

여기서 어떻게 구조화되어 있는지에 따라, 깊이 중첩된 모듈의 state를 가져오고자 한다면, mapState의 첫 번째 인자로 모듈 이름을 입력하여 해당 모듈의 state를 가져올 수 있습니다.


...mapState('some/nested/module', ['count'])

이렇게 하면 자식 컴포넌트에서도 {{ count }} 을 사용하여 count 값을 사용할 수 있습니다.



2) HTML 코드 수정


<template>
  <div>
    <p>Count: {{ count }}</p>
  </div>
</template>

그런 다음 상태 변경이 언제라도 발생하면, 해당 컴포넌트는 자동으로 새로운 값을 화면에 업데이트하게 됩니다. 이는 Vuex가 Vue의 반응형 시스템을 활용하기 때문입니다.



profile
For the sake of someone who studies computer science

0개의 댓글

관련 채용 정보