Nuxt3 module with autoimport and persist, expire option for pinia
MIT License
Nuxt3 환경의 Pinia 상태 저장소를 쉽고 강력하게 사용할 수 있도록 도와주는 모듈입니다. 웹스토리지를 통한 상태값 보전을 제공하고, 더 잘 활용하기 위해 만료 시간과 상태값의 버전을 지정할 수 있는 추가 옵션을 제공합니다.
사용이 쉽습니다!
** 사용 예제 스크린샷
** 웹스토리지를 통한 상태값 보전 예시
https://github.com/rubystarashe/nuxt3-pinia-playground
npm i nuxt3-pinia
// nuxt.config.js
import { defineNuxtConfig } from 'nuxt'
export default defineNuxtConfig({
modules: ['nuxt3-pinia']
})
// store/index.js
export const store1 = {
state: () => {
return {
foo: 'bar'
}
}
}
export const store2 = () => {
const count = ref(0)
const doubleCount = computed(() => count.value * 2)
function increment() {
count.value++
}
return { count, doubleCount, increment }
}
// app.vue
<script setup>
const { foo } = getStoreRefs('store1')
const store2 = getStore('store2')
const { count, doubleCount } = store2.toRefs()
const { increment } = store2
</script>
// store/index.js 에 스토어 모듈을 다음과 같이 설정하면,
export default {
state: () => {
return {
count: 0
}
}
}
// default 는 getStore('default')로 호출할 수 있습니다
export const test = {
state: () => {
return {
foo: 'bar'
}
}
}
// test 는 getStore('test')로 호출할 수 있습니다
// store/othername.js 에 스토어 모듈을 다음과 같이 설정하면,
export default {
state: () => {
return {
count: 0
}
}
}
// default 는 이름이 생략되어 getStore('othername')로 호출할 수 있습니다
export const nextname = {
state: () => {
return {
foo: 'bar'
}
}
}
// nextname 은 getStore('othername/nextname')로 호출할 수 있습니다
// store/depth1/depth2.js 에 스토어 모듈을 다음과 같이 설정하면,
export default {
state: () => {
return {
count: 0
}
}
}
// default 는 이름이 생략되어 getStore('depth1/depth2')로 호출할 수 있습니다
export const depth3 = {
state: () => {
return {
foo: 'bar'
}
}
}
// depth3 은 getStore('depth1/depth2/depth3')로 호출할 수 있습니다
스토어 모듈들을 읽어올 디렉토리 패스의 이름을 지정할 수 있습니다
// nuxt.config.js
import { defineNuxtConfig } from "nuxt"
export default defineNuxtConfig({
modules: ['nuxt3-pinia'],
pinia: {
autoImport: 'store' // 기본 값은 'store'. 만약 false 라면, 자동으로 읽어오지 않습니다
}
})
// 스토어를 가져옵니다
const store1 = getStore('store1')
const store2 = store('store2')
// 스토어의 state 들을 반응성 객체로 가져옵니다
const store1_refs = store1.toRefs()
const store2_refs = storeToRefs(store2)
const store3_refs = getStoreRefs('store3')
모듈 파일을 지정한 폴더에 생성하는 방법 외에도, vue 인스턴스 안에서 스토어를 생성할 수 있습니다
const newStore = defineStore('storename', {
state: () => {
return {
foo: 'bar'
}
}
})
// defineStore 는 스토어 객체를 생성함과 동시에, 만들어진 스토어를 전역적으로 등록합니다
// 따라서 추가적인 설정 없이도 get store api를 통해 다른 컴포넌트에서 불러올 수 있습니다
const store_by_get = getStore('storename')
Nuxt app 에 접근하여 pinia 인스턴스를 가져올 수 있습니다. pinia.stores 또는 $pinia 를 참조하여 모듈로 등록된 스토어 목록을 참조할 수도 있습니다
const { pinia, $pinia } = useNuxtApp()
const stores = pinia.stores // === $pinia
const store1 = $pinia['store1']()
const store2 = pinia.stores['store1']()
스토어를 생성할 때, persist 옵션을 부여하는 것으로 상태가 웹스토리지에 저장되도록 지정할 수 있습니다
export default {
persist: 'localStorage' // local, localStorage, session, sessionStorage.
state: () => {
return {
foo: 'bar'
}
}
}
persist 옵션이 부여된 스토어는, $persist 속성을 통해 persist 시점을 확인할 수 있습니다
<template>
<div v-if="store.$persist">
{{store.foo}}
</div>
</template>
<script setup>
const store = getStore('default')
</script>
스토어를 생성할 때, expire 옵션을 부여하는 것으로 웹스토리지에 저장된 상태의 저장 기간을 설정할 수 있습니다
export default {
persist: true, // === localStorage
expire: 1000 * 60 * 60 // expire or expirein key. ms.
state: () => {
return {
foo: 'bar'
}
}
}
저장된 상태의 버전이 바뀌면, 이전에 저장되었던 스토어 상태를 불러오지 않고 새로운 버전의 기본값을 웹스토리지에 저장합니다
export default {
persist: true,
version: 'some version', // any
state: () => {
return {
foo: 'bar'
}
}
}