vue3第四十节(pinia的用法注意事项解构store)

pinia 主要包括以下五部分,经常用到的是 store、state、getters、actions

在这里插入图片描述
以下使用说明,注意事项,仅限于 vue3 setup 语法糖中使用,若使用选项式 API 请直接查看官方文档:

一、前言:

pinia 是为了探索 vuex 下一次迭代是要实现那些功能用途,pinia 已实现vuex5 的绝大部分功能;
并且与 Vuex 相比,Pinia 提供了一个更简单的 API,具有更少的规范,提供了 Composition-API 风格的 API,最重要的是,在与 TypeScript 一起使用时具有可靠的类型推断支持;

二、pinia 与vuex <= 4.x 的差异

1、****mutations 不再存在。他们经常被认为是 非常 冗长。他们最初带来了 devtools 集成,但这不再是问题。
**2、**无需创建自定义复杂包装器来支持 TypeScript,所有内容都是类型化的,并且 API 的设计方式尽可能利用 TS 类型推断。
**3、**不再需要注入、导入函数、调用函数、享受自动完成功能
4、****无需动态添加 Store,默认情况下它们都是动态的,您甚至都不会注意到。请注意,您仍然可以随时手动使用 Store 进行注册,但因为它是自动的,您无需担心。
**5、**不再有 modules 的嵌套结构。您仍然可以通过在另一个 Store 中导入和 使用 来隐式嵌套 Store,但 Pinia 通过设计提供平面结构,同时仍然支持 Store 之间的交叉组合方式。 您甚至可以拥有 Store 的循环依赖关系。
**6、**没有 命名空间模块。鉴于 Store 的扁平架构,“命名空间” Store 是其定义方式所固有的,您可以说所有 Store 都是命名空间的。

三、store:

store:它持有未绑定到您的组件树的状态和业务逻辑托管全局状态
像一个始终存在并且每个人都可以读取和写入的组件;
主要有三个方法:state、getters、actions,类似于组件中数据、计算属性、方法
用于存储不同组件直接共享的数据实例方法,以及页面之间需要保留的数据状态;

// count.ts 文件
<script lang="ts">
import { defineStore } from 'pinia'
// defineStore 的第一个参数是 唯一标识ID 用于关联 devtool 调试使用
// 第二个参数是 一个对象 包含 state、actions,gettes
// 声明的 属性useCount  建议以 use 开头,保持书写的统一性
export const useCount = defineStore('count', {
    state:() => {
        return{

        }
    },
    actions: {},
    gettes: {}
})
</script>

在组件中使用:
注意:若 解构使用 store 中的属性 方法,需要使用 storeToRefs() 或者 toRefs() 让其保持响应式

<script setup>
    import { toRefs } from 'vue'
    import { storeToRefs } from 'pinia'
    import { useCount } from '@/store'
    const count = useCount()
    // 这样解构获取 store 中属性方法,会丢失响应式
    const { num } = count
    // 1、使用 pinia自带的storeToRefs(), 将store中属性转换为 ref 数据以保持响应式
    const { doubleCountAdd } = storeToRefs(count)
    console.log('=doubleCountAdd==', doubleCountAdd)
    // 2、使用vue3 的 toRefs() 转化为 ref 响应式数据
    const { doubleCount }  = toRefs(count)
    console.log('=doubleCount==', doubleCount)
</script>

四、state:

state: 类似组件中的 data(){return{}},但是在 pinia 中的state 建议书写为:
使用箭头函数,用于完整推断类型

state: () => {
    return {
        name: 'Andy',
        num: 0
    }
}

组件中使用:

<script setup lang='ts'>
    import { useCount } from '@/store'
    const count = useCount()
    // 1、直接调用或者修改
    console.log(count.name)
    // 2、通过$patch({}) 同时修改多个属性
    count.$patch({
        name: '刺客',
        num++
    })
    // 或者传入一个回调函数
    count.$patch((state) => {
        state.count = '4'
    })
</script>

五、actions:
actions 类似组件中的methods,可以在组件中直接调用里面的方法

