首页 > 其他分享 >Pinia 快速上手运用

Pinia 快速上手运用

时间:2023-03-17 14:24:45浏览次数:38  
标签:name state Pinia import 运用 快速 userInfoStore store useUserInfo

相比于Vuex 4.X而言Pinia可以很好的区分相应的Hooks不必要像Vuex 一样先调用useStore获取我们的Store。

同时去掉了Mutations属性,正常开发中其实这个属性非常鸡肋。

两者相比,明显Pinia更适合Vue3的setup,同时更好兼容TypeScript。


前言:

在使用Pinia前需要使用对应的vue app 安装。

import { createPinia } from 'pinia'// vue app创建流程
app.use(createPinia()); // 安装pinia

 

一、声明一个Store

  

 1 import {defineStore} from 'pinia';
 2   
 3 export const useUserInfo = defineStore('userInfo', {
 4      state: () => ({
 5        name: 'lisi',
 6        age: 18,
 7      }),
 8      getters: {
 9        userName: (state) => state.name,
10        getAuthCode(state) { // 此使用方式将失去本身缓存能力  单纯作函数使用
11           return (id) => [Code];
12        }
13      },
14      actions: {
15        setName(newName) {
16          this.name = newName;
17        }
18     }    
19 }); 

可以看到在我们声明的actions中可以直接调用this.xxx 即可调用到我们的state中声明的属性,相比vuex 4.x 需要调用 commit 还是比较友好的。

建议还是使用actions

同时我们想要清除掉当前的Store可以接收其返回值并调用$reset函数。

<script setup lang="ts">
import { useUserInfo } from './store';

const userInfoStore = useUserInfo();
// 重置状态
userInfoStore.$reset();
// 改变状态
userInfoStore.$patch({name: "张三"}); // 可以传入部分的state属性,会根据传入属性更新state,但是此种修改比较低能。
userInfoStore.$patch((state) => {
  state.name = 'wangwu';
}); // 方便修改和精确调整其接受函数回调提供修改state,因为其属性为响应式的所以可以直接修改。

// 替换整个state userInfoStore.$state = {sex: 1}; // 此方式就可以替换掉当前的store的state </script>

二、调用其他的Store

其实调用其他的store非常简单,可能你已经想到了!没错,就是导入我们声明的useUserInfo;

import {defineStore} from 'pinia';
import { useUserInfo } './store';

export const useUserAuthCode = defineStore('userAuthCodes', {
    state: () => {
      userCodes: [],
    },
    actions: {
      getUserAuthCodeById(state) {
        const userStore = useUserInfo(); // 获取useInfoStore,getters中也是如此使用
        // todo 异步请求
        this.userCodes = []; // 获取到的数据
      }
    }
});

 

三、订阅监听

  (1)State的监听 store.$subscribe(callback, options);

<script steup>
import { useUserInfo } from './store';

const userInfoStore = useUserInfo();

userInfoStore.$subscribe((mutation, state) => {
   // import { MutationType } from 'pinia'
  mutation.type // 'direct' | 'patch object' | 'patch function'
  // 与 userInfoStore.$id 相同
  mutation.storeId // 'cart'
  // 仅适用于 mutation.type === 'patch object'
  mutation.payload // 补丁对象传递给 to userInfoStore.$patch()

 // 做自己需要监听的事情
});
</script>

监听事件默认绑定到当前组件实例上,组件卸载会自动移除,想要保留其状态需要设置它的options = { detatched: true }。

其特点与watch非常类似,但是$subscribe只在 patches 之后触发一次。

 

  (2) 监听actions store.$onActions(callback, boolean);

import { useUserInfo } form './store';

const userInfoStore = useUserInfo();

const unUserInfoSubscribe = userInfoStore.$onAction(({
    name, // action 的名字,
    store, // store 实例
    args, // 调用这个 action 的参数
    after, // 在这个 action 执行完毕之后,执行这个函数
    one rror, // 在这个 action 抛出异常的时候,执行这个函数
}) => {
    // 如果 action 成功并且完全运行后,after 将触发。
    // 它将等待任何返回的 promise

    // 如果 action 抛出或返回 Promise.reject ,onError 将触发

}, true); // 第二位参数标识当前组件卸载后保留状态

