vue3pinia

【pinia源码】二、defineStore源码解析 【pinia源码】系列文章主要分析pinia的实现原理。本篇文章将分析defineStore的实现。 阅读详情


目录是store
Store 包含了状态(state)、获取器(getters)和操作(actions),相当于组件中的: data、 computed 和 methods。
Store是一个保存:状态、业务逻辑 的实体,每个组件都可以读取、写入它。

一.pinia的理解及其搭配pinia环境

理解:
pinia:符合直觉的vue.js状态管理库/集中式状态(数据)管理
组件之间需要共享的数据可以放在pinial里
搭配环境:
第一步:npm install pinia
第二步:操作src/main.ts

import { createApp } from 'vue'
import App from './App.vue'

/* 引入createPinia,用于创建pinia */
import { createPinia } from 'pinia'

/* 创建pinia */
const pinia = createPinia()
const app = createApp(App)

/* 使用插件 */{}
app.use(pinia)
app.mount('#app')

二.使用

创建store
引入并使用defineStore()函数定义Store
store/count.ts
命名一般是usexxxStore

// 引入defineStore用于创建store
import {defineStore} from 'pinia'
// 定义并暴露一个store
export const useTalkStore = defineStore('talk',{
  // 动作
  actions:{},
  // 状态
  state(){
    return {
      talkList:[
        {id:'yuysada01',content:'你今天有点怪,哪里怪?怪好看的!'},
     		{id:'yuysada02',content:'草莓、蓝莓、蔓越莓,你想我了没?'},
        {id:'yuysada03',content:'心里给你留了一块地,我的死心塌地'}
      ]
    }
  },
  // 计算
  getters:{}
})

组件使用store

<template>
	<ul>
    <li v-for="talk in talkStore.talkList" :key="talk.id">
      {{ talk.content }}
    </li>
  </ul>
</template>

<script setup lang="ts" name="Count">
  import axios from 'axios'
  import {useTalkStore} from '@/store/talk'
  const talkStore = useTalkStore()
</script>

二.修改数据(三种方式)

1.第一种修改方式,直接修改

countStore.sum = 666
2.第二种修改方式:批量修改

countStore.$patch({
sum:999,
school:‘atguigu’
})
3.第三种修改方式:借助action修改(action中可以编写一些业务逻辑)

import { defineStore } from 'pinia'

export const useCountStore = defineStore('count', {
  /*************/
  actions: {
    //加
    increment(value:number) {
      if (this.sum < 10) {
        //操作countStore中的sum
        this.sum += value
      }
    },
    //减
    decrement(value:number){
      if(this.sum > 1){
        this.sum -= value
      }
    }
  }
})

组件中调用action即可

// 使用countStore
const countStore = useCountStore()

// 调用对应action
countStore.incrementOdd(n.value)

三.storeToRefs

作用:借助storeToRefs将store中的数据转为ref对象,方便在模板中使用。
注意:pinia提供的storeToRefs只会将数据做转换,而Vue的toRefs会转换store中数据。

<template>
	<div class="count">
		<h2>当前求和为:{{sum}}</h2>
	</div>
</template>

<script setup lang="ts" name="Count">
  import { useCountStore } from '@/store/count'
  /* 引入storeToRefs */
  import { storeToRefs } from 'pinia'

  /* 得到countStore */
  const countStore = useCountStore()
  /* 使用storeToRefs转换countStore,随后解构 */
  const {sum} = storeToRefs(countStore)
</script>

四.getters

当state中的数据,需要经过处理后再使用时,可以使用getters配置。
使用:

// 引入defineStore用于创建store
import {defineStore} from 'pinia'

// 定义并暴露一个store
export const useCountStore = defineStore('count',{
  // 动作
  actions:{
    /************/
  },
  // 状态
  state(){
    return {
      sum:1,
      school:'atguigu'
    }
  },
  // 计算
  getters:{
    bigSum:(state):number => state.sum *10,
    upperSchool():string{
      return this. school.toUpperCase()
    }
  }
})

五.$subscribe

通过 store 的 $subscribe() 方法侦听 state 及其变化
使用:

talkStore.$subscribe((mutate,state)=>{
  console.log('LoveTalk',mutate,state)
  localStorage.setItem('talk',JSON.stringify(talkList.value))
})

六.store组合式写法