// count.ts 文件
<script lang="ts">
export const useCount = defineStore('count', {
    state: () => {
        return{
            name: 'Andy',
            num: 0
        }
    },
    actions: {
        add() {
            // 直接通过 this 调用 state 中的属性,也可以调用其他 store 中属性,只需引入即可
            this.num++
        },

    },
})
</script>

组件中可以直接通过 调用 add() 方法来修改 num

<script setup>
    import { useCount } from '@/store'
    const count = useCount()
    count.add() 
</script>

六、gettes:

相当于组件中的 computed 计算属性:

// count.ts 文件
<script lang='ts'>
import { defineStore } from 'pinia'
export const useCount = defineStore('count', {
    state: () => {
        return{
            name: 'Andy',
            num: 0
        }
    },
    getters: {
        // 相当于组件中的 计算属性
        doubleCount(state): number {
            return  state.num * 2
        },
        doubleCountAdd():number {
            // 可以在其他 getter 中直接调用另一个getter
            return this.doubleCount + 1
        },
        // 接收额外参数时,需要返回一个函数处理
        doubleCountAdd2:(state) => {
            return (num:number):number => state.num * num
        } 
    }
})
</script>

在组件中可以直接使用

<script setup>
import { useCount } from '@/store'
const count = useCount()
console.log(count.doubleCountAdd)
count.$patch({
    name: '刺客',
    num: 3
})

const doubleCountAdd2 = count.doubleCountAdd2(8)
 // 上面state.num 值为 3, 传入 额外参数 为8,故最后为  3* 8 = 24
</script>

完整代码如下:

// count.ts 文件
import { defineStore } from 'pinia'
// 通过 defineStore 定义的 store 第一个参数 count 是唯一的id,用于链接devtool
// 定义 一个id 为count的 store 

export const useCount = defineStore('count', {
    state: () => {
        return{
            name: 'Andy',
            num: 0
        }
    },
    actions: {
        add() {
            this.num++
        },

    },
    // getter 只会依赖状态
    getters: {
        // 相当于组件中的 计算属性
        doubleCount(state): number {
            return  state.num * 2
        },
        doubleCountAdd():number {
            // 可以在其他 getter 中直接调用另一个getter
            return this.doubleCount + 1
        },
        // 接收额外参数,返回一个函数处理
        doubleCountAdd2:(state) => {
            return (num:number):number => state.num * num
        } 
    },
    // 若不需要额外配置,
    // persist: true,
    // 额外配置
    persist: {
        // key: 'piniaStore', //存储名称
        // storage: sessionStorage, // 存储方式 默认存储在localStorage
        // paths: ['name'], //指定 state 中哪些数据需要被持久化。[] 表示不持久化任何状态,undefined 或 null 表示持久化整个 state
    }
})

请添加图片描述

// main.ts 文件
import { createApp } from 'vue'
import { createPinia } from 'pinia'
const app = createApp(App)
const pinia = createPinia()
//导入pinia 持久化 插件
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
pinia.use(piniaPluginPersistedstate)
app.use(pinia)
app.mount('#app')

// 单文件组件 myPinia/index.vue 文件中使用

<template>
  <div class="myPinia">
    This is a text demo of the pinia.
    <hr>
    <div>count.num: {{ count.num }}</div>
    <div>count.doubleCount: {{ count.doubleCount }}</div>
    <div>count.doubleCountAdd: {{ count.doubleCountAdd }}</div>
    <div>num: {{ num }}</div>
    <div>doubleCountAdd: {{ doubleCountAdd }}</div>
    <div>doubleCount: {{ doubleCount }}</div>
    <div>doubleCountAdd2: <span>{{ doubleCountAdd2 }}</span></div>

    <button @click="count.add()">add</button>
  </div>
</template>

<script setup>
import { toRefs } from 'vue'
import { storeToRefs } from 'pinia'
import { useCount } from '@/store'
const count = useCount()
console.log('==count==', count)
// 解构获取 store 中属性方法,不是响应式
const { num } = count
// 1、使用 pinia自带的storeToRefs(), 将store中属性转换为 ref 数据以保持响应式
const { doubleCountAdd } = storeToRefs(count)
console.log('=doubleCountAdd==', doubleCountAdd)
// 2、使用vue3 的 toRefs() 转化为 ref 响应式数据
const { doubleCount }  = toRefs(count)
console.log('=doubleCount==', doubleCount)
// 通过 $patch 修改state 中多个属性
count.$patch({
      name: '刺客',
      num: 3
  })
  // 传入额外参数
  const doubleCountAdd2 = count.doubleCountAdd2(8) // 上面state.num 值为 3, 传入 额外参数 为8,故最后为  3* 8 = 24
