31 vue3 Pinia监听订阅actions

上篇:

30 vue3 Pinia对state的订阅监听($subscribe)_十一月的萧邦-CSDN博客

本篇记录在vue3中如何对actions进行一个监听订阅的操作,这些操作对于在运行时跟踪错误很有用!可以帮助我们更好的发现问题,解决问题

1. 创建vue3项目,安装Pinia,配置Pinia,不再详细赘述

2. 目录  /store/main.js

 3. main.js,因为在订阅的时候,有错误异常的执行函数,所以,我们这里直接写上一个promise,当isError为false的时候,直接抛出异常

import {defineStore} from "pinia"

const userMainStore = defineStore('mainStore', {
    state: () => ({
        name: '小明'
    }),
    actions: {
        changeName(name, isError) {
            return new Promise((resolve, reject) => {
                this.name = name
                if (isError) {
                    resolve(`姓名:${this.name}`)
                } else {
                    reject('error')
                }
            })
        }
        ,
    },
})
export default userMainStore

4. 页面组件调用

<template>
  <div>
    {{ name }}
  </div>
  <button @click="changeNameHong">改变名字为小红</button>
  <button @click="changeNameMi">改变名字为小米</button>
</template>

<script>
import userMainStore from "@/store/main"
import {computed} from "vue";

export default {
  name: "ActionSubcribe",
  setup() {
    const mainStore = userMainStore();

    async function changeNameHong() {
      let result = await mainStore.changeName('小红', true)
      // console.log(result)  //姓名:小红
    }

    async function changeNameMi() {
      try {
        let result = await mainStore.changeName('小米', false)
        // console.log(result)
      } catch (e) {
        // console.log(e)  // error
      }
    }

    const unsubscribe = mainStore.$onAction((
            {
              name,  //action 函数的名称
              store,  //store 实例,这里是 mainStore
              args, //action 函数参数数组
              after,  //钩子函数,在action函数执行完成返回或者resolves后执行
              onError // 钩子函数,在action函数报错或者rejects后执行
            }) => {
          console.log('name===>', name)
          console.log('args===>', args)
          console.log('store===>', store)

          after(result => {
            console.log('after result===>', result)
          })

          onError(error => {
            console.log('onError error===>', error)
          })
        },
        false  //默认是false,设置为true的时候,组件卸载时,订阅依然有效
    )
    // 同样可以通过调用store.$onAction返回值,即unsubscribe 进行停止订阅
    // unsubscribe() // 手动停止订阅


    return {
      name: computed(() => mainStore.name),
      changeNameHong,
      changeNameMi
    }
  }
}
</script>

5. isError为true的时候,控制台打印:

 6. isError为false的时候,控制台打印:

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue3 Pinia是一个基于Vue3的状态管理库,它提供了类似于Vuex的全局状态管理能力,同时使用起来更加简单方便。下面是Vue3 Pinia的使用步骤: 1. 安装Vue3 Pinia 你可以使用npm或者yarn安装Vue3 Pinia: ``` npm install pinia ``` 或者 ``` yarn add pinia ``` 2. 创建Pinia Store 你需要创建一个store来管理你的状态。一个store就是一个拥有状态和操作状态的对象。下面是一个例子: ``` import { defineStore } from 'pinia' export const useCounterStore = defineStore({ id: 'counter', state: () => ({ count: 0 }), actions: { increment() { this.count++ } } }) ``` 这个例子中,我们创建了一个名为useCounterStore的store,它拥有一个状态count,初始值为0,并且有一个操作increment,用来增加count的值。 3. 在Vue组件中使用Store 你可以在Vue组件中使用createPinia函数创建一个Pinia实例,并通过inject注入到组件中。然后就可以通过store来获取状态和操作状态了。下面是一个例子: ``` <template> <div> <p>{{ count }}</p> <button @click="increment">+1</button> </div> </template> <script> import { defineComponent, inject } from 'vue' import { useCounterStore } from './store' export default defineComponent({ setup() { const store = useCounterStore() const count = computed(() => store.count) const increment = () => { store.increment() } return { count, increment } } }) </script> ``` 这个例子中,我们通过useCounterStore函数来获取useCounterStore实例,并且通过computed函数来获取count的值。然后我们在increment函数中调用store的increment方法。 4. 相关问题: 1. Vue3 Pinia与Vuex有什么区别? 2. 如何在多个组件之间共享状态? 3. Vue3 Pinia如何处理异步操作? 4. Vue3 Pinia如何处理模块化?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Jay丶萧邦

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值