Vue - pinia

news2025/1/31 5:18:02

Pinia 是 Vue 3 的官方状态管理库,旨在替代 Vuex,提供更简单的 API 和更好的 TypeScript 支持。Pinia 的设计遵循了组合式 API 的理念,能够很好地与 Vue 3 的功能结合使用。

Pinia 的基本概念

  • Store: Pinia 中的核心概念,类似于 Vuex 中的 Store。它是一个用于管理状态的中心地点。
  • State: 存储的数据,可以在多个组件之间共享。
  • Getters: 类似于计算属性,用于从状态派生出新的信息。
  • Actions: 用于包含逻辑的方法,可以用于修改状态或处理异步操作。

步骤一:下载 pinia :

npm install pinia
// 或者
pnpm install pinia

步骤二:设置 pinia :

步骤三:创建 store 文件夹

// person.ts 船舰一个新的 store

import { defineStore } from "pinia";

export const usePersonStore = defineStore('person', {
    // 真正存储数据的地方
    state() {
        return {
            sum:20
        }
    }
})
import axios from "axios";
import { nanoid } from "nanoid";
import { defineStore } from "pinia";

export const useTalkStore = defineStore('talk', {
    actions: {
        async getATalk() {
            // 发送请求
            const res = await axios.get('https://api.uomg.com/api/rand.qinghua?format=json')
            // 把请求回来的字符串,包装成一个对象
            // pnpm i nanoid 自动生成id
            const obj = { id: nanoid(), title: res.data.content }
            // 放入数组当中
            this.talkList.unshift(obj);
      }  
    },
    // 真正存储数据的地方
    state() {
        return {
            talkList: [
                { id: '001', title: '星期一' },
                { id: '002', title: '星期二' },
                { id: '003', title: '星期三' },
            ]
        }
    }
})

 

步骤四:使用 store  (存储和读取数据)

// Person.vue  使用 pinia 前

<template>
    <div class="person">
       <h2>当前求和为:{
  
  {sum}}</h2>
       <select v-model.number="n">
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
       </select>
       <button @click="changeSum1">加</button>
       <button @click="changeSum2">减</button>
    </div>

    
</template>
    
<script setup lang='ts' >
import { ref } from 'vue'

const sum = ref(1);
// 选择的数字
const n = ref(1);

const changeSum1 = ()=>{
    sum.value += n.value;
}
const changeSum2 = ()=>{
    sum.value -= n.value;
}

</script>
<style scoped>

</style>
// Person.vue 使用 pinia 后
<template>
    <div class="person">
       <h2>当前求和为:{
  
  {personStore.sum}}</h2>
       <select v-model.number="n">
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
       </select>
       <button @click="changeSum1">加</button>
       <button @click="changeSum2">减</button>
    </div>

    
</template>
    
<script setup lang='ts' >
import { ref } from 'vue'
import { usePersonStore } from '../store/person'

const personStore = usePersonStore();
// 以下两种方式都可以拿到state中的数据
// console.log('@',personStore.sum);
// console.log('@@@',personStore.$state.sum);

// 选择的数字
const n = ref(1);

// const changeSum1 = ()=>{
// }
// const changeSum2 = ()=>{
// }

</script>
<style scoped>

</style>
// Talk.vue 使用 pinia 前
<template>
    <div class="talk">
        <button @click="getTalk">获取一句话</button>
        <ul>
            <li v-for="talk in talkList" :key="talk.id">
                {
  
  {talk.title}}
            </li>
        </ul>
    </div>
</template>
    
<script setup lang='ts'>
import axios from 'axios';
import { nanoid } from 'nanoid';
import { reactive } from 'vue';

const talkList = reactive([
    { id: '001', title: '星期一' },
    { id: '002', title: '星期二' },
    { id: '003', title: '星期三' },

]);
const getTalk = async () => {
    // 简单写法:连续解构赋值 + 重命名
    // const {data:{content:title}} = await axios.get('https://api.uomg.com/api/rand/qinghua?format=json')
    // const obj = { id: nanoid(), title };
     // 发送请求
    const res = await axios.get('https://api.uomg.com/api/rand.qinghua?format=json')
    // 把请求回来的字符串,包装成一个对象
    // pnpm i nanoid 自动生成id
    const obj = { id: nanoid(), title: res.data.content }
    // 放入数组当中
    talkList.unshift(obj);
}
</script>
    
<style>
    
</style>
<template>
    <div class="talk">
        <button @click="getTalk">获取一句话</button>
        <ul>
            <li v-for="talk in talkStore.talkList" :key="talk.id">
                {
  
  {talk.title}}
            </li>
        </ul>
    </div>
</template>
    
<script setup lang='ts'>

import { useTalkStore } from '../store/talk';
// import { storeToRefs } from 'pinia';

const talkStore = useTalkStore();

// const { talkList } = storeToRefs(talkStore)

