pinia从入门到使用

news2024/11/23 15:26:32

pinia: 比vuex更适合vue3的状态管理工具,只保留了vuex 原有的 state, getters,actions 作用等同于 data computed methods,可以有多个 state

1.安装创建导入
安装:npm install piniayarn add pinia
创建stores/index.js
index.js

import { createPinia } from "pinia";
const pinia = createPinia()
export default pinia

导入

import { createApp } from 'vue'
import App from './App.vue'
import pinia from "./stores/index"
createApp(App).use(pinia).mount('#app')

2 使用state
在stores下新建 counter.js文件夹,使用defineStore 创建 传入一个(唯一名称), 命名时一般使用use + (唯一名称)

import { defineStore } from 'pinia'
const useCounter = defineStore('counter', {
    state: () => ({
        count: 99,
        name:'陆青',
        age:24,
        level: 200
    })
})
export default useCounter

在页面使用 不推荐使用解构赋值 ,解构之后不是响应式的 但可以通过vue 的 toRefs 以及 pinia 提供的 storeToRefs 变为响应式

<template>
  <div>
    <div>{{ counterStore.count }}</div>
    <div>{{ count }}</div>
    <button @click="add">+1</button>

    <hr/>

    <h1>{{name}}</h1>
    <h1>{{age}}</h1>
    <h1>{{level}}</h1>
    <button @click="updateState">修改state</button>
    <button @click="resetState">初始化state</button>
  </div>
</template>
<script setup>
// pinia  只有 state getters actions 等同于 data computed methods
// pinia  可以有多个 state  使用defineStore 创建 传入一个(唯一名称), 命名时一般使用use + (唯一名称),
// pinia  不推荐使用解构赋值 ,解构之后不是响应式的  但可以通过vue 的 toRefs 以及 pinia 提供的 storeToRefs 变为响应式
import useCounter from "./stores/counter";
import { toRefs } from "vue";
import { storeToRefs } from "pinia";
const counterStore = useCounter();

// const { count } = toRefs(counterStore);
const { count,name,age,level } = storeToRefs(counterStore);
function add() {
  counterStore.count++;
}
function updateState(){
    // 单个修改
    // counterStore.name = '陆景'
    // counterStore.age = 22
    //多个修改
    counterStore.$patch({
        name:'青子',
        age:100,
        level:220
    })
}
function resetState(){
    counterStore.$reset()
}
</script>

3使用 getters
在stores下新建 user.js文件夹
方法一:使用 state

// 使用 state
        getContent(state) {
            return state.name + state.content
        },

方法二:使用this

 // 使用this
        getLive() {
            return '我很喜欢的一句话是' + this.getContent
        },

接收函数

  // 接收函数
        getFun(state) {
            return function (id) {
                for (var i = 0; i < state.list.length; i++) {
                    const item = state.list[i]
                    if(item.id == id){
                        return item
                    }
                }
            }
        },

使用别的state 里面的值

import useCounter from './counter'
 //使用别的state
  showMessage(state) {
       const storeCounter = useCounter()
       return this.getContent + '我是另一个state里面的' + storeCounter.name
  }

完整的user.js

import { defineStore } from 'pinia'
import useCounter from './counter'

const useUser = defineStore('user', {
    state: () => ({
        list: [
            {
                name: 'vuex',
                id: 11
            },
            {
                name: 'pinia',
                id: 22
            }
        ],
        name: '言念',
        content: '君子,温其如玉'
    }),
    getters: {
        // 使用 state
        getContent(state) {
            return state.name + state.content
        },
        // 使用this
        getLive() {
            return '我很喜欢的一句话是' + this.getContent
        },
        // 接收函数
        getFun(state) {
            return function (id) {
                for (var i = 0; i < state.list.length; i++) {
                    const item = state.list[i]
                    if(item.id == id){
                        return item
                    }
                }
            }
        },
        //使用别的state
        showMessage(state) {
            const storeCounter = useCounter()
            return this.getContent + '我是另一个state里面的' + storeCounter.name
        }
    }
})
export default useUser

在页面使用

<template>
  <div>
    <h1>{{ storeUser.getContent }}</h1>
    <h1>{{ storeUser.getLive }}</h1>
    <h1>id为11:{{ storeUser.getFun(11)}}</h1>
    <h1>{{ storeUser.showMessage }}</h1>
  </div>
</template>
<script setup>
import useUser from "./stores/user";
const storeUser = useUser();
</script>
<style>
</style>

