通过抽象类复用共用部分状态实现多个 Pinia 状态管理

通过抽象类复用共用部分状态实现多个 Pinia 状态管理

使用场景

在多个场景中共用同一状态,或部分复用与解耦状态管理。

实现步骤

1. 定义一个抽象类来复用共用部分状态
import { defineStore } from 'pinia'

export default abstract class BaseOrderStore {
  protected storeName: string
  protected constructor(storeName: string) {
    this.storeName = storeName
  }
  protected abstract initState(): any
  protected abstract initActions(store: any): any
  init() {
    const storeDefinition = defineStore(this.storeName, {
      state: () => ({
        orderList: [], // 订单列表
        ...this.initState(),
      }),
      // reset: (state: any) => {},
      actions: {
        setOrderList(data: any[]) {
          this.orderList = data
        },
      },
    })

    const store = storeDefinition()
    this.addDynamicPropertiesAndMethods(store)
    return store
  }
  // 将子类属性和方法添加到 store 实例中
  private addDynamicPropertiesAndMethods(store: any) {
    const state = this.initState()
    const actions = this.initActions(store)
    Object.keys(state).forEach((key) => {
      store[key] = state[key]
    })
    Object.keys(actions).forEach((key) => {
      store[key] = actions[key]
    })
  }
}
2. 在子类中继承并构造 Pinia 对象,添加自身特定的状态和方法
import BaseOrderStore from './BaseOrderStore'

class ShopOrderStore extends BaseOrderStore {
  constructor() {
    super('ShopOrderStore')
  }
  protected initState() {
    return {
      vipDeliveryInfo: [], // 会员配送地址
    }
  }
  protected initActions(store: any) {
    return {
      async getVipDeliveryInfo(callback?: Function) {},
    }
  }
}

const useShopOrderStore = new ShopOrderStore().init()
export default useShopOrderStore

过程中出现的问题与解决方式

获取 Pinia 实例对象问题

  • initActions 中获取到的 storeShopOrderStore 的实例,而不是 Pinia 实例对象。
  • 解决方案:在 抽象 类中通过 addDynamicPropertiesAndMethods 方法,将 this.initActions(store) Pinia 实例对象传递给 initActions

总结

  1. 抽象类封装共用状态和方法
    • 定义一个抽象类 BaseOrderStore,通过封装共用的状态和方法。
  2. 动态添加状态和方法
    • 通过 addDynamicPropertiesAndMethods 方法,将子类特定的状态和方法动态地添加到 Pinia 实例对象上。
  3. 子类继承与扩展
    • 子类继承 BaseOrderStore,并通过实现 initStateinitActions 方法来扩展自身特定的状态和方法。

❗APP端适配出现的问题

此实现方式在web端没有问题,uniapp app出现了程序白屏的问题,与pinia实例化后再插入actionstate有关

const store = storeDefinition()
this.addDynamicPropertiesAndMethods(store)
return store

问题出现在这里

解决方式,先插入后实例化

  1. 定义一个抽象类来复用共用部分状态
import { defineStore } from 'pinia'

export default abstract class BaseOrderStore {
  protected storeName: string
  protected constructor(storeName: string) {
    this.storeName = storeName
  }
  protected abstract initState(): any
  protected abstract initActions(): any
  init() {
    const storeDefinition = {
      state: () => ({
        orderList: [],
        ...this.initState(),
      }),
      actions: {
        setOrderList(data: any[]) {
          this.orderList = data
        },
        ...this.initActions(),
      },
    }
    return defineStore(this.storeName, storeDefinition)
  }
}
  1. 在子类中继承并构造 Pinia 对象,添加自身特定的状态和方法
import BaseOrderStore from './BaseOrderStore'
class ShopOrderStore extends BaseOrderStore {
  constructor() {
    super('ShopOrderStore')
  }
  protected initState() {
    return {
      vipDeliveryInfo: [], // 会员配送地址
    }
  }
  protected initActions() {
    return {
      async getVipDeliveryInfo() {},
    }
  }
}

const useShopOrderStore = new ShopOrderStore().init()
export default useShopOrderStore
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JoveTAT

感谢您的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值