Skip to content

Pinia

Install Pinia

bash
npm i pinia
# or
yarn add pinia

Use Pinia

js
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'

const app = createApp(App)
app.use(createPinia())
app.mount('#app')

Define an Option Store

js
import { defineStore } from 'pinia'

export const useCounterStore = defineStore('counter', {
  state: () => ({
    count: 0,
    age: 0,
    name: '',
    users: [{id: '1', name: '111'}, {id: '2', name: '222'}]
  }),
  getters: {
    doubleCount: (state) => state.count * 2,
    /**
     * @returns {number}
     */
    doublePlusOne() {
      return this.doubleCount + 1
    },
    getUserById: (state) => {
      return (id) => state.users.find(user => user.id === id)
    }

  },
  actions: {
    increment(step = 1) {
      this.count += step
    },
    async fetchData() {
      const data = await fetch('https://api.github.com/users/posva')
      return data.json()
    }
  }
})

Define a Setup Store

js
import { defineStore } from 'pinia'
import { computed, ref } from "vue";

export const useCounterStore = defineStore('counter1', () => {
  const count = ref(0)
  const age = ref(0)
  const name = ref('')
  const users = ref([{id: '1', name: '111'}, {id: '2', name: '222'}])
  const doubleCount = computed(() => count.value * 2)
  const doublePlusOne = computed(() => doubleCount.value + 1)
  const getUserById = computed(() => {
    return (id) => users.value.find(user => user.id === id)
  })
  const increment = (step = 1) => count.value += step
  const fetchData = async () => {
    const data = await fetch('https://api.github.com/users/posva')
    return data.json()
  }
  return { count, name, age, doubleCount, doublePlusOne, getUserById, increment, fetchData}
})

Use a Store

js
import { useCounterStore } from "@/stores/counter";
import { storeToRefs } from "pinia";

const counter = useCounterStore()
console.log(counter.count, counter.doubleCount, counter.doublePlusOne)

// 直接修改store
counter.count++
// 通过 $patch 修改 store
counter.$patch({count: counter.count + 1})

// 同时修改多个属性,使用补丁对象
counter.$patch({
  count: counter.count + 1,
  age: 120,
  name: 'DIO',
})
// 同时修改多个属性,使用函数
counter.$patch(state => {
  state.count++
  state.age = 120
  state.name = 'DIO'
})

// 通过 storeToRefs 将 store 转换为响应式对象
const { count, doubleCount, doublePlusOne, getUserById } = storeToRefs(counter)
console.log(count.value, doubleCount.value, doublePlusOne.value)
const user = getUserById.value('1')
console.log(user)

counter.increment()
counter.fetchData()
// 作为 action 的 increment 可以直接解构
const { increment } = counter
increment()

Powered by VitePress