vue3:pinia 的 Actions , getters, pinia 实例上的 API

vue3:pinia 的 Actions , getters, pinia 实例上的 API

编程文章jaq1232025-05-04 14:37:2212A+A-

原文:「链接」

vx提问:

1. Actions 基础用法

新建 store/index.ts

store/index.ts


import { defineStore } from "pinia";
type User = {
    name: string,
    age: number
}
let  result:User = {
    name:"xm",
    age:18
}
export const useTestStore = defineStore("TEST", {
    state: () => {
        return {
            current:100,
            user: {},
            name: "xm"
        }
    },
    //computed 修饰一些值
    getters: {
    },
    //methods 可以做同步异步都可以做 提交state
    actions: {
        setCurrent(num: number) {
            this.current = num + this.current
        },
        serUser(){
            this.user = result
        }
    }
})

1.1 定义了变量 result,类型指定为 User

1.2 actions 定义了 serUser 方法,修改 state 内user的 数据

2. 使用

<template>
    <div>
      <h4>vue3:userActios+getters 组合使用</h4>
      <p>actions-user :{{ test.user }}</p>
      <hr>
      <p>actions-name  :{{ test.name }}</p>
      <hr />
      <p>getters:</p>
      <hr>
      <el-button type="primary" @click="change1">change</el-button>
    </div>
  </template>
  <script setup lang="ts">
  import { useTestStore } from "../../store";
  import { storeToRefs } from "pinia";
  let test = useTestStore();






  const change1 = () => {
    test.serUser();
  };
  </script>
  <style scoped lang="less"></style>

2.1 使用的时候调用了 actions 里面的 serUser 函数

3. 异步调用

store/index.ts
import { defineStore } from "pinia";
import { Name } from "./store-name";
type User = {
    name: string,
    age: number
}
let  result:User = {
    name:"xm",
    age:18
}
const Login = ():Promise<User> =>{
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve({
                name:"异步修改",
                age:99
            })
        }, 1000);
    })
}
export const useTestStore = defineStore("TEST", {
    state: () => {
        return {
            current:100,
            user: {},
            name: "xm"
        }
    },
    //computed 修饰一些值
    getters: {
    },
    //methods 可以做同步异步都可以做 提交state
    actions: {
        setCurrent(num: number) {
            this.current = num + this.current
        },
        async serUser(){
            const result = await Login();
            // 修改user数据
            this.user = result;
            // 修改name
            this.setName("伙头智多星")
        },
        setName(name:string){
            this.name = name
        }
    }
})

3.1 Login定义一个异步函数,两秒钟后修改 name ,age 的数据

3.2 serUser 通过 async await 调用 Login,修改 state 内 user 对象的数据 。

修改 name 为 异步修改

修改 age 为 99

3.3 serUser() 里面可以调用 setName ,修改 state 内的name 为 "伙头智多星"

3.4 actions里面定义的函数可以互相调用,不能使用箭头函数,否则无法使用this

4. 使用请看 步骤2 《2. 使用》

5. getters 基础用法

import { defineStore } from "pinia";
import { Name } from "./store-name";
type User = {
    name: string,
    age: number
}
let  result:User = {
    name:"xm",
    age:18
}
const Login = ():Promise<User> =>{
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve({
                name:"异步修改",
                age:99
            })
        }, 1000);
    })
}
export const useTestStore = defineStore("TEST", {
    state: () => {
        return {
            current:100,
            user: <User>{},
            name: "xm"
        }
    },
    //computed 修饰一些值
    getters: {
        // 获取name
        newName():string {
            return `$-${this.name}-${this.getUserAge}`
        },
        // 获取user的age
        getUserAge():number { 
            return this.user.age
        }
    },
    //methods 可以做同步异步都可以做 提交state
    actions: {
        setCurrent(num: number) {
            this.current = num + this.current
        },
        async serUser(){
            const result = await Login();
            // 修改user数据
            this.user = result;
            // 修改name数据
            this.setName("伙头智多星")
        },
        // 修改name数据
        setName(name:string){
            this.name = name
        }
    }
})

5.1 getters 内定义了 newName 和 getUserAge 函数

newName :返回state内name的数据

getUserAge : 返回state内 user 的age数据

5.2 getters 里面定义的函数可以互相调用,不能使用箭头函数,否则无法使用this

6. pinia 实例上的 API

// 调用pinia 的 reset 方法,重置 state 的数据为初始值
    test.$reset();
    


//   监听pinia 的数据变化
test.$subscribe((args,state) => {
    console.log("pinia 数据变化了args:",args);
    console.log("pinia 数据变化了state:",state);
});    
    


// 监听 pinia 的action
test.$onAction((args)=>{
    console.log("pinia 的actions执行了:",args);
    // action 方法里面声明的函数执行完成后触发
    args.after(()=>{
        console.log("pinia 的actions执行完成");
    })
    // action 方法里面声明的函数的‘参数’
    args.args
    // action 方法里面声明的函数的‘名称’
    args.name
    // 捕获 action 方法的错误
    args.onError(()=>{
        console.log("捕获 action 方法的错误");
    })
    // pinia 的实例
    args.store
},true) // 监听所有action销毁时,是否取消监听pinia的action


    

原文:「链接」

vx提问:

点击这里复制本文地址 以上内容由jaq123整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

苍茫编程网 © All Rights Reserved.  蜀ICP备2024111239号-21