vue3中Pinia的使用之actions

简介: vue3中Pinia的使用之actions

Actions



Actions 相当于组件中的 methods。 它们可以使用 defineStore() 中的 actions 属性定义,并且它们非常适合定义业务逻辑。与它们不同,actions 可以是异步的,您可以在其中await 任何 API 调用甚至其他操作!下面我们用promise来尝试。



// store/index.ts
export const useRegtores = defineStore('register',{
    state() => {
        return{
            registerStatusfalse,
        }
    },
    actions:{
        async registerUser(login, password) {
            const data = await registerUser(login, password);
            this.registerStatus = data;
        },
    }
    
})

// store/index6.ts
export const registerUser = (login: string,password: string) =>{
    return new Promise((resolv,reject)=>{
        setTimeout(() => {
            resolv("registerUser finish!")
        }, 3000);
    })
}

调用 Action 时,一切都会自动推断!Actions 像 methods 一样被调用,例如下面的useRegtore.registerUser();


// App
<script setup>

import { useRegtores } from "@/store";

const useRegtore = useRegtores();

const regisHandle = () => {
  useRegtore.registerUser();
};

</script>
<template>
  <div>数目为:{ { useRegtore.registerStatus }}</
div>
  <button @click="regisHandle">注册</button>
</template>

访问其他 store 操作


与 getters 一样,操作可以通过 this 访问 实例并提供完整类型(和自动完成✨)支持。


订阅 Actions


const unsubscribe = useRegtore.$onAction(
    ({
      name, // action 的名字
      store, // store 实例
      args, // 调用这个 action 的参数
      after, // 在这个 action 执行完毕之后,执行这个函数
      onError, // 在这个 action 抛出异常的时候,执行这个函数
    }) => {
      // 如果 action 成功并且完全运行后,after 将触发。
      // 它将等待任何返回的 promise
      after((result) => {
        console.log("异步成功!")
      })
      // 如果 action 抛出或返回 Promise.reject ,onError 将触发
      onError((error) => {
        console.warn("异步失败!")
      })
    }
  )

当promise reslove时候。订阅回调则会进入after。当promise reject时候。onError。这对于异步请求数据来说是方便的。


export const registerUser = (login: string,password: string) =>{
  
    return new Promise((resolv,reject)=>{
        setTimeout(() => {
            resolv("registerUser finish!")
        }, 3000);
    })
}

订阅 Actions移除


默认情况下,action subscriptions 绑定到添加它们的组件(如果 store 位于组件的 setup() 内)。 意思是,当组件被卸载时,它们将被自动删除。 如果要在卸载组件后保留它们,请将 true 作为第二个参数传递给当前组件的 detach action subscription。


也可以直接手动移除:unsubscribe()


总结


其实看下来会发现,actions 和 getter 能力相差不大。只是在异步中需要它。其他情况如果偏于计算,直接使用 getter 即可。如果偏义务逻辑的放入actions中,就像文章开头就说它们非常适合定义业务逻辑。


相关文章
|
2月前
|
JavaScript 前端开发 安全
Vue 3
Vue 3以组合式API、Proxy响应式系统和全面TypeScript支持,重构前端开发范式。性能优化与生态协同并进,兼顾易用性与工程化,引领Web开发迈向高效、可维护的新纪元。(238字)
573 139
|
2月前
|
缓存 JavaScript 算法
Vue 3性能优化
Vue 3 通过 Proxy 和编译优化提升性能,但仍需遵循最佳实践。合理使用 v-if、key、computed,避免深度监听,利用懒加载与虚拟列表,结合打包优化,方可充分发挥其性能优势。(239字)
268 1
|
3月前
|
开发工具 iOS开发 MacOS
基于Vite7.1+Vue3+Pinia3+ArcoDesign网页版webos后台模板
最新版研发vite7+vue3.5+pinia3+arco-design仿macos/windows风格网页版OS系统Vite-Vue3-WebOS。
435 11
|
2月前
|
JavaScript 安全
vue3使用ts传参教程
Vue 3结合TypeScript实现组件传参,提升类型安全与开发效率。涵盖Props、Emits、v-model双向绑定及useAttrs透传属性,建议明确声明类型,保障代码质量。
305 0
|
4月前
|
缓存 前端开发 大数据
虚拟列表在Vue3中的具体应用场景有哪些?
虚拟列表在 Vue3 中通过仅渲染可视区域内容,显著提升大数据列表性能,适用于 ERP 表格、聊天界面、社交媒体、阅读器、日历及树形结构等场景,结合 `vue-virtual-scroller` 等工具可实现高效滚动与交互体验。
489 1
|
4月前
|
缓存 JavaScript UED
除了循环引用,Vue3还有哪些常见的性能优化技巧?
除了循环引用,Vue3还有哪些常见的性能优化技巧?
293 0
|
5月前
|
JavaScript
vue3循环引用自已实现
当渲染大量数据列表时,使用虚拟列表只渲染可视区域的内容,显著减少 DOM 节点数量。
145 0
5分钟上手Vue+ts+vite+pinia
5分钟上手Vue+ts+vite+pinia
887 0
|
3月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
346 2
|
2月前
|
缓存 JavaScript
vue中的keep-alive问题(2)
vue中的keep-alive问题(2)
320 137