unUserInfoSubscribe(); // 卸载监听

监听事件默认绑定到当前组件实例上,组件卸载会自动移除。

 

四、非setup的使用

import { mapState, mapActions } from 'pinia'
import { useUserInfo } from '../store'

export default {
  computed: {
    // state | getters
    // 允许访问组件内的 this.userName
    // 与从 store.userName中读取相同
    ...mapState(useUserInfo , ['userName'])
    // 与上面相同,但将其注册为 this.name
    ...mapState(useUserInfo , {
      name: 'userName',
      // 您还可以编写一个访问 store 的函数
      userAge: store => store.userName,
    })
  },
  methods: {
    ...mapActions(useUserInfo, ['setName']),
    ...mapActions(useUserInfo, {
      setUserName: 'setName',
    }),
  },
};

两个mapXXX都需要两个参数,第一个是我们定义的Store函数,第二个参数可以是数组和对象,数组中声明对应的state或actions中存在key名称,对象则可以声明自定义的key:对应声明的Key。

mapState中对象类型options还可以声明函数,接收一个store可以任意访问state中的参数。大致与vuex 3.x版本差不多。

 

标签:name,state,Pinia,import,运用,快速,userInfoStore,store,useUserInfo
From: https://www.cnblogs.com/lixian001/p/17223783.html

相关文章

  • 全志R128芯片 如何在FreeRTOS下对代码源文件进行快速预处理?
    1.主题FreeRTOS_R128_如何对代码源文件进行快速预处理2.问题背景硬件:R128软件:FreeRTOS客户在日常的开发过程中,会碰到源文件中有许多的宏或许多条件编译的代码,有时候需......
  • 基本算法模板之快速排序
    快速排序1.算法描述从数列中挑出一个元素,称为"基准";重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这......
  • 【Serverless】看完这篇,帮你用认证服务快速实现Twitter统一登录
    【关键字】Java、认证服务、Twitter统一登录 【介绍】AGCAuthSDK在传统登录方式基础上新增了Twitter的统一登录方式,开发者可以在应用中集成Twitter认证方式SDK,让您......
  • (五)博客园美化(风格1):音乐插件等小模块的运用
    空闲的时候自己根据很多大神的美化教程,把自己的博客园简单装修了下。再此整理一下美化方式和步骤,如果喜欢本人博客这种风格,可以参考一下这个系列。一、ForkmeonGitee......
  • 使用Docker快速部署一个Net项目
    前言Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。优点Web应用的自动化打包和发......
  • 微商城系统开发应该运用什么招数?四个招数很管用
     如今想要做微商城系统开发的企业是非常多的,但是要想成功开发微商城,我们还要运用一些招数。那么微商城系统开发应该运用什么招数?今天名锐迅动为大家介绍四个招数很管用。......
  • 【P2109 [NOI2007]】 生成树计数(状压 dp + 矩阵快速幂)
    状压dp+矩阵快速幂优化。感觉题解区几篇题解说得云里雾里的……也没有一定的证明……Link.SolutionPart1dp状态设计发现\(k\)的范围很小,具有很强的指向性——......
  • Git快速入门
    Git快速入门1.版本控制什么是版本控制?版本迭代,新的版本!版本管理器。版本控制(Revisioncontrol)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历......
  • 矩阵快速幂
    矩阵快速幂求自幂题目例:给定A,k,M,求对于指数为i=(1,.....,k-1)的A的幂次和对M取模#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;const......
  • 如何快速生成一个react的前端项目?
     要快速生成一个React前端项目,可以使用脚手架工具来进行创建。最常用的脚手架工具是CreateReactApp。首先,你需要确保在本地已经安装了Node.js和npm(或者yarn)。......