Vue3中的Pinia——管理应用程序的全局状态

news2024/9/21 0:50:47

介绍Pinia

Pinia 是 Vue.js 的状态管理库,主要用于管理应用程序的全局状态。它是 Vuex 的替代品,提供了更简单和更灵活的 API。Pinia 的主要作用包括:

  • 1. 状态管理:Pinia 允许你在应用中集中管理状态,方便不同组件之间共享数据。
  • 2. 响应式:Pinia 的状态是响应式的,任何对状态的更改都会自动更新依赖于该状态的组件。
  • 3. 模块化:你可以将状态分成多个 store,每个 store 可以管理不同的状态和逻辑,使得代码更清晰和可维护。
  • 4. 插件支持:Pinia 支持插件,可以扩展其功能,例如持久化状态、调试等。
  • 5. TypeScript 支持:Pinia 对 TypeScript 有良好的支持,提供类型推导和类型检查。
     

安装 pinia

yarn add pinia
# 或者使用 npm
npm install pinia

具体实现步骤 

在main.js里面导入Pinia并创建pinia实例(根 store) 并将其传递给应用:

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

const pinia = createPinia()
const app = createApp(App)

app.use(pinia)
app.mount('#app')

Store

store介绍

Store:Store 是一个用于管理状态的容器。每个 store 可以看作是一个模块,负责管理特定的状态、计算属性和行为(即方法)

定义store

基本操作

src下新建store文件,里面加上counter.js文件

import { defineStore } from 'pinia'
import { computed, ref } from 'vue'


// defineStore('仓库的唯一标识', () => {声明数据state、声明操作数据的方法 action、
// 声明基于数据派生的计算属性 getters。最后return}) 

// 这本质上定义了一个函数,可以导出
export const useAlertsStore = defineStore('alerts', () => {
    const count = ref(100)
    const str = ref("hello pinia")
    const addcount = () => {
        count.value++
    }
    const double = computed(() => count.value * 2) // 箭头函数单行语句不用return直接返回
    // const double = computed(() => {count.value * 2}) 如果加了{}就不会返回,要在前面添                
    // 加一个return
    return{
        count,
        str,
        addcount,
        double
    }
})

 在APP.vue中使用

<script setup>
import Son01 from '@/components/Son01.vue';
import Son02 from '@/components/Son02.vue';
// 导入 useAlertsStore函数
import {useAlertsStore} from '@/store/counter'
const tore = useAlertsStore()
console.log(tore);

</script>
<template>
  <div>{{ tore.count }}的两倍为 {{ tore.double }}</div>
  
  <button @click="tore.addcount">+</button>
  <div>{{ tore.str }}</div>
  <h1>这是在app.vue组件中</h1>
  <Son01></Son01>
  <Son02></Son02>
</template>

<style scoped></style>

注意不能随意解构tore:const { count, msg } = tore数据就会丢失响应式

以下是tore对象

store的解构 

如果是解构属性就用storeToRefs,解构方法就直接解构,解构的目的就是为了简化xxx.xxx的方式来调用属性或方法

<script setup>
import { storeToRefs } from 'pinia'
const store = useCounterStore()


// `name` 和 `doubleCount` 是响应式的 ref
const { name, doubleCount } = storeToRefs(store)

// 作为 action 的 increment 可以直接解构
const { increment } = store
</script>

action异步写法

下载axios

npm add axios 

import { defineStore } from "pinia";
import axios from "axios";
import { ref } from "vue";
export const useChannelStore = defineStore('channel', () => {
    const channellist = ref([])
    const getlist = async () => {
        const {data:{data:{channels : uname}}} = await axios.get('http://geek.itheima.net/v1_0/channels')
        // 解构时传给的变量uname
        console.log(uname);
        channellist.value = uname;      
    }
    return {
        channellist,
        getlist
    }
})

 app.vue中导入

<script setup>
// 导入channel
import {useChannelStore} from '@/store/channel'
const ChannelStore = useChannelStore()

</script>

<template>
  <button @click="ChannelStore.getlist">点击</button>
  <ul>
    <li v-for="item in ChannelStore.channellist" :key="item.id">{{ item.name }}</li>
  </ul>
