• Pinia基础知识


    一、Pinia是什么?

            Pinia 是 Vue 的存储库,它允许跨组件/页面共享状态。实际上,pinia就是Vuex的升级版,官网也说过,为了尊重原作者,所以取名pinia,而没有取名Vuex,所以大家可以直接将pinia比作为Vue3的Vuex。

    二、为什么要使用pinia?

    • pinia中只有state、getter、action,抛弃了Vuex中的Mutation,Vuex中mutation一直都不太受小伙伴们的待见,pinia直接抛弃它了,这无疑减少了我们工作量。

    • pinia中action支持同步和异步,Vuex不支持

    • 良好的Typescript支持,毕竟我们Vue3都推荐使用TS来编写,这个时候使用pinia就非常合适了

    • 无需再创建各个模块嵌套了,Vuex中如果数据过多,我们通常分模块来进行管理,稍显麻烦,而pinia中每个store都是独立的,互相不影响。

    • 体积非常小,只有1KB左右。

    • pinia支持插件来扩展自身功能。

    • 支持服务端渲染

    三、Pinia 基础特性

       1、State

    (1)默认情况下,通过 store 实例访问 state,可以直接读取和写入,如 @click="store.count++"

    (2)通过 store.$reset() 方法可以将 state 重置为初始值。

    (3)除了直接通过 store 修改 state,还可以通过 store.$patch() 方法提交多个更改。

    (4)可以通过 store.$subscribe() 订阅 State 的变化,在 patches 修改之后订阅只会触发一次。默认情况下,订阅绑定到添加它的

    组件,当组件卸载时,它们将自动删除,也可以配置将其保留。

    2、Getters

    (1)Getters 属性的值是一个函数,接受 state 作为第一个参数,目的是鼓励使用箭头函数

    (2)非箭头函数会绑定 this,建议仅在需要获取整个 store 实例的场景使用,且需要显式定义函数返回类型

    3、Actions

    (1)与 Gettes 一样可以通过 this 访问整个 store 实例

    (2)Actions 可以是异步的或同步的,不管怎样,都会返回一个 Promise

    (3)Actions 可以自由的设置参数和返回的内容,一切将自动推断,不需要定义 TS 类型

    (4)与 State 一样,可以通过 store.$onAction() 订阅 Actions,回调将在执行前触发,并可以通过参数 after() 和 onError() 允许在Action 决议后和拒绝后执行函数。同样的,订阅绑定的是当前组件。

    四、Pinia 中关于 TypeScript 类型推断。Pinia 默认提供良好的 TypeScript 支持,但是要想获得完整的类型推断,需要遵循一些使用建议:

          1、声明 state 建议使用箭头函数,会自动推断属性的类型。如果使用非箭头函数,在 getters 中使用形参 state 访问属性TypeScript 无法识别

    1. const useStore = defineStore('main', {
    2. // 使用非箭头函数定义
    3. state() {
    4. return {
    5. count: 0
    6. }
    7. },
    8. getters: {
    9. // 使用 state 访问状态
    10. doubleCount(state) {
    11. return state.count * 2
    12. }
    13. },
    14. actions: {
    15. increment() {
    16. this.count++
    17. }
    18. }
    19. })

           2、声明 Getters 属性建议使用 state 参数访问状态(箭头函数或非箭头函数),非箭头函数虽然可以使用 this ,但不会自动推断类型(当没有声明 state 形参,或 state 使用非箭头函数定义时)

    • 为了避免使用 this,官方建议使用箭头函数

    • 建议仅当需要获取整个 store 时使用 this,但必须显式的定义函数返回类型,TypeScript 不会自动推断

    • 建议使用 this 的时候不要声明 state 形参

    1. const useStore = defineStore('main', {
    2. state: () => ({
    3. count: 0
    4. }),
    5. getters: {
    6. doubleCount() {
    7. return this.count * 2
    8. },
    9. // 解决办法1
    10. doubleCount2(state) {
    11. return this.count * 2
    12. },
    13. // 解决办法2
    14. doubleCount3():number {
    15. return this.count * 2
    16. }
    17. },
    18. actions: {
    19. increment() {
    20. this.count++
    21. }
    22. }
    23. })

    五、Pinia的函数

        1、createPinia(): Pinia。创建一个被应用所使用的 Pinia 实例。返回:Pinia

        2、defineStore(id, options): StoreDefinition。创建一个检索 store 实例的 useStore 函数。

    参数

    名称类型描述
    idIdstore 的 id (必须是唯一的)
    optionsOmit<DefineStoreOptions<Id, S, G, A>, "id">定义 store 的选项

         3、mapActions(useStore, keyMapper): _MapActionsObjectReturn。通过生成要在组件的 methods 字段中铺开的对象,允许直接使用存储(store)中的操作(action),而不使用合成API (setup())。对象的值是操作(action),而键是结果方法的名称。

    参数

    名称类型描述
    useStoreStoreDefinition<Id, S, G, A>要映射的存储
    keyMapperKeyMapperactions 定义新名称的对象

     例如:

    1. export default {
    2. methods: {
    3. // 其他方法属性
    4. // useCounterStore 有两个操作(action),分别叫做 `increment` 和 `setCount`
    5. ...mapActions(useCounterStore, { moar: 'increment', setIt: 'setCount' })
    6. },
    7. created() {
    8. this.moar()
    9. this.setIt(2)
    10. }
    11. }

         4、mapState(useStore, keyMapper): _MapStateObjectReturn。通过生成要在组件的 computed 字段中展开的对象,以允许从一个没有使用组合式 API (setup()) 的 store 使用 stategetters 对象的值是状态 properties/getters ,而键是结果计算属性的名称。您也可以传递一个自定义函数,该函数将接收 store 作为其第一个参数。请注意,虽然它可以通过这个访问组件实例,但它不会识别类型。

    参数

    名称类型描述
    useStoreStoreDefinition要映射的存储
    keyMapperKeyMapper状态(state)属性或访问器(getter)的对象

    例如:

    1. export default {
    2. computed: {
    3. // 其它计算属性
    4. // useCounterStore 有一个 state 属性叫做 `count` 和一个 getter 叫做 `double`
    5. ...mapState(useCounterStore, {
    6. n: 'count',
    7. triple: store => store.n * 3,
    8. // 注意如果我们想使用 `this` 则不能使用箭头函数
    9. custom(store) {
    10. return this.someComponentValue + store.n
    11. },
    12. doubleN: 'double'
    13. })
    14. },
    15. created() {
    16. this.n // 2
    17. this.doubleN // 4
    18. }
    19. }

          5、mapStores(…stores): _Spread。通过生成要在组件的 computed 字段中展开的对象,允许使用没有组合式API (setup())的存储。它接受 store 定义的列表。

    参数

    NameType描述
    ...stores[…Stores[]]要映射到对象的存储(store)列表

    例如:

    1. export default {
    2. computed: {
    3. // 其它计算属性
    4. ...mapStores(useUserStore, useCartStore)
    5. },
    6. created() {
    7. this.userStore // id为"user"的存储
    8. this.cartStore // id为"cart"的存储
    9. }
    10. }

          6、 storeToRefs(store): ToRefs。用 store 的所有stategetters和 插件添加的(plugin-added)state、 属性(properties)创建一个引用对象。类似于toRefs(),但专门为 Pinia store 设计,

    参数

    名称类型描述
    storeSS用以提取refs的 store
  • 相关阅读:
    【MyBatis-Plus】DQL
    Vue封神之路(2.) Vue的基本使用及单向数据绑定
    iframe 跨域之间共享localStorage,sessionStorage
    幕译--本地字幕生成与翻译--Whisper客户端
    ModelX一款开源的机器学习模型管理仓库
    与机器学习相比,人类的学习包括视觉、听觉、触觉、嗅觉、味觉的串并行混合学习...
    Visual Prompt Tuning 笔记
    计算机毕业设计(30)java毕设作品之多用户B2C商城平台系统
    JAVA【DAO及其实现类】
    letax环境过程记录 20220831
  • 原文地址:https://blog.csdn.net/m0_37911706/article/details/127118441