FrontEnd/Vue

[Pinia] State

Grace 2023. 4. 17. 16:19

State

state는 대부분의 경우 Store의 중심 부분입니다. 그리고 개발자들은 대부분 앱을 나타내는 state를 정의하는 것으로 시작합니다. Pinia에서 state는 초기 값을 리턴하는 함수로 정의됩니다. 그리고 이러한 state는 서버, 클라이언트 모두에서 작동할 수 있습니다.

import { defineStore } from 'pinia'

const useStore = defineStore('storeId', {
  // 전체 타입 추론에 권장되는 화살표 함수
  state: () => {
    return {
	  // 이 모든 속성은 자동으로 유형이 유추됩니다.
      counter: 0,
      name: 'Eduardo',
      isAdmin: true,
    }
  },
})

state 접근하기

기본적으로 store 인스턴스를 통해 state에 접근하여 직접 읽고 쓸 수 있습니다.

const store = useStore()

store.counter++

state 초기화

store에서 $reset() 메서드를 호출하여 상태를 초기 값으로 재설정 할 수 있습니다.

const store = useStore()

store.$reset()

state 변경하기

store.counter++store를 직접 변경하는 것 외에도 $patch 메소드를 호출할 수도 있습니다. state 객체의 부분을 매개변수로 전달하여 여러개의 값을 변경할 수 있습니다.

store.$patch({
  counter: store.counter + 1,
  name: 'Abalam',
})

하지만 객체의 일부 변경으로 배열의 변경을 수행(푸시, 제거, 연결)하려면 적용이 힘들거나 비용이 발생할 수 있습니다. 이때 $patch 메서드에 콜백 함수를 전달하여 해결할 수 있습니다.

cartStore.$patch((state) => {
  state.items.push({ name: 'shoes', quantity: 1 })
  state.hasChanged = true
})

여기서 주요 차이점은 $patch()를 사용하면 여러 변경 사항을 devtools의 단일 항목으로 그룹화할 수 있다는 것입니다. state$patch()에 대한 직접적인 변경은 devtools에 나타나며 timeline 확인이 가능합니다.(아직 Vue 3에는 없음).

state 교체

$state속성을 새 객체로 설정하여 저장소의 전체 상태를 바꿀 수 있습니다 .

store.$state = { counter: 666, name: 'Paimon' }

pinia 인스턴스의 상태를 변경하여 애플리케이션의 전체 상태를 바꿀 수도 있습니다.

pinia.state.value = {}

state 구독

Vuex의 subscribe 메소드와 유사하게 스토어의 $subscribe() 메소드를 통해 상태와 변경 사항을 볼 수 있습니다. 일반 watch()보다 $subscribe()를 사용하는 이점은 구독이 패치 후에 한 번만 트리거된다는 것입니다.

cartStore.$subscribe((mutation, state) => {
  // 'pinia'에서 { MutationType } 가져오기
  mutation.type // 'direct' | 'patch object' | 'patch function'
  //cartStore.$id와 동일
  mutation.storeId // 'cart'
  // mutation.type === 'patch object'에서만 사용 가능
  mutation.payload // cartStore.$patch()에 전달된 패치 객체

  // 변경될 때마다 전체 상태를 로컬 스토리지에 유지
  localStorage.setItem('cart', JSON.stringify(state))
})

기본적으로 상태구독은 추가된 컴포넌트에 바인딩됩니다. 즉, 컴포넌트가 마운트 해제되면 자동으로 제거됩니다. 컴포넌트가 마운트 해제된 후에도 이를 유지하려면 { detached: true }를 두 번째 인수로 전달하여 현재 컴포넌트에서 상태 구독을 분리합니다.

export default {
  setup() {
    const someStore = useSomeStore()

    // this subscription will be kept after the component is unmounted
    someStore.$subscribe(callback, { detached: true })

    // ...
  },
}

pinia인스턴스 의 전체 상태를 볼 수 있습니다 .

watch(
  pinia.state,
  (state) => {
    // persist the whole state to the local storage whenever it changes
    localStorage.setItem('piniaState', JSON.stringify(state))
  },
  { deep: true }
)

참고

  • Vuex와 다르게 state를 직접 변경할 수 있다.
  • Vuex와 다르게 Mutations에 대한 개념이 없어졌다.
    • 개념이 더 단순해지고 구조가 간결해짐.

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

[Pinia] Actions  (0) 2023.04.18
[Pinia] Getters  (0) 2023.04.18
[Pinia] Store  (0) 2023.04.17
[Pinia] 상태관리 라이브러리  (0) 2023.04.17
[Vue3] Composable API  (0) 2023.04.17