</template>

<style scoped></style>

持久化处理

参考文档链接

下载pinia-plugin-persistedstate插件

npm i pinia-plugin-persistedstate

在main.js里面将插件添加到pinia 实例中:

import { createApp } from 'vue'
import { createPinia } from 'pinia'


// 导入持久化插件
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'

import App from './App.vue'

const pinia = createPinia()
const app = createApp(App)

app.use(pinia.use(piniaPluginPersistedstate)) // 添加持久化插件
app.mount('#app')

 在声明的store里面,设置新选项 :{persist:true}

import { defineStore } from 'pinia'
import { ref } from 'vue'

export const useStore = defineStore(
  'main',
  () => {
    const someState = ref('hello pinia')
    return { someState }
  },
  {
    persist: true,
  },
)

 配置完以上,在页面里点击刷新,页面内容都不变 

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

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

相关文章

微服务以及注册中心

一、什么是微服务 微服务是指开发一个单个小型的但有业务功能的服务&#xff0c;每个服务都有自己的处理和轻量通讯机制&#xff0c;可以部署在单个或多个服务器上。微服务也指一种松耦合的、有一定的有界上下文的面向服务架构。也就是说&#xff0c;如果每个服务都要同时修改…

Errorresponsefromdaemon:toomanyrequests:Youhavereachedyourpullratelimit.

Errorresponsefromdaemon:toomanyrequests:Youhavereachedyourpullratelimit.Youmayincreasethelimitbyauthenticatingandupgrading:https://www.docker.com/increase−rate−limit.See ′ dockerrun−−help 在拉取docker进行的时候遇到这个问题,如何解决呢?本文提供的解决方…

石英晶体谐振器:核心功能材料及其工作原理与应用

晶发电子专注17年晶振生产,晶振产品包括石英晶体谐振器、振荡器、贴片晶振、32.768Khz时钟晶振、有源晶振、无源晶振等&#xff0c;产品性能稳定,品质过硬,价格好,交期快.国产晶振品牌您值得信赖的晶振供应商。 石英晶体谐振器&#xff0c;又称为无源晶振&#xff0c;是现代电子…

【代码】使用c#实现串口通信的基础模板

一、分享代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;using System.IO.Ports; using…

云平台在大规模设备管理和数据分析中的作用

在当代数字化转型的浪潮中&#xff0c;云平台作为信息技术基础设施的核心组件&#xff0c;扮演着无可替代的角色&#xff0c;尤其在大规模设备管理和数据分析领域&#xff0c;其重要性和影响力日益凸显。本文旨在深入探讨云平台如何通过其独特的优势&#xff0c;促进数据的高效…

ROS第五梯:ROS+VSCode+C++单步调试

解决问题&#xff1a;在ROS项目中进行断点调试。 第一步&#xff1a;创建一个ROS项目或者打开一个现有的ROS项目。 第二步&#xff1a;修改c_cpp_properties.json 增加一段命令: "compileCommands": "${workspaceFolder}/build/compile_commands.json"第三…

11.第二阶段x86游戏实战2-找人物状态

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

gma 2.0.13 (2024.09.16) 更新日志

安装 gma 2.0.13 pip install gma2.0.13网盘下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1P0nmZUPMJaPEmYgixoL2QQ?pwd1pc8 提取码&#xff1a;1pc8 注意&#xff1a;此版本没有Linux版&#xff01; 编译gma的Linux虚拟机没有时间修复&#xff0c;本期Linux版…

WinRAR 创建自解压文件 添加桌面快捷方式 自定义图标

一、需求描述 将我们开发的软件&#xff0c;打包成exe安装包形式&#xff0c;让用户双击后可以选择安装位置&#xff0c;并在安装完成后&#xff0c;自动生成桌面快捷方式&#xff08;以任意我们自定义的图标和描述&#xff09; 二、准备 1.根据需求准备如下几种图标 软件安…

解析药用植物重楼甾体皂苷生物合成中的连续糖基化及其抗真菌作用-文献精读49