3 使用actions
在stores下新建 home.js文件夹

import { defineStore } from 'pinia'

const useBanner = defineStore('banner', {
    state: () => ({
        banner: [],
        count: 10
    }),
    actions: {
        getCount(num) {
            this.count += num
        },
        async getBanner() {
            const res = await fetch('xxx/xxx/xxx')
            const data = await res.json()
            console.log(data.data.banner.list);
            this.banner = data.data.banner.list
            console.log(this.banner);
        }
    }
})

export default useBanner

在页面使用

<template>
  <div>
    <h1>{{ storeBanner.count }}</h1>
    <button @click="getAdd">+10</button>
    <div v-for="(item,index) in  storeBanner.banner" :key="index">
       <img :src="item.image"/>
    </div>
  </div>
</template>
<script setup>
import useBanner from "./stores/home";
const storeBanner = useBanner();
function getAdd() {
  storeBanner.getCount(10);
}
storeBanner.getBanner().then(res=>{
    console.log('请求完成了!!');
})
</script>

效果图
在这里插入图片描述

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

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

相关文章

0基础学习VR全景平台篇第123篇:VR视频航拍补天 - PR软件教程

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 嗨&#xff0c;大家好&#xff0c;今天我们来介绍【航拍VR视频补天】。之前已经教给了大家如何处理航拍图片的补天&#xff0c;肯定有很多小伙伴也在好奇&#xff0c;航拍的VR视频…

2023年亚太杯APMCM数学建模大赛B题玻璃温室小气候调控

2023年亚太杯APMCM数学建模大赛 B题 玻璃温室小气候调控 原题再现 温室作物的产量受各种气候因素的影响&#xff0c;包括温度、湿度和风速[1]。其中&#xff0c;适宜的温度和风速对植物生长至关重要[2]。为了调节玻璃温室内的温度、风速等气候因素&#xff0c;在温室设计中常…

C语言:求二维数组鞍点 。鞍点就是指二维数组中在该位置上的元素在该行上最大,在该列上最小,也可能没有鞍点。

分析&#xff1a; 在主函数 main 中&#xff0c;程序首先定义一个二维数组 a[5][5] 和五个整型变量 i、j、max、maxj 和 k&#xff0c;并用于寻找鞍点。然后使用 printf 函数输出提示信息。 接下来&#xff0c;程序使用两个 for 循环结构&#xff0c;从键盘输入一个 5x5 的二…

Linux 栈回溯

目录 前言一、什么是栈回溯&#xff1f;二、栈回溯的实现原理三、参考阅读 前言 日常工作中&#xff0c;我们在开发软件程序时&#xff0c;经常会遇到程序奔溃的问题&#xff0c;导致程序奔溃的原因有很多&#xff0c;我们一般都是定位到相关代码&#xff0c;再去查询具体原因。…

vue3中shallowReactive与shallowRef

shallowReactive与shallowRef shallowReactive: 只处理了对象内最外层属性的响应式(也就是浅响应式) shallowRef: 只处理了value的响应式, 不进行对象的reactive处理 总结: reactive与ref实现的是深度响应式, 而shallowReactive与shallowRef是浅响应式。 什么时候用浅响应…

JVM——垃圾回收器(Serial,SerialOld,ParNew,CMS,Parallel Scavenge,Parallel Old)

目录 1.垃圾回收器的组合关系1.年轻代-Serial垃圾回收器2.老年代-SerialOld垃圾回收器3.年轻代-ParNew垃圾回收器4.老年代- CMS(Concurrent Mark Sweep)垃圾回收器CMS执行步骤&#xff1a;CMS垃圾回收器存在的问题缺点&#xff1a;CMS垃圾回收器存在的问题 – 线程资源争抢问题…

【计算机网络笔记】ARP协议

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

论文解读:《数据增强:通过强化学习引导的条件生成进行文本数据扩充》

Title:<Data Boost: Text Data Augmentation Through Reinforcement Learning Guided Conditional Generation> 期刊&#xff1a;EMNLP &#xff08;顶级国际会议&#xff09; 作者 Ruibo Liu; Guangxuan Xu; Chenyan Jia; Weicheng Ma; Lili Wang; et al 出版日期 20…

利用STM32和蓝牙模块构建智能物联网设备的开发指南

智能物联网设备在现代生活中扮演着重要的角色&#xff0c;而STM32微控制器和蓝牙模块则为实现智能物联网设备提供了基础支持。本文将介绍如何使用STM32微控制器和蓝牙模块构建智能物联网设备的开发指南&#xff0c;包括硬件设计、蓝牙模块配置、传感器数据采集和云平台连接等关…