// 与 watch 类似
talkStore.$subscribe((mutate,state) => {
    console.log('talkStore 里面保存的数据发生了变化',mutate,state);
    
})
const getTalk=() => {
    talkStore.getATalk();
}

</script>
    
<style>
    
</style>

步骤五:修改数据(三种方式)

// person.ts

import { defineStore } from "pinia";

export const usePersonStore = defineStore('person', {
    // 真正存储数据的地方
    state() {
        return {
            sum: 20,
            name: '8520',
            age:20
        }
    },
    // actions 里面放的是一个个方法,用于响应组件中的“动作”
    actions:{
        increment(value){
            console.log('increment 被调用了', value);
            // 修改数据(this 是当前的 store)
            this.sum += value;
        }
    },
    getters: {
        // 可以对数据进行加工
        bigSum(state) {
            return state.sum * 10;
        },
        // 也可以被解构 调用
    }
})
<template>
    <div class="person">
       <h2>当前求和为:{
  
  {personStore.sum}}</h2>
       <h2>姓名:{
  
  {personStore.name}},年龄:{
  
  {personStore.age}}</h2>
       <select v-model.number="n">
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
       </select>
       <button @click="changeSum1">加</button>
       <button @click="changeSum2">减</button>
    </div>

    
</template>
    
<script setup lang='ts' >
import { ref } from 'vue'
// 引入 usePersonStore
import { usePersonStore } from '../store/person'
import { storeToRefs } from 'pinia';

// 使用 usePersonStore ,得到一个专门保存 person 相关的 store
const personStore = usePersonStore();

// storeToRefs 只会关注 store 中的数据,不会对方法进行 ref 包裹
const { sum, name, age, bigSum } = storeToRefs(personStore)

// 选择的数字
const n = ref(1);

// 加
const changeSum1 = () => {
    // 第一种修改方式
    // personStore.sum += n.value;

    // 第二种修改方式 批量修改
    // personStore.$patch({
    //     sum: 858,
    //     name: '5632',
    //     age:55
    // })

    // 第三种修改方式 利用 actions
    personStore.increment(n.value)

}
// 减
const changeSum2 = () => {
    personStore.sum -= n.value;
}
</script>

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

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

相关文章

JxBrowser 7.41.7 版本发布啦!

JxBrowser 7.41.7 版本发布啦&#xff01; • 已更新 #Chromium 至更新版本 • 实施了多项质量改进 &#x1f517; 点击此处了解更多详情。 &#x1f193; 获取 30 天免费试用。

亚博microros小车-原生ubuntu支持系列:17 gmapping

前置依赖 先看下亚博官网的介绍 Gmapping简介 gmapping只适用于单帧二维激光点数小于1440的点&#xff0c;如果单帧激光点数大于1440&#xff0c;那么就会出【[mapping-4] process has died】 这样的问题。 Gmapping是基于滤波SLAM框架的常用开源SLAM算法。 Gmapping基于RBp…

Python 变量和简单数据类型思维导图_2025-01-30

变量和简单数据类型思维导图 下载链接腾讯云盘&#xff1a; https://share.weiyun.com/15A8hrTs

小麦重测序-文献精读107

Whole-genome sequencing of diverse wheat accessions uncovers genetic changes during modern breeding in China and the United States 中国和美国现代育种过程中小麦不同种质的全基因组测序揭示遗传变化 大豆重测序-文献精读53_gmsw17-CSDN博客 大豆重测序二&#xff…

Django基础之ORM

一.前言 上一节简单的讲了一下orm&#xff0c;主要还是做个了解&#xff0c;这一节将和大家介绍更加细致的orm&#xff0c;以及他们的用法&#xff0c;到最后再和大家说一下cookie和session&#xff0c;就结束了全部的django基础部分 二.orm的基本操作 1.settings.py&#x…

大模型知识蒸馏技术(2)——蒸馏技术发展简史

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl2006年模型压缩研究 知识蒸馏的早期思想可以追溯到2006年,当时Geoffrey Hinton等人在模型压缩领域进行了开创性研究。尽管当时深度学习尚未像今天这样广泛普及,但Hinton的研究已经为知识迁移和模…

android获取EditText内容,TextWatcher按条件触发

android获取EditText内容&#xff0c;TextWatcher按条件触发 背景&#xff1a;解决方案&#xff1a;效果&#xff1a; 背景&#xff1a; 最近在尝试用原生安卓实现仿element-ui表单校验功能&#xff0c;其中涉及到EditText组件内容的动态校验&#xff0c;初步实现功能后&#…

毕业设计--具有车流量检测功能的智能交通灯设计

摘要&#xff1a; 随着21世纪机动车保有量的持续增加&#xff0c;城市交通拥堵已成为一个日益严重的问题。传统的固定绿灯时长方案导致了大量的时间浪费和交通拥堵。为解决这一问题&#xff0c;本文设计了一款智能交通灯系统&#xff0c;利用车流量检测功能和先进的算法实现了…

