Pinia入门学习之实现简单的用户状态管理

目录
  • Store是什么?
  • Store的应用场景?
  • pinia是什么?
    • 其他优点
  • 应用示例
    • 定义Store
    • 使用Store
    • 获取store的响应式数据
    • State
      • 初始化
      • 读取和写入state
      • 订阅state变化
    • Getters
      • 定义getter
      • 访问getter
    • Actions
      • 定义action
      • 订阅action
  • 总结

Store是什么?

全局状态,用于在所有组件中,同步数据。

Store的应用场景?

在整个应用程序中访问的数据(且不需要被持久化),例如导航栏中显示的用户信息,以及需要通过页面保留的数据,例如一个非常复杂的多步骤表格。

pinia是什么?

简单一句介绍,vuex的升级版,抛弃了烦人的Mutation。

其他优点

  • action支持同步和异步;
  • 良好的TypeScript支持;
  • 支持用插件扩展功能;
  • 扁平架构,没有嵌套;
  • 服务端渲染支持。

应用示例

下面我们以一个管理平台的员工账号信息为例,展示Pinia的使用方式。

本文作者认为setup是更好的组织代码的方式,所以都用setup编写下面的示例。

安装和挂载部分,直接看文档

定义Store

import { defineStore } from 'pinia'

// 第一个参数是应用程序中 store 的唯一 id
export const useUserStore = defineStore('user', {
  // other options...
})

使用Store

import { useUserStore } from '@/stores/user'

export default {
  setup() {
    const userStore = useUserStore()

    return {
      // 您可以返回整个 store 实例以在模板中使用它
      userStore,
    }
  },
}

(如果习惯用选项式API,还是可以配合map helpers,声明各种map来访问store。)

获取store的响应式数据

直接解构会破坏响应式,需要用storeToRefs()提取属性并保持响应式。

import { storeToRefs } from 'pinia'

export default defineComponent({
  setup() {
    const userStore = useUserStore()
    //  这不起作用,因为它会破坏响应式
    // 这和从 props 解构是一样的
    const { userName } = userStore

    // 这样可以保持响应式
    const { userId } = storeToRefs(userStore)

    userName // "lucio"
    userId // "001"

    return {
      // 一直会是 "lucio"
      userName,
      // 这将是响应式的
      userId,
      // 这将是响应式的
      realUserName: computed(() => userStore.userName),
      }
  },
})

State

返回初始状态的函数。

我们补全一下上面的定义Store部分的代码。

初始化

import { defineStore } from 'pinia'

// 第一个参数是应用程序中 store 的唯一 id
export const useUserStore = defineStore('user', {
  state: () => {
    return {
      // 所有这些属性都将自动推断其类型
      userName: 'lucio',
      userId: '001',
    }
  },
})

读取和写入state

  • 通过store示例,可读写。
const userStore = useUserStore()
userStore.userId = '002'
userStore.$reset()
return { userStore }
  • 通过$patch修改多个数据,参数可以是对象或者函数。
// 一次修改多个数据
userStore.$patch({
  userId: '002',
  userName: 'lucy',
})
// 适合对数组进行修改
userStore.$patch((state) => {
  state.roles.push({ name: 'admin', priority: 1 })
})
  • 替换整个state
userStore.$state = { userId: '002', userName: 'lucy'}
// 或者通过pinia实例替换整个应用程序的状态
pinia.state.value = {}

订阅state变化

可以通过 store 的 $subscribe() 方法查看状态及其变化,其只在patch之后触发一次。

默认情况下,组件卸载后,订阅会被删除。如果想保留,设置配置项detached为true。

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

  // 每当它发生变化时,将整个状态持久化到本地存储
  localStorage.setItem('user', JSON.stringify(state))
	},
	{ detached: true }, // detached为true,卸载组件后保留订阅
)

Getters

返回状态的计算值

定义getter

import { defineStore } from 'pinia'

