pinia学习笔记(1.0)

news2024/11/20 21:18:44

  首先贴出官网地址:开始 | Pinia

pinia作为Vue3项目中常用的状态管理工具,正逐渐取代vuex,现从0到1自己搭建pinia仓库。

首先,安装pinia,使用包管理器工具(npm,pnpm,yarn,Bun等都可以)

安装成功后,就会在package.json中找到

然后就是在入口文件中使用(我是用的是vite创建的项目,所以入口文件就是main.ts):

创建pinia实例并使用,相关的创建代码中,移到了Store文件夹中。

具体内容如下:
 

import {createPinia} from 'pinia'

//创建大仓库

let pinia=createPinia()


//导出仓库
export default pinia;

然后需要在入口文件中使用:
 

这样就建立了一个空的仓库 ,然后我们还需要定义一个Store,在Vuex中对应的state,getter,action中,都会在Store中进行定义。

定义Store是用defineStore函数定义的

然后我自己新建一个空文件testStore.ts

内容如下:

import { defineStore } from "pinia";

let useTestStore=defineStore("test",{
    state:()=>{
        return {
            name:"test",
            count:10
        }
    },
   getters: {
    doubleCount: (state) => state.count * 2,
  },
  actions: {
    increment() {
      this.count++
    },
  },
})

export default useTestStore;

这里需要注意几个点:首先,定义Store一般需要以use开头,第一个参数是你的应用中 Store 的唯一 ID。第二个参数就是仓库的配置项,state 是 store 的数据 (data),getters 是 store 的计算属性 (computed),而 actions 则是方法 (methods)。上面的写法是选项式写法,写过vuex的可能会对此写法更加的熟悉,但是pinia还有另一种组合式写法,习惯使用组合式API的可能更喜欢这种写法。

将上面的代码转换成组合式写法(setup)

import { defineStore } from "pinia";
import { ref,computed } from "vue";
let useTestStore=defineStore("test",()=>{
    const count=ref(10)
    const name=ref('test')

    const doubleCount=computed(()=>count.value*2)

    //注意,action中的方法不要写成箭头函数
    function increment() {
        count.value++;
    }

    return {
        count,
        name,
        doubleCount,
        increment
    }
})

export default useTestStore;

在组合式写法中,state中的属性需要使用ref定义,getters中的计算属性就直接使用computed()进行使用即可,而actions则在下面直接进行函数(普通函数)定义即可。

这样我们的仓库就定义好了,我们需要再组件中进行使用。

这里是再项目中使用了路由,所以需要根据指定路径进行跳转,在控制台中,我们可以看到打印的信息,我们就可以直接使用插值语法直接渲染在页面中。

 

然后使用按钮修改count的值,看对应的getter和action中定义的方法。

 

全部代码如下:

<template>
 <div>
  {{ testStore.name }}---{{ testStore.count }}
  <el-button type="primary" size="default" @click="handler">点我修改count</el-button>
  
 </div>
</template>

<script setup lang="ts">
import {ref,reactive} from 'vue'
import useTestStore from '../../store/testStore';


const testStore = useTestStore()

console.log(testStore);

const handler=()=>[
    testStore.increment(),
    
    console.log(testStore.doubleCount)
]
</script>

<style scoped lang="scss">

</style>

 这样我们就使用了仓库中的方法和计算属性,以及仓库中存储的state。当然了,同步和异步的方法都可以直接写在仓库中,因为pinia中没有mutation,所以一个action中可以书写同步和异步的方法,大大简化了状态更新流程。

当然了仓库,可以建立多个,我们可以建立多个ts文件来创建不同功能的Store,用到的时候需要那个仓库就进行引入即可。

还有就是Store可以嵌套,就是在定义一个Store时,可以使用领一个Store中的数据,代码演示如下:

/*
 * @Author: RealRoad
 * @Date: 2024-10-14 15:50:02
 * @LastEditors: Do not edit
 * @LastEditTime: 2024-10-14 16:00:44
 * @Description: 
 * @FilePath: \project_10_08\vite-project\src\store\testStore.ts
 */
import { defineStore } from "pinia";
import { ref,computed } from "vue";
let useTest2Store=defineStore("test2",()=>{
    const count=ref(10)
    const name=ref('test')
    const huawei=ref('遥遥领先')

    const doubleCount=computed(()=>count.value*2)

    //注意,action中的方法不要写成箭头函数
    function increment() {
        count.value++;
    }

    return {
        count,
        name,
        doubleCount,
        increment,
        huawei
    }
})

export default useTest2Store;

注意,这里的仓库名不要和领一个仓库名重名!!!

仓库定义如下:

/*
 * @Author: RealRoad
 * @Date: 2024-10-14 15:50:02
 * @LastEditors: Do not edit
 * @LastEditTime: 2024-10-14 16:00:44
 * @Description: 
 * @FilePath: \project_10_08\vite-project\src\store\testStore.ts
 */