最新版小权云黑系统 骗子添加查询源码

小权云黑系统添加骗子&#xff0c;查询骗子&#xff0c;可添加团队后台方便审核用&#xff0c;在线反馈留言系统&#xff0c;前台提交骗子&#xff0c;后台需要审核才能过&#xff0c;后台使用光年UI界面&#xff0c;新增导航列表&#xff0c;可给网站添加导航友链&#xff0c;…

使用opencv将8位图像raw数据转成bmp文件的方法

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 这里说的图像raw数据是只包含图像数据的缓存。主要使用了cv::imencode接口将 cv::Mat转化为图像缓存。 #include <opencv2/opencv.hpp>/* 生成一幅…

excel对号怎么打

对号无论是老师批改作业&#xff0c;还是在标注某些数据的时候都会用到&#xff0c;但这个符号在键盘上是没有的&#xff0c;那么excel对号怎么打出来呢&#xff0c;其实只要使用插入符号功能就可以了。 excel对号怎么打&#xff1a; 第一步&#xff0c;选中想要打出对号的单…

基于51单片机的超声波测距系统【程序+proteus仿真+参考论文+原理图+PCB等16个文件夹资料】

一、项目功能简介 整个设计系统由STC89C52单片机LCD1602显示模块声光报警模块存储模块超声波模块按键模块组成。 具体功能&#xff1a; 1、超声波测量距离&#xff0c;显示在LCD1602。 2、存储模块可以存储超声波报警值。 3、通过按键可设置报警值大小。 4、超声波报警距…

金蝶云星空表单插件传递参数到服务插件

文章目录 金蝶云星空表单插件传递参数到服务插件业务需求开发实现传递参数接收参数 金蝶云星空表单插件传递参数到服务插件 业务需求 操作售后单行反关闭时将当前选中行的序号传递到服务端&#xff0c;然后在服务端接收序列号&#xff0c;根据序列号处理相关逻辑。 开发实现…

obsidian官网下载太慢

obsidian真的很强大&#xff0c;速度快&#xff0c;丝滑&#xff0c;但是官网很慢 上百度网盘链接&#xff01; 链接&#xff1a;https://pan.baidu.com/s/1CWoNRuyhtezLTTJOfRf9Jg?pwdxopt 提取码&#xff1a;xopt

在OpenCV中基于深度学习的边缘检测

引言 如何在OpenCV中使用基于深度学习的边缘检测&#xff0c;它比目前流行的canny边缘检测器更精确。边缘检测在许多用例中是有用的&#xff0c;如视觉显著性检测&#xff0c;目标检测&#xff0c;跟踪和运动分析&#xff0c;结构从运动&#xff0c;3D重建&#xff0c;自动驾驶…

如何在Ubuntu系统上安装Redis

Redis的下载 Redis安装包分为windows版和Linux版当前示例中介绍的是Linux版本Linux的下载地址&#xff1a;Index of /releases/ (redis.io)本次下载的压缩包为&#xff1a;redis-6.2.14.tar.gzRedis的安装 将压缩包通过ssh远程工具上传到Linux服务器中解压压缩包 tar -zxvf red…

基于可微分渲染器的相机位置优化【PyTorch3D】

在这个教程中&#xff0c;我们将使用可微渲染学习给定参考图像的相机的 [x, y, z] 位置。 我们将首先使用相机的起始位置初始化渲染器。 然后&#xff0c;我们将使用它来生成图像&#xff0c;使用参考图像计算损失&#xff0c;最后通过整个管道进行反向传播以更新相机的位置。…

Web3.0时代:区块链DAPP将如何颠覆传统模式

小编介绍&#xff1a;10年专注商业模式设计及软件开发&#xff0c;擅长企业生态商业模式&#xff0c;商业零售会员增长裂变模式策划、商业闭环模式设计及方案落地&#xff1b;扶持10余个电商平台做到营收过千万&#xff0c;数百个平台达到百万会员&#xff0c;欢迎咨询。 随着…

6.Spring源码解析-loadBeanDefinitions(String location)

这里resourceLoader其实就是ClassPathXmlApplicationContext 1.ClassPathXmlApplicationContext 在上文中图例就能看出来 获取资源组可能存在多个bean.xml 循环单独加载资源组 创建一个编码资源并解析 获取当前正在加载的资源发现是空 创建了一个字节输入流&#xff0c…