// 第一个参数是应用程序中 store 的唯一 id
export const useUserStore = defineStore('user', {
  state: () => {
    return {
      // 所有这些属性都将自动推断其类型
      userName: 'lucio',
      userId: '001',
    }
  },
  getters: {
    // 自动推断返回类型为字符串
    userText: (state) => `User: ${state.userName}`,
    // 也可以使用其他getter, 用this访问store实例,必须要定义返回类型
    userTextPlus: (): string => `The name of ${this.userText}`,
  }
})

访问getter

直接用store的实例访问。

userStore.userText

(getters也可以传递参数,不是很常用的场景,这里就不示例了。)

(在A store中,也可以使用B store的getter)

Actions

相当于组件中的methods,适合用于定义组件的业务逻辑。

定义action

下面我们继续补全上面的示例,在userStore中通过网络请求获取用户数据。

import { defineStore } from 'pinia'

export const useUserStore = defineStore('user', {
  state: () => {
    return {
      userName: 'lucio',
      userId: '001',
      userData: null,
    }
  },
  getters: {
    // ...
  },
  actions: {
  	async loginAndGetUserInfo(password) {
  		try {
  			this.userData = await api.login({password});
  			showToast('Login success');
  		} catch(error) {
  			showToast(error);
  			return error;
  		}
  	}
  }
})

订阅action

可以使用 store.$onAction() 订阅 action 及其结果。

下面对userStore添加一个订阅,记录上面的登陆操作,所用的时间

const unsubscribe = userStore.$onAction(
  ({
    name, // action 的名字
    store, // store 实例
    args, // 调用这个 action 的参数
    after, // 在这个 action 执行完毕之后,执行这个函数
    onError, // 在这个 action 抛出异常的时候,执行这个函数
  }) => {
    // 记录开始的时间变量
    const startTime = Date.now()
    // 这将在 `store` 上的操作执行之前触发
    console.log(`Start "${name}" with params [${args.join(', ')}].`)

    // 如果 action 成功并且完全运行后,after 将触发。
    // 它将等待任何返回的 promise
    after((result) => {
      console.log(
        `Finished "${name}" after ${
          Date.now() - startTime
        }ms.\nResult: ${result}.`
      )
    })

    // 如果 action 抛出或返回 Promise.reject ,onError 将触发
    onError((error) => {
      console.warn(
        `Failed "${name}" after ${Date.now() - startTime}ms.\nError: ${error}.`
      )
    })
  }
)

// 手动移除订阅
unsubscribe()

和订阅state一样,组件卸载时,订阅将被删除,可以添加设置第二个参数detach为true,在卸载组件后仍然保留订阅。

export default {
  setup() {
    const someStore = useSomeStore()

    // 此订阅将在组件卸载后保留
    someStore.$onAction(callback, true)

    // ...
  },
}

总结