import { defineStore } from "pinia";
import { ref,computed } from "vue";
import useTest2Store from "./testStore2";
let useTestStore=defineStore("test",()=>{
    const count=ref(10)
    const name=ref('test')
    const iphone=useTest2Store()

    const doubleCount=computed(()=>count.value*2)

    //注意,action中的方法不要写成箭头函数
    function increment() {
        count.value++;
    }

    return {
        count,
        name,
        doubleCount,
        increment,
        iphone:iphone.huawei
    }
})

export default useTestStore;

界面直接使用:

 给pinia添加插件

就是在定义大仓库导出大仓库之前进行插件定义,然后使用pinia实例进行使用该插件,就相当于默认给pinia添加了一些属性和方法,这样,无论是哪个Store,都可以直接使用这些插件。

那么pinia实例的定义如下:

import {createPinia} from 'pinia'

//创建大仓库
//创建时给pinia仓库一个默认的属性值
function piniaPlugin(){
    return {default:'Hello MEZ!!'}
}
let pinia=createPinia()
pinia.use(piniaPlugin)

//导出仓库
export default pinia;

然后我们在使用仓库的时候,就可以直接使用。

虽然ts爆红,但是不影响使用

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QGIS如何在正射影像中获得绘制线段的长度信息||QGIS如何获取绘制点的经纬度(如何生成WKT属性)并且导出为CSV文件

QGIS如何在正射影像中获得绘制线段的长度信息 前置条件&#xff1a; 导入正射影像和绘制完需要计算长度的绘制线段后 1.检查菜单栏是否有数据处理&#xff08;processing&#xff09;按键&#xff0c;如果没有的话请根据以下链接打开processing工具箱&#xff1a;https://bl…

微服务架构 --- Nacos的项目实战操作

目录 一.什么是Nacos&#xff1f; 二.什么是注册中心&#xff1f; 1.注册中心的定义&#xff1a; 2.为什么需要使用注册中心&#xff1f; 3.注册中心原理&#xff1a; 三.Nacos的使用&#xff1a; 1.安装与启动Nacos&#xff1a; 2.集成 Nacos 服务注册与发现&#xff…

邀你一起共建谷歌封号申诉共享库

大家好&#xff0c;我是牢鹅&#xff01;相信很多老粉是通过谷歌封号的三篇文章《聊聊「谷歌8.3」账号封禁解析与应对思路 》和《聊聊谷歌「高风险」封号问题解析与应对思路》、《聊聊这半年来&#xff0c;谷歌为何频繁封号&#xff1f;》关注牢鹅的&#xff0c;在这将近半年的…

架构设计笔记-13-层次式架构设计理论与实践

目录 知识要点 综合知识 案例分析 1.SSM框架 2.MVC模式&#xff0c;XML 3.MVC架构脆弱性 4.容器技术的优势 5.对象关系映射ORM技术 知识要点 一般来说&#xff0c;架构可以分为表现层、中间层和持久层三个层次。 表现层&#xff1a;表现层主要负责接收用户的请求&…

【论文翻译】TITAN:用于交通流量预测的异构专家混合模型

题目A TIME SERIES IS WORTH FIVE EXPERTS: HETEROGENEOUS MIXTURE OF EXPERTS FOR TRAFFIC FLOW PREDICTION论文链接https://arxiv.org/pdf/2409.17440源码地址https://github.com/sqlcow/TITAN&#xff08;作者说论文被接受后&#xff0c;代码将更新&#xff09; 摘要 准确的…

API项目4:开发SDK

面临另一个问题 作为开发者&#xff0c;每次调用接口都需要自己生成时间戳&#xff0c;编写签名算法&#xff0c;生成随机数等等&#xff0c;这些都是相当繁琐的工作。 因此&#xff0c;要想办法让开发者能够以最简单的方式调用接口。开发者只需要关心传递哪些参数以及他们的…

如何通过计算巢在阿里云一键部署FlowiseAI

什么是FlowiseAI FlowiseAI 是一个开源的低代码开发工具&#xff0c;专为开发者构建定制的语言学习模型&#xff08;LLM&#xff09;应用而设计。 通过其拖放式界面&#xff0c;用户可以轻松创建和管理AI驱动的交互式应用&#xff0c;如聊天机器人和数据分析工具。 它基于Lang…

网站分享 | 六个插件搜索下载网站

网站分享&#xff1a; 今天分享几个搜索插件的网站。 &#x1f527; Chrome Web Store —— 官方插件库&#xff0c;选择最多 谷歌官方的 Chrome 插件商店&#xff0c;拥有丰富的插件供你选择。无论你是办公党、学生党&#xff0c;还是娱乐爱好者&#xff0c;这里都能找到提…

第 4 章:Vue 中的 ajax