[权限提升] 操作系统权限介绍

关注这个专栏的其他相关笔记&#xff1a;[内网安全] 内网渗透 - 学习手册-CSDN博客 权限提升简称提权&#xff0c;顾名思义就是提升自己在目标系统中的权限。现在的操作系统都是多用户操作系统&#xff0c;用户之间都有权限控制&#xff0c;我们通过 Web 漏洞拿到的 Web 进程的…

Qt Designer and Python: Build Your GUI

1.install pyside6 2.pyside6-designer.exe 发送到桌面快捷方式 在Python安装的所在 Scripts 文件夹下找到此文件。如C:\Program Files\Python312\Scripts 3. 打开pyside6-designer 设计UI 4.保存为simple.ui 文件&#xff0c;再转成py文件 用代码执行 pyside6-uic.exe simpl…

数据结构与算法之栈: LeetCode LCR 152. 验证二叉搜索树的后序遍历序列 (Ts版)

验证二叉搜索树的后序遍历序列 https://leetcode.cn/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof/description/ 描述 请实现一个函数来判断整数数组 postorder 是否为二叉搜索树的后序遍历结果 示例 1 输入: postorder [4,9,6,5,8] 输出: false解释&#…

[STM32 - 野火] - - - 固件库学习笔记 - - -十三.高级定时器

一、高级定时器简介 高级定时器的简介在前面一章已经介绍过&#xff0c;可以点击下面链接了解&#xff0c;在这里进行一些补充。 [STM32 - 野火] - - - 固件库学习笔记 - - -十二.基本定时器 1.1 功能简介 1、高级定时器可以向上/向下/两边计数&#xff0c;还独有一个重复计…

IPhone13 Pro Max设备详情

目录 产品宣传图内部图——后设备详细信息 产品宣传图 内部图——后 设备详细信息 信息收集于HubWeb.cn

K8S中高级存储之PV和PVC

高级存储 PV和PVC 由于kubernetes支持的存储系统有很多&#xff0c;要求客户全都掌握&#xff0c;显然不现实。为了能够屏蔽底层存储实现的细节&#xff0c;方便用户使用&#xff0c; kubernetes引入PV和PVC两种资源对象。 PV&#xff08;Persistent Volume&#xff09; PV是…

[论文总结] 深度学习在农业领域应用论文笔记14

当下&#xff0c;深度学习在农业领域的研究热度持续攀升&#xff0c;相关论文发表量呈现出迅猛增长的态势。但繁荣背后&#xff0c;质量却不尽人意。相当一部分论文内容空洞无物&#xff0c;缺乏能够落地转化的实际价值&#xff0c;“凑数” 的痕迹十分明显。在农业信息化领域的…

WPF基础 | 深入 WPF 事件机制:路由事件与自定义事件处理

WPF基础 | 深入 WPF 事件机制&#xff1a;路由事件与自定义事件处理 一、前言二、WPF 事件基础概念2.1 事件的定义与本质2.2 常见的 WPF 事件类型 三、路由事件3.1 路由事件的概念与原理3.2 路由事件的三个阶段3.3 路由事件的标识与注册3.4 常见的路由事件示例 四、自定义事件处…

C++封装红黑树实现mymap和myset和模拟实现详解

文章目录 map和set的封装map和set的底层 map和set的模拟实现insertiterator实现的思路operatoroperator- -operator[ ] map和set的封装 介绍map和set的底层实现 map和set的底层 一份模版实例化出key的rb_tree和pair<k,v>的rb_tree rb_tree的Key和Value不是我们之前传统意…

如何用matlab画一条蛇

文章目录 源代码运行结果代码说明结果 源代码 % 画蛇的代码 % 2025-01-28/Ver1 % 清空环境 clc; clear; close all;% 定义蛇的身体坐标 t linspace(0, 4*pi, 100); % 参数化变量 x t; % x坐标 y sin(t) 0.5 * sin(3*t); % y坐标&#xff0c;形成更复…

DVC - 数据版本和机器学习实验的命令行工具和 VS Code 扩展

文章目录 一、关于 DVC二、快速启动三、DVC的工作原理四、VS代码扩展五、安装Snapcraft&#xff08;Linux&#xff09;Chocolatey (Windows)Brew (mac OS)Anaconda (Any platform)PyPI&#xff08;Python&#xff09;Package (Platform-specific)Ubuntu / Debian (deb)Fedora /…

理解神经网络:Brain.js 背后的核心思想

温馨提示 这篇文章篇幅较长,主要是为后续内容做铺垫和说明。如果你觉得文字太多,可以: 先收藏,等后面文章遇到不懂的地方再回来查阅。直接跳读,重点关注加粗或高亮的部分。放心,这种“文字轰炸”不会常有的,哈哈~ 感谢你的耐心阅读!😊 欢迎来到 brain.js 的学习之旅!…