到此这篇关于Pinia入门学习之实现简单的用户状态管理的文章就介绍到这了,更多相关Pinia用户状态管理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Vue状态管理之使用Pinia代替Vuex

    目录 1.Pinia是什么 2.Pinia简单上手 3.使用体验 1.Pinia是什么 Pinia是一个vue的状态管理方案,是vuex团队成员开发,实现了很多vuex5的提案,更加地轻量化且有devtools的支持 vuex4一直被人诟病对于typescript的支持不良好,vuex5也迟迟未来 所以有了pinia的出现 相较于vuex: pinia无需创建复杂的包装器来支持typescript,对于typescript类型判断是天然支持的,享受ide带来的自动补全,减少开发的心智负担,减少v

  • Vue新一代状态管理工具Pinia的具体使用

    目录 前言 优点 安装 创建并挂载 创建store 使用store 回显与修改state 使用$patch对多条数据直接修改 使用actions 使用getters 多个store相互调用 数据持久化 安装 使用 总结 前言 Pinia是尤雨溪强烈推荐的一款Vue状态管理工具,也被认为是下一代Vuex的替代产品. 优点 去除了mutations,只有 state,getters和actions,其中actions支持了同步和异步操作 不会像Vuex那样有模块嵌套,Pinia只有store的概念,

  • vue中使用 pinia 全局状态管理的实现

    目录 与vuex的区别 安装 引入pinia 创建状态目录 pinia模块组成 创建pinia模块 在组件中使用该状态机 pinia模块实例中的api讲解 状态持久化 与vuex的区别 去除了 mutation 选项.省去了复杂的disptach和commit流程,直接通过模块实例调用实例的actions中的方法即可触发对应action:在组件中直接可以通过模块实例的$patch修改store状态或者通过action来间接修改store状态.响应式数据原理是proxy,使得数据的增加或者删除字段

  • Vue新的状态管理库Pinia入门教程

    目录 前沿 使用教程 1.安装 2.vue中引入 3.基本使用 4.也可以像vuex一样使用 为什么最近Pinia会火起来呢,主要在于Vue3推出来的时候,Vuex对于Vue3的组合式Api支持的不是特别好,也就是在这个时候Pinia出现了. 前沿 Vue官方推荐的状态管理库是Vuex,那为什么最近Pinia会火起来呢,主要在于Vue3推出来的时候,Vuex对于Vue3的组合式Api支持的不是特别好,也就是在这个时候Pinia出现了,最重要的是,Pinia不但支持Vue3,同时还支持Vue2,这

  • Vue状态管理库Pinia详细介绍

    目录 什么是 Pinia 如何使用 Pinia 认识 Store 定义一个store 使用 store 操作 State Getters 1. 认识和定义 Getters 2. 访问 Getters 认识和定义 Action 什么是 Pinia Pinia (西班牙语中的菠萝),本质上依然是一个状态管理的库,用于跨组件.页面进行状态共享. pinia 与 vuex 的区别: 更友好的TypeScript支持,Vuex之前对TS的支持很不友好 与 Vuex 相比,Pinia 提供了一个更简单的 A

  • Vue3状态管理之Pinia的入门使用教程

    目录 Vue3 新的发展方向(来源于尤大知乎) 一.Pinia 简介与基础 1.1 Pinia 简介 1.2 Pinia 基础 二.Pinia 在Vue3-Vite中的使用 2.1 基础使用流程 2.2 state 中数据的解构访问 2.3 state 中数据的修改方式(actions和组件中) 2.4 getters 的使用 三.Pinia 数据持久化 总结 Vue3 新的发展方向(来源于尤大知乎) Vue 3 将在 2022 年 2 月 7 日 成为新的默认版本 基于 Vite 的极速构建工

  • Pinia入门学习之实现简单的用户状态管理

    目录 Store是什么? Store的应用场景? pinia是什么? 其他优点 应用示例 定义Store 使用Store 获取store的响应式数据 State 初始化 读取和写入state 订阅state变化 Getters 定义getter 访问getter Actions 定义action 订阅action 总结 Store是什么? 全局状态,用于在所有组件中,同步数据. Store的应用场景? 在整个应用程序中访问的数据(且不需要被持久化),例如导航栏中显示的用户信息,以及需要通过页面保

  • asp.net微信开发(用户分组管理)

    上一篇已讲解到新建用户分组,移动用户到分组的功能,这一章主要讲解修改分组名称和删除分组 直接上代码,废话不多说,获取分组列表需要用到的实体类 /// <summary> /// 微信分组类 /// </summary> public class WxGroupsInfo { public string Group_ID { get; set; }//分组编号 public string Group_Name { get; set; }//分组名称 public string Gro

  • JSP自定义标签入门学习

    本文为大家分享了JSP自定义标签入门学习教程,希望大家喜欢. 1.JSP自定义标签: 自定义标签是用户定义的JSP语言元素.当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时Web container调用那些操作.JSP标签扩展可以让你创建新的标签并且可以直接插入到一个JSP页面. JSP 2.0规范中引入Simple Tag Handlers来编写这些自定义标记.你可以继承SimpleTagSupport类

  • MyBatis入门学习教程-MyBatis快速入门

    目录 Mybatis 一.快速开始 1.创建 Maven 项目 2.导入 Maven 依赖 3.配置 Maven 插件 4.新建数据库,导入表格 5.编写 Mybatis 配置文件 6.编写实体类 7.编写 mapper 接口 8.编写 mapper 实现 9.Mybatis 配置文件中,添加 mapper 映射 10.编写 Mybatis 工具类 11.测试 二.日志添加 1.添加 Maven 依赖 2.添加 log4j 配置 3.Mybatis 中配置 LOG 4.执行测试 三.Mybati

  • Python入门学习Python流处理过程

    目录 Faust是一个流处理库 将kafka流中的思想移植到Python中 agent是一个async def的函数,因此它还可以异步执行其他操作 使用Kafka topic作为"预写日志" Faust支持任何类型的流数据 Faust是静态类型的 Faust简介 高可用性 分布式的 快速 灵活性 安装 绑定 下载并从源文件中安装 使用开发版本 常见问题 Faust是一个流处理库 将kafka流中的思想移植到Python中 它被用于Robinhood去构建高性能的分布式系统和实时数据通道

  • Python入门学习之Python流处理过程

    目录 Faust简介 高可用性 分布式的 快速 灵活性 安装 绑定 下载并从源文件中安装 使用开发版本 常见问题 Faust是一个流处理库,将kafka流中的思想移植到Python中 它被用于Robinhood去构建高性能的分布式系统和实时数据通道,每天处理数十亿的数据. Faust同时提供流处理和事件处理同类型的工具分享例如:Kafka Streams, Apache Spark/Storm/Samza/Flink 它不需要使用一个DSL,仅需要用到Python!这意味着你在做流处理的时候可以

  • PHP入门学习之字符串操作

    目录 字符串简介 单引号和双引号的区别 字符串的连接符 去除字符串首尾空格和特殊字符 1.trim()函数 2.Itrim()函数 3.rtrim()函数 转义.还原字符串数据 1.手动转义.还原字符串数据 2.自动转义.还原字符串数据 字符串简介 字符串是指由零个或多个字符构成的一个集合,这里所说的字符主要包含以下几种类型: 数字类型,如1.2.3等. 字母类型,如a.b.c.d等. 特殊字符,如#.$.%.^.&等. 不可见字符,如\n(换行符).\r(回车符).\t(Tab字符)等. 其中

  • Qt入门学习之数据库操作指南

    目录 一.数据库 1.数据库驱动 2.查询驱动 3.连接数据库 4.执行sql语句 5.插入数据 6.事务 二 ,sql模型类 1.QSqlQueryModel模型 2.QSqlTableModel模型 3.QSqlRelationalTableModel模型 总结 一.数据库 Qt中的Qt SQL模块提供了对数据库的支持,模块中类可分为三层:驱动层,sql接口层,用户层. 驱动层:(QSqlDriver,QSqlDriverCreator,QSqlDriverCreatorBase,QSqlD

  • mybatis框架入门学习教程

    MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. 1.创建工程,导入jar包 创建一个java工程或者web工程都可以,然后导入mybatis的jar包和依赖包还有数据库的jar包,本人使用Oracle10g数据库

  • python基础入门学习笔记(Python环境搭建)

    Python学习第一篇.把之前学习的Python基础知识总结一下. 一.认识Python 首先我们得清楚这个:Python这个名字是从Monty Python借鉴过来的,而不是源于大家所知道的大蟒蛇的意思.我们为什么要学习Python呢?就我而言,我知道豆瓣在使用.重视Python,加上我想学习网页爬虫技术,所以,我要学习Python编程.另外在国外,Yahoo和Google都在使用Python.那么,Python就很值得我们认真学习. 二.Hello,World! 首先我们需要安装Python

随机推荐