defineStore函数中对象变成了箭头函数
nanoid可用来获取一个id

import {defineStore} from 'pinia'
import axios from 'axios'
import {nanoid} from 'nanoid'
import {reactive} from 'vue'

export const useTalkStore = defineStore('talk',()=>{
  // talkList就是state
  const talkList = reactive(
    JSON.parse(localStorage.getItem('talkList') as string) || []
  )
  // getATalk函数相当于action
  async function getATalk(){
    // 发请求,下面这行的写法是:连续解构赋值+重命名
    let {data:{content:title}} = await axios.get('https://api.uomg.com/api/rand.qinghua?format=json')
    // 把请求回来的字符串,包装成一个对象
    let obj = {id:nanoid(),title}
    // 放到数组中
    talkList.unshift(obj)
  }
  return {talkList,getATalk}
})
前端|Vue Vue3中使用Pinia,保姆级教程 在状态管理中,"store"是一个全局对象,用来保存和管理应用的状态。在Pinia中,store是响应式的,这意味着当store中的状态改变时,依赖这些状态的组件会自动更新。每个Pinia store都是一个独立的实体,包含其自己的状态、getters和actions。在store中定义state,可以将它看作是组件的data选项。return {count: 0getters是store的计算属性,用来派生出一些状态。 阅读详情

相关推荐

Vue3 状态管理 - Pinia

Pinia 是 Vue 专属的最新状态管理库 ,是 Vuex 状态管理工具的替代品。

m0_61925586的博客 3285

Pinia(二)了解和使用Store

store通过函数定义store.接收两个参数id: 唯一的标识,string类型.Pinia使用id与开发者工具建立联系.第二个参数可以是一个函数, 也可以是一个对象.返回一个函数, 一般约定将返回值命名为use....第二个参数: 对象类型如果要传入对象类型作为第二个参数, 在对象中可以配置state: 状态, 即数据. 📕注意state是一个函数, 函数的返回值才是真正定义的数据getters: 计算属性actions: 修改状态的方法return {...

broken_promise的博客 1万+

vue3使用 Pinia及 Pinia数据持久化存储

src目录下新建store文件夹,创建user.ts文件并写入Store 是用 defineStore() 定义的,它的第一个参数要求是一个独一无二的名字,defineStore() 的第二个参数可接受两类值:Setup 函数或 Option 对象。state 属性: 用来存储全局的状态的,这里边定义的,就可以是为SPA里全局的状态了。getters属性:用来监视或者说是计算状态的变化的,有缓存的功能。actions属性:对state里数据变化的业务逻辑,需求不同,编写逻辑不同。

JavaScritp 1928

Vue中pinia的defineStore函数

【代码】Vue中pinia的defineStore函数。

conquer_galaxy的博客 2671

Nexus3国内高速下载指南:多版本全平台资源汇总

本文针对国内开发者从官网下载Nexus 3速度慢、易失败的问题,提供了详尽的解决方案。汇总了Windows、Linux、macOS等多个平台的Nexus 3历史及最新版本(如3.31.1)的国内高速下载链接,并附有版本选择建议与Linux环境下的快速启动指南,帮助用户高效获取和部署这一流行的仓库管理工具。

jwt8token的博客 432

从机械到数字:EC11旋转编码器与ESP32的PWM控制艺术

本文详细解析了EC11旋转编码器与ESP32的PWM控制技术,探讨了如何将机械旋转动作转换为精确的数字信号控制。通过硬件连接、信号处理和软件优化等实践技巧,开发者可以构建高效的人机交互系统,适用于智能照明、电机控制等多种应用场景。

android的专栏 785

【vue3】基础知识点-pinia

vue3基础知识点-pinia

花椒和蕊的博客 2806

单细胞数据导入实战:Read10X函数常见报错与解决方案

本文针对单细胞转录组分析中Read10X函数数据导入的常见问题,提供了详细的实战解决方案。重点解析了因文件路径错误、压缩文件未解压、版本命名不符及内存不足导致的报错,并给出了检查路径、正确解压、重命名文件、调整参数及优化内存等具体操作步骤,帮助用户高效完成单细胞数据导入,为后续分析奠定坚实基础。

weixin_28235513的博客 238

【Vue3(八)】

实现如下效果:创建两个组件,在App.vue里引入</</setup nameimportfrom;importfrom;</</计算组件Count.vue。

m0_46123285的博客 2859

在 Windows 上使用 Anaconda 创建 配置 YOLOv8虚拟环境,并更改 pip 源以及以 可编辑模式 安装ultralytics

前往 NVIDIA cuDNN 下载页面,下载与您安装的 CUDA 版本匹配的 cuDNN 版本。:根据您的系统和 CUDA 版本,选择适当的 whl 文件。如下12.7,表示最高可装12.7版本CUDA,与上图中的支持的最高cuda版本一致。,无需重新安装,从而大幅提升开发效率,适用于项目开发、调试或依赖本地未发布的版本时使用,但需确保当前目录包含。:访问 NVIDIA 官方网站,下载与您的显卡和操作系统兼容的 CUDA 版本。首先,确保NVIDIA 显卡支持 CUDA,并安装相应版本的驱动程序。

weixin_44115575的博客 1893

关于DEJA_VU3D - Cesium功能集专栏说明

专栏主要目的是对工作中基于Cesium实现过的功能进行整合,暂时打算一周2-3更的样子来更新,每一篇都会奉上完整源代码(尽可能把代码简洁一些)。功能实现大多数是自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小130个左右的功能,后续也会不断的更新。..........................................

总得学点什么的博客 2万+

Vue3 小菠萝 Pinia使用

Pinia是Vue的存储库,它允许您跨组件/页面共享状态。Pinia的成功可以归功于他管理存储数据的独特功能,例如可扩展性、存储模块组织、状态变化分组、多存储创建等。

“跟他人学,和自己比” 1万+

uniapp [安卓苹果App端] - 实现判断并开启消息通知/提示权限,监测通知权限未开启时弹框提示用户并引导用户跳转至设置界面,uniApp检查通知权限+提示是否打开+点击跳转设置(详细示例代码)

uni-app判断有无通知权限,并进行设置,设置手机通知权限,开启通知权限,uni-app解决权限问题,uniapp 拉起授权(拒绝后重新开启权限)uniApp打包的手机app如果用户没开启通知权限、引导用户开启,uni-app动态打开应用通知权限,拒绝后跳转设置页面,uniapp获取通知栏权限,苹果ios系统打开通知权限,被拒绝怎么办,uniapp安卓判断通知权限,uniapp打包的APP引导用户打开手机通知权限,uniapp权限被拒绝,跳转手机设置页面 权限设置,IOS应用内跳转系统设置,uni-app

🏆 前端领域优质创作者 1万+

【Vue3】走进Pinia,学习Pinia,使用Pinia

Pinia是一个专为Vue 3设计的集中式状态(数据)管理库,它提供了一种简单而强大的方式来管理应用程序的状态。Pinia的设计理念是尽可能地与Vue的响应式系统集成,以提供最佳的性能和开发体验Pinia是一个强大而灵活的Vue状态管理库,它提供了一种简单而优雅的方式来管理应用程序的状态。通过利用Pinia,我们可以更好地组织和管理我们的Vue应用程序,并确保其具有良好的性能和可维护性。如果您正在寻找一种新的状态管理库,不妨试试Pinia,相信它会给您带来惊喜!

null18的博客 1447

【01】Python解释器的安装

工欲善其事必先利其器。君欲学PYthon,则必先安装Python解释器。安装过程相对简单,大致跟着如下步骤走即可。

侯小啾技术博客 1258

(五)C++自制植物大战僵尸游戏LoadingScene的实现讲解

游戏启动后就会立即切换到游戏加载场景中。只有游戏资源文件加载完成后,才能进入游戏。Loadingscene类继承Cocos2d-x中的Scene父类,表明Loadingscene是一个场景类。切换到LoadingScene场景中,首先会创建该场景,会调用函数,在该函数中调用自己定义的方法实现指定功能。代码文件的位置如下图所示。

尔灵尔亿的博客 2006

vue3中pinia的使用

getters 类似于 vue 里面的计算属性,可以对已有的数据进行修饰。在 vuex 里面是坚决不允许这样子直接操作 state 数据的,pinia是可以的,看看上面的addCount函数直接操作。注意:返回的函数统一使用useXXX作为命名方案,这是约定的规矩。第三种方法:$state 方式(这个是替换的方式。**第一种方法:**点击按钮修改数据,这种方法是最直接的修改数据。在actions定义了两个函数一个加一的函数,一个加20的函数。这样就在counter模块拿到了user模块的数据了。

gcyaozuodashen的博客 3815

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

vue3中如何使用pinia -- pinia使用教程(一)

pinia 是一个 Vue3 的状态管理库,它的 API 设计和 Vuex 有很大的相似之处,但是它的实现方式和 Vuex 完全不同,它是基于 Vue3 的新特性。这种方案,也不好,要是组件挂载多次,就会创建多个 store,这个 store 也不会被销毁,但是可以手动销毁的 API。上面的 useCounter 使用选项式 api 创建,pinia 也支持组合式 api, 这和 vue3 的组合式函数非常贴近,使用上更加简单。使用一个工厂函数,组件每次挂载,都会执行工厂函数,返回一个新的 store。

JackZhouMine 2014

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Vue3中使用pinia_vue3 pinia

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】就答题情况而言,第一问100%都可以回答正确,第二问大概只有50%正确率,第三问能回答正确的就不多了,第四问再正确就非常非常少了。其实此题并没有太多刁钻匪夷所思的用法,都是一些可能会遇到的场景,而大多数人但凡有1年到2年的工作经验都应该完全正确才对。只能说有一些人太急躁太轻视了,希望大家通过此文了解js一些特性。

2401_84447149的博客 1126

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Vue3、Vite、Pinia基础学习

Vue3、Vite、Pinia基础学习,本次学习是跟着邓瑞编程b站视频进行学习的。

qq_63898506的博客 1999

vue3的pinia(大菠萝)

vue3的pinia(大菠萝)

longyan_tianyu的博客 1万+

Vue3 状态管理之 Pinia 的使用

Vue3 新的发展方向(来源于尤大知乎) Vue 3 将在 2022 年 2 月 7 日 成为新的默认版本 基于 Vite 的极速构建工具链 <script setup> 带来的开发体验更丝滑的组合式 API 语法 Volar 提供的单文件组件 TypeScript IDE 支持 vue-tsc 提供的针对单文件组件的命令行类型检查和生成 Pinia 提供的更简洁的状态管理 新的开发者工具扩展,同时支持 Vue 2/Vue 3,并且提供一个插件系统来允许社区库自行..

FOR.GET 3万+

Vue3搭建pinia环境

在Vue 3中,Pinia 是 Vuex 的后续状态管理库,旨在提供 Vuex 5 中相似的功能,但具有更简洁的API、更好的TypeScript支持和模块热重载(HMR)等特性。

weixin_73060959的博客 1495

vue3中Pinia

Pinia 是 Vue 官方推荐的轻量级状态管理库,专为 Vue 3 设计,具有以下核心特点:采用扁平化 Store 架构,无需模块嵌套;直接通过 actions 修改状态,省去 Mutation 步骤;原生支持 TypeScript,提供完整类型推断;体积仅 1KB,性能优于 Vuex。与 Vuex 相比,Pinia 减少了 40% 样板代码,状态修改流程更简洁(组件→Action→State),模块化设计更直观。其原理基于 Vue 响应式系统,通过 reactive() 实现状态响应式,并利用 prov

GXY1551705593的博客 1099

Vue3中使用pinia

在Vue 3中使用Pinia,您需要按照以下步骤进行设置:在上面的示例中,我们使用Pinia来创建了一个名为"counter"的存储,并在组件中使用来访问该存储。通过在组件中使用setup()函数,我们可以将存储中的状态和操作绑定到组件的模板中。这就是在Vue 3中使用Pinia的基本流程。您可以根据自己的需要创建和配置更多的存储,并在组件中使用它们。

一步一个脚印,踏实努力,向着目标前进 739

Vue3之Pinia

Pinia作为Vue 3的状态管理库,以其轻量级、易用性和灵活性,逐渐成为了Vue开发者的新选择。通过本文的介绍,相信你已经对Pinia有了更深入的了解,并能够将其应用到自己的Vue项目中。Pinia不仅提供了强大的状态管理功能,还与Vue 3的组合式API无缝集成,使得状态管理代码更加清晰和模块化。

一个老Java开发的自白 2324
上一篇: vue3路由
下一篇: vue3组件通信(一)
ldd_eb
博客等级 码龄3年 509粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值