</script>

<style lang="scss" scoped>

div{
  font-size: 18px;
  color: #333;
  span {
    color: red;
  }
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/721413.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

04-对原生app应用中的元素进行定位

本文介绍对于安卓原生app应用中的元素如何进行定位。 一、uiautomatorviewer uiautomatorviewer是Android-SDK自带的一个元素定位工具&#xff0c;非常简单好用&#xff0c;可以使用该工具查看app应用中的元素属性&#xff0c;帮助我们在代码中进行元素定位。 1&#xff09;使…

Win11版本21H2怎么升级为23H2?升级详细步骤在此!

在Win11电脑操作中&#xff0c;用户目前使用的版本是21H2&#xff0c;现在想体验23H2版本的先进功能&#xff0c;但不知道要怎么操作才能将系统版本升级为23H2&#xff1f;接下来小编给大家介绍详细的升级方法步骤&#xff0c;助力大家轻松完成系统版本升级操作。 方法一&#…

VirtualStudio配置QT开发环境

环境 VirtualStudio2022Qt5.12.10 安装msvc工具链&#xff08;这一步不是必须的&#xff09; 打开virtual studio&#xff0c;打开Virtual Studio Installer界面选择要安装的msvc版本&#xff0c;点击安装 安装VirtualStudio扩展 在线安装 打开virtual Studio&#xff0c;…

ps2024磨皮滤镜插件Portraiture升级版下载-Portraiture2024软件最新版下载附加安装步骤

不少小伙伴在制作了照片后都会通过一些形式进行美化解决&#xff0c;今日小编就给大家详细介绍一款非常不错的专用工具&#xff0c;它是Corel PaintShop Pro 2024 手机软件&#xff0c;此软件为消费者提供了技术专业完备的视频后期制作作用&#xff0c;能够让消费者轻轻松松将为…

批量创建文件夹 就是这么简单 一招创建1000+文件夹

批量创建文件夹 就是这么简单 一招创建1000文件夹 在工作中&#xff0c;或者生活中&#xff0c;我们经常要用到批量创建文件夹&#xff0c;并且根据不同的工作需求&#xff0c;要求是不一样的&#xff0c;比如有些人需要创建上千个不一样名称的文件夹&#xff0c;如果靠手动创…

Nature发文介绍使用ChatGPT帮助学术写作的三种方式

文章链接&#xff1a;https://www.nature.com/articles/d41586-024-01042-3 一、介绍 这篇文章是由Dritjon Gruda撰写的&#xff0c;讨论了生成性人工智能&#xff08;AI&#xff09;在学术写作、编辑和同行评审中的三种应用方式。Gruda认为&#xff0c;尽管学术界对聊天机器…

大多数JAVA程序员都干不到35岁吗?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「java的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 很遗憾是的&#xff0c;对…

UDP的组播发送与接收C语言测试和nc接收组播测试

组播这个东西&#xff0c;很多年前用过一次。本身的原理不复杂&#xff0c;未知的是使用的环境&#xff0c;受使用环境的影响有多大&#xff0c;还是那句废话&#xff0c;具体问题具体分析。 发送端代码multicast.c #include <stdio.h> #include <stdlib.h> #…

MySQL常见面试题自测

文章目录 MySQL基础架构一、说说 MySQL 的架构&#xff1f;二、一条 SQL语句在MySQL中的执行过程 MySQL存储引擎一、MySQL 提供了哪些存储引擎&#xff1f;二、MySQL 存储引擎架构了解吗&#xff1f;三、MyISAM 和 InnoDB 的区别&#xff1f; MySQL 事务一、何谓事务&#xff1…

从老花眼开始

三年前&#xff0c;博主的的火眼金睛开始老花了&#xff0c;表现就是看近处看不清了。人眼对可视距离的标准可以定义为&#xff1a;看手机为近距离&#xff0c;看电脑为中距离&#xff0c;看电视为中距离&#xff0c;看红绿灯为远距离。老花眼就是戴近视眼镜直接看手机看不清了…

苍穹外卖---导入接口文档

一、前后端分离开发流程 第一步&#xff1a;定义接口&#xff0c;确定接口的路径、请求方式、传入参数、返回参数。 第二步&#xff1a;前端开发人员和后端开发人员并行开发&#xff0c;同时&#xff0c;也可自测。 第三步&#xff1a;前后端人员进行连调测试。 第四步&…

嵌入式中间件_3.嵌入式中间件的一般架构

根据嵌入式中间件的不同类型和其应用对象的不同&#xff0c;其架构也有所不同&#xff0c;通常嵌入式中间件没有统一的架构&#xff0c;这里仅仅列举两种中间件架构。 1.消息中间件 1.1消息中间件原理架构 消息中间件是消息传输过程中保存消息的一种容器。它将消息从它的源中…

一文学会消息中间件的基础知识

什么是消息队列 队列数据结构 我们都学习过数据结构与算法相关的内容,消息队列从数据结构来看,就是一个由链表或是数组构成的一个先进先出的数据容器。由链表实现还是数组实现都没关系,它只要满足数据项是先进先出的特点,那么就可以认为它是一个队列结构。队列是只允许在…

使用Notes客户机高效工作

大家好&#xff0c;才是真的好。 年纪越大&#xff0c;发现每天时间越不够用。突然想到一个好办法&#xff0c;找相关书看&#xff0c;学习一下高效工作和生活管理。 刚好&#xff0c;就看到一本《每天节省2小时》&#xff0c;2013年出版&#xff0c;作者是肯尼斯齐格勒。其中…

JupyterLab使用指南(四):JupyterLab的Magic 命令

1. 什么是 Magic 命令 Magic 命令是 JupyterLab 中的一类特殊命令&#xff0c;用于简化和增强代码的执行。它们以 % 或 %% 开头&#xff0c;可以进行各种操作&#xff0c;如时间测量、环境设置、文件操作等。Magic 命令分为行 Magic 命令和单元 Magic 命令两种。 行 Magic 命…

Hi3861 OpenHarmony嵌入式应用入门--中断按键

本篇讲解gpio的中断使用方式。 硬件原理图如下&#xff0c;与上一篇一样的电路 GPIO API API名称 说明 hi_u32 hi_gpio_init(hi_void); GPIO模块初始化 hi_u32 hi_io_set_pull(hi_io_name id, hi_io_pull val); 设置某个IO上下拉功能。 hi_u32 hi_gpio_set_dir(hi_gpio_…

QT day4(对话框 事件机制)

1&#xff1a;思维导图 2&#xff1a; #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);ui->setupUi(this);//去除头部this->setWindowFlag(Qt::Frameles…

找单身狗2

找单身狗2 之前遇到类似的题目的思路&#xff1a; 首先写出这些数的二进制形式&#xff1a; 核心原理 接下来的问题是怎么把5和6分开来&#xff1f; 这里是最后一位进行比较&#xff0c;按位异或是相同为0&#xff0c;相异为1&#xff0c;最后一位从上图看出是1&#xff0c;说…

go 语言爬虫库goQuery 的详细使用(知乎日报详情页解析示例)

上一篇《uniapp小程序开发 | 从零实现一款影视类app 》实现了影视小程序的前端和后台接口&#xff0c;虽然包含了大多数小程序应有的知识&#xff0c;但基本还只是涉及网络接口和vue页面的设计。这里介绍下零一个有趣的练手项目&#xff0c;知乎日报。涉及详情页面的html解析&a…

python是TIOBE编程语言排名第一的编程语言,它有什么优点?它的使用场景有哪些?用python打印数字1--100,用python打印九九乘法表怎么写?

Python是TIOBE编程语言排行榜排名第一的编程语言 。 python是一种解释性、交互式、面向对象的跨平台的语言。 python设计者及名称由来 Guido van Rossum 荷兰人---吉多范罗苏姆&#xff0c;是 Python 编程语言的最初设计者&#xff0c;在 Python 社区一直担当终身仁慈独裁者&…