1. 解决开发环境 Ajax 跨域问题 vue脚手架配置代理 原理图&#xff1a; 1.1 方法一 在vue.config.js中添加如下配置&#xff1a; devServer:{proxy:"http://localhost:5000" // 这个5000 是请求目标的端口号 }说明&#xff1a; 优点&#xff1a;配置简单&…

杰理AC632N---发射功率问题

AC632N的发射功率SDK默认0dbm左右&#xff0c;在实际做产品时&#xff0c;如果使用SDK默认的发射功率&#xff0c;则测试到的发射功率达不到规格书上面的8dbm. 查看代码流程发现SDK中修改发射功率的文职如下&#xff1a; 修改到level 10 则是最大功率8dbm , 使用频谱仪可以测得…

OpenAI 最新发布的 o1 模型在 ARC-AGI-Pub 数据集上的测试结果与分析

在过去的24小时内&#xff0c;我们有幸获得了 OpenAI 新发布的 o1-preview 和 o1-mini 模型的使用权限。这些模型经过特别训练&#xff0c;旨在模拟推理过程&#xff0c;并在给出最终答案之前给予更多时间生成和修正推理步骤。 成百上千的人都在问&#xff0c;o1 在 ARC 奖项上…

linux线程 | 线程的控制(一)

前言&#xff1a;本节内容为线程的控制。在本篇文章中&#xff0c; 博主不仅将会带友友们认识接口&#xff0c; 使用接口。 而且也会剖析底层&#xff0c;带领友友们理解线程的底层原理。 相信友友们学完本节内容&#xff0c; 一定会对线程的控制有一个很好的把握。 那么&#…

Gin框架官方文档详解03:HTML渲染

官方文档&#xff1a;https://gin-gonic.com/zh-cn/docs/ 注&#xff1a;强烈建议没用过Gin的读者先阅读第一节&#xff1a;第一个Gin应用。 目录 一、简单渲染二、使用不同目录下名称相同的模板三、自定义模板渲染器四、自定义分隔符五、自定义模板函数六、总结 一、简单渲染 …

数通--5

一、链路聚合 背景&#xff1a;带宽不够&#xff0c;加线&#xff0c;但是stp判断是环路&#xff0c;阻塞&#xff0c;等于没加线。通过链路聚合解决&#xff08;如果我把千兆换成万兆&#xff0c;老子有钱任性的话&#xff0c;没得说&#xff09; 现在我要的不是备份而是带宽…

电能表预付费系统-标准传输规范(STS)(4)

5.4 TokenCarrier 到 MeterApplicationProcess 的数据流 The flow of data from the TokenCarrier to the MeterApplicationProcess is shown in Figure 4.此数据流见图 4。 图 4 TokenCarrier 到 MeterApplicationProcess 的数据 The token entry process from the TokenCarr…

抢单超卖? 并发问题解决思路

1. 问题介绍 在用户抢单或者商品售卖的过程中&#xff0c;正常情况下是一人一件&#xff0c;但是当网络流量剧增时多个用户同时抢到一个商品应该如何分配&#xff1f;假设这样一个场景A商品库存是100个&#xff0c;但是秒杀的过程中&#xff0c;一共卖出去500个A商品。对于卖家…

AXI GPIO按键控制——ZYNQ学习笔记4

一、AXI GPIO接口简介 是什么&#xff1f;是PL部分的一个IP软核&#xff0c;实现通用输入输出接口的功能&#xff0c;并通过AXI协议实现与处理系统通信&#xff0c;方便控制与拓展GPIO接口。 AXI GPIO IP 核为 AXI 接口提供了一个通用的输入/输出接口。 与 PS 端的 GPIO 不同&…

【YOLO系列】YOLO11原理和深入解析——待完善

文章目录 前言一、主要新增特性二、主要改进2.1 C3K2网络结构2.2 C2PSA网络结构2.3 Head部分 三、对比与性能优势四、X-AnyLabeling4.1 目标检测&#xff1a;4.2 实例分割&#xff1a;4.3 图像分类&#xff1a;4.4 姿态估计&#xff1a;4.5 旋转目标检测&#xff1a; 五、总结 …

Vue+Vant实现7天日历展示,并在切换日期时实时变换

效果图&#xff1a; 主要使用 moment.js 插件完成 HTML部分 <div class"day-content"><div class"day-content-t"><div>{{ monthVal }}</div><div click"onCalendar()">更多>></div></div><…

HTTP vs WebSocket

本文将对比介绍HTTP 和 WebSocket &#xff01; 相关文章&#xff1a; 1.HTTP 详解 2.WebSocket 详解 一、HTTP&#xff1a;请求/响应的主流协议 HTTP&#xff08;超文本传输协议&#xff09;是用于发送和接收网页数据的标准协议。它最早于1991年由Tim Berners-Lee提出来&…