Unraveling the serial glycosylation in the biosynthesis of steroidal saponins in the medicinal plant Paris polyphylla and their antifungal action 解析药用植物重楼甾体皂苷生物合成中的连续糖基化及其抗真菌作用 摘要 糖–糖糖基转移酶在构建复杂的具有生物活性的…

走进低代码表单开发(五):高效开发的利器

前面我们已经介绍了勤研低代码开发平台的权限管理相关的内容&#xff0c;当表单设计完成后&#xff0c;我们将继续探索表单的其他功能&#xff0c;接下来&#xff0c;我们一起来看看勤研低代码平台还能如何为用户带来更便捷的开发体验。 一、表单导入 表单导入功能是勤研低代码…

电气自动化入门03:安全用电

视频链接&#xff1a;2.1 电工知识&#xff1a;触电原因与防触电措施_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1PJ41117PW/?p4&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.电流对人体的危害 电击&#xff1a;电流通过人体。 电伤&#xff1a;电流热效应…

深入理解Unreal中的AI感知系统

StimuliSource和PerceptionListener 感知作为一种信号&#xff0c;整个场景中存在这个信号的生产者和消费者。这种信号在Unreal中被叫做刺激Stimuli 生产者就是StimuliSource&#xff0c;通过挂载StimuliSourceComponent并RegisterForSense来注册成为哪些类型刺激的刺激源 消费…

聚焦API安全未来,F5打造无缝集成的解决方案

研究发现&#xff0c;目前超过90%的基于Web的网络攻击都以API端点为目标。随着对API使用需求的增加&#xff0c;这些攻击还会持续增长。现代企业需要一种动态防御策略&#xff0c;在风险升级成代价高昂、令人警惕且往往无法预防的API安全漏洞之前&#xff0c;发现并降低风险。 …

Android 开发高频面试题之——Flutter

Android开发高频面试题之——Java基础篇 flutter高频面试题记录 Flutter1. dart中的作用域与了解吗2. dart中. .. ...分别是什么意思?3. Dart 是不是单线程模型?如何运行的?4. Dart既然是单线程模型支持多线程吗?5. Future是什么6. Stream是什么7. Flutter 如何和原生交互…

微信getUserProfile不弹出授权框

当我们在微信小程序开发工具中想要使用getUserProfile来获取个人信息的时候&#xff0c;会发现不弹出授权框&#xff0c;这是什么原因呢&#xff1f; 早在2022年的小程序官方公告中就已经明确给出了小程序用户头像昵称获取规则调整公告 因此如果还想继续使用getUserProfile的弹…

uni-app-通过vue-cli命令行快速上手

环境安装 全局安装 vue-cli npm install -g vue/cli创建uni-app 使用正式版&#xff08;对应HBuilderX最新正式版&#xff09; vue create -p dcloudio/uni-preset-vue my-project使用alpha版&#xff08;对应HBuilderX最新alpha版&#xff09; vue create -p dcloudio/uni-p…

ARMxy车辆数据采集Linux智能控制器

在当今科技日新月异的时代&#xff0c;高效智能的边缘计算设备在众多领域发挥着关键作用。我们的 ARM 边缘计算机&#xff0c;凭借其卓越的性能和广泛的适用性&#xff0c;成为车队管理智能化的核心力量。 一、强大硬件配置&#xff0c;完美适配车队管理需求 ARM 边缘计算机支…

2024 全新利器:API 微查接口登场

在信息时代的浪潮中&#xff0c;数据查询和核验成为了人们生活中必不可少的一部分。然而&#xff0c;为了满足各种不同的查询需求&#xff0c;开发和维护一个高效、全面的查询系统对于个人或者小团队来说往往是一项不小的挑战。好在现在有了全新的利器&#xff1a;API 微查接口…

CTF 技能树 LOG -GIT泄露 笔记

log 使用虚拟机kali操作 python2 安装 apt-get install python2 进入root用户&#xff0c;下载克隆git hack库 git clone https://github.com/BugScanTeam/GitHack sudo passwd root 修改root 命名密码为root 切换登录 su root 终端进入home/kali/GitHack/ python GitH…