美文网首页
vue3使用pinia管理状态

vue3使用pinia管理状态

作者: 诸葛_小亮 | 来源:发表于2022-04-24 20:24 被阅读0次

Pinia

pinia 是一款新的vue3的状态管理库,完整的typescript支持。

安装

yarn add pinia
# or npm
npm install pinia

创建根store并且引用到app上

import { createPinia } from 'pinia'

app.use(createPinia())

定义Store

使用defineStore定义store,第一个参数必须是全局唯一的id,可以使用Symbol

import { defineStore } from 'pinia'

// 第一个参数必须是全局唯一,可以是哟
export const useStore = defineStore('main', {
  
})

使用store

setup中使用useStore创建store实例

<script setup>
import {useStore} from '@/stores/counter'
  
const store = useStore()

....
</script>
  

状态State

定义状态

import { defineStore } from 'pinia',

const useCounterStore = defineStore('counterStore', {
  state: () => ({
    counter: 0
  })
})

定义强状态

import { defineStore } from 'pinia',

interface ICounterStoreState{
  counter: number
}
  
const useCounterStore = defineStore('counterStore', {
  state: ():ICounterStoreState => ({
    counter: 0
  })
})

使用和重置状态

const store = useCounterStore()

// 使用
store.counter++

// 重置
store.$reset()

改变状态

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

替换状态

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

计算属性Getters

Getter 完全等同于 Store 状态的计算值,可以用 defineStore() 中的 getters 属性定义

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

传递参数到getters

Getter 是计算属性,也可叫只读属性,因此不可能将任何参数传递给它们。但是可以从 getter 返回一个函数以接受任何参数

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

访问其他store的getters

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

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

动作Actions

动作相当于组件中的方法,可以使用 defineStore() 中的 actions 属性来定义,它们非常适合定义业务逻辑

import { mande } from 'mande'

const api = mande('/api/users')

export const useUsers = defineStore('users', {
  state: () => ({
    userData: null,
    // ...
  }),

  actions: {
    async registerUser(login, password) {
      try {
        this.userData = await api.post({ login, password })
        showTooltip(`Welcome back ${this.userData.name}!`)
      } catch (error) {
        showTooltip(error)
        // let the form component display the error
        return error
      }
    },
  },
})

访问其他store的actions

import { useAuthStore } from './auth-store'

export const useSettingsStore = defineStore('settings', {
  state: () => ({
    preferences: null,
    // ...
  }),
  actions: {
    async fetchUserPreferences() {
      const auth = useAuthStore()
      if (auth.isAuthenticated) {
        this.preferences = await fetchPreferences()
      } else {
        throw new Error('User must be authenticated')
      }
    },
  },
})

插件

假设需要在stroe中使用router,就需要使用到pinia的插件机制扩展store的api

pinia.d.ts

import 'pinia'

import { Router} from 'vue-router'

declare module 'pinia' {
  export interface PiniaCustomProperties {
    $router: Router,
  }
}

定义插件

import { createPinia } from 'pinia'
import { App} from "vue";

import { router } from '@/routers'

const pinia = createPinia()
pinia.use(({ store }) => {
    store.$router = router
  })
app.use(pinia)

在action中使用插件定义的pai

import { defineStore } from 'pinia'
import { RouteLocationNormalized } from 'vue-router'
export const useApplicationStore = defineStore('application', {
  state: () => (
    ...
  ),
  actions:{
    toHome(){
      this.$router.push('/home')
    }
  }
})

推荐结构

stores
index.ts
use.store.ts
app.store.ts
...

stores/index.ts

import { createPinia } from 'pinia'
import { App} from "vue";

const pinia = createPinia()

export function setupPinia(app: App){
    pinia.use(({ store }) => {
        ... 这里安装插件
      })
    app.use(pinia)
}

export * from './use.store.ts'
export * from './app.store.ts'

何时使用状态管理器

全局都会使用到的状态使用状态管理器,比如用户信息、主题、权限等等

相关文章

  • Vue3中使用Pinia

    Vue2 中使用Vuex进行状态管理,在Vue3中,引入了Pinia,如果使用Vue3的脚手架搭建项目,其中包含了...

  • vue3使用pinia管理状态

    Pinia pinia 是一款新的vue3的状态管理库,完整的typescript支持。 安装 创建根store并...

  • 从零开始使用 vite + vue3 + pinia + nai

    构建工具使用vue3推荐的vite;状态管理使用pinia,该库的作者也是vuex的核心成员;UI组件库使用尤大推...

  • vite + vue3 + setup + pinia + ts

    介绍 一个使用 vite + vue3 + pinia + ant-design-vue + typescript...

  • vue3的状态管理

    vue3的状态管理比较简单,摒弃了繁琐的vuex,改用肥肠好用的pinia。 声明store 在根路径新建一个st...

  • Pinia 快速入门

    Pinia 是什么? Pinia 是一个用于 Vue 的状态管理库,类似 Vuex, 是 Vue 的另一种状态管理...

  • vue3使用pinia

    在main.js注册pinia // store app.ts //permiss.js //页面使用

  • TypeError: 'set' on proxy: trap

    vue3使用pinia时发生了这个问题,经查阅多方资料,发现是因为getter中的函数名和state中的名称相同。...

  • 简单了解一下pinia的结构

    随着 Vue3 的正式转正,Pinia 也渐渐火了起来。所以要更新一下自己的知识树了。这里主要是看看新的状态是什么...

  • vue3新一代状态管理库 Pinia

    Pinia优势 Pinia是一个全新的Vue状态管理库,是Vuex的代替者,尤雨溪强势推荐 1.Vue2 和 Vu...

网友评论

      本文标题:vue3使用pinia管理状态

      本文链接:https://www.haomeiwen.com/subject/loqxyrtx.html