FrontEnd/Vue

[Pinia] Getters

Grace 2023. 4. 18. 09:52

Getter는 Store 상태에 대한 computed와 정확히 동일합니다. defineStore()getters 속성으로 정의할 수 있습니다. 그들은 화살표 함수의 사용을 장려하기 위해 첫 번째 매개변수로 state를 받습니다.

export const useStore = defineStore('main', {
  state: () => ({
    counter: 0,
  }),
  getters: {
    doubleCount: (state) => state.counter * 2,
  },
})

대부분의 경우 getterstate에만 의존하지만 다른 getter를 사용해야 할 수도 있습니다. 이 때문에 일반 함수를 정의할 때 이를 통해 전체 저장소 인스턴스에 액세스할 수 있지만 리턴 타입의 타입(TypeScript에서)을 정의해야 합니다. 이것은 TypeScript의 알려진 제한으로 인한 것이며 화살표 함수로 정의된 getter나 이것을 사용하지 않는 getter에 영향을 미치지 않습니다.

export const useStore = defineStore('main', {
    state: () => ({
      counter: 0,
    }),
    getters: {
        // 자동으로 리턴 타입을 숫자로 유추합니다.
        doubleCount(state) {
            return state.counter * 2
        },
        // 리턴 타입은 반드시 명시적으로 설정되어야 합니다.
        doublePlusOne(): number {
            // 전체 Store에 대한 자동 완성 및 입력 ✨
            return this.doubleCount + 1
        },
    },
})

그런 다음 Store 인스턴스에서 직접 getter에 액세스할 수 있습니다.

<script setup>
import { useStore } from '@/store/store'

const store = useStore()
</script>

<template>
  <div>
    {{ store.doubleCount }}
  </div>
</template>

다른 getter에 접근

computed와 마찬가지로 여러 getters를 결합할 수 있습니다. 이를 통해 다른 getter에 액세스하십시오. TypeScript를 사용하지 않더라도 JSDoc을 사용하여 유형에 대해 IDE에 힌트를 줄 수 있습니다.

import { defineStore } from 'pinia'

export const useStore = defineStore('main', {
    state: () => ({
      counter: 0,
    }),
    getters: {
        // `this`를 사용하지 않기 때문에 유형이 자동으로 유추됩니다.
        doubleCount: (state) => state.counter * 2,
        // 여기에 유형을 직접 추가해야 합니다(JS에서 JSDoc 사용). 우리는 또한 할 수 있습니다
        // 이것을 사용하여 getter를 문서화합니다.
        /* 카운터 값 곱하기 2 더하기 1을 반환합니다.
           @returns {숫자} */
        doubleCountPlusOne(): number {
            // autocompletion ✨
            return this.doubleCount + 1
        },
    },
})

getter에 매개변수 전달

getter에서 함수를 반환하여 모든 매개변수를 받을 수 있습니다.

export const useStore = defineStore('main', {
  getters: {
    getUserById: (state) => {
      return (userId) => state.users.find((user) => user.id === userId)
    },
  },
})

컴포넌트에서 사용

<script setup>
import { useStore } from '@/store/store'

const store = useStore()
const getUserById = store.getUserById
</script>

<template>
  <p>User 2: {{ getUserById(2) }}</p>
</template>

이 작업을 수행할 때 getter는 더 이상 캐시되지 않으며 단순히 호출하는 함수입니다.

export const useStore = defineStore('main', {
  getters: {
    getActiveUserById(state) {
      const activeUsers = state.users.filter((user) => user.active)
      return (userId) => activeUsers.find((user) => user.id === userId)
    },
  },
})

다른 Store getters에 접근

다른 Store getter를 사용하려면 getter 내부에서 직접 사용할 수 있습니다.

import { useOtherStore } from './other-store'

export const useStore = defineStore('main', {
  state: () => ({
    // ...
  }),
  getters: {
    otherGetter(state) {
      const otherStore = useOtherStore()
      return state.localData + otherStore.data
    },
  },
})

'FrontEnd > Vue' 카테고리의 다른 글

[Vue] Vue-Daum-Postcode  (0) 2023.04.18
[Pinia] Actions  (0) 2023.04.18
[Pinia] State  (0) 2023.04.17
[Pinia] Store  (0) 2023.04.17
[Pinia] 상태관리 라이브러리  (0) 2023.04.17