vue3 状态管理pinia

news2024/11/26 14:31:31

1. 什么是Pinia

Pinia 是 Vue 的专属的最新状态管理库 ,是 Vuex 状态管理工具的替代品

在这里插入图片描述

特点优势:

  • 提供更加简单的API(去掉了mutation)
  • 提供符合组合式风格的API(和Vue3新语法统一)
  • 去掉modules的概念,每一个store都是一个独立的模块
  • 配合TypeScript更加友好,提供可靠的类型推断

2. 手动添加Pinia到Vue项目

后面在实际开发项目的时候,Pinia可以在项目创建时自动添加,现在我们初次学习,从零开始:

  1. 使用 Vite 创建一个空的 Vue3项目

    npm init vite@latest
    
  2. 按照官方文档安装 pinia 到项目中

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

    创建一个 pinia 实例 (根 store) 并将其传递给应用(main.js):

    import { createApp } from 'vue'
    import { createPinia } from 'pinia'
    import App from './App.vue'
    
    const pinia = createPinia() // 创建pinia实例
    const app = createApp(App) // 创建根实例
    
    app.use(pinia) // pinia插件的安装配置
    app.mount('#app') // 视图的挂载
    

3. Pinia基础使用

  1. 定义store
  2. 组件使用store

在这里插入图片描述

4. getters实现

Pinia中的 getters 直接使用 computed函数 进行模拟, 组件中需要使用需要把 getters return出去

在这里插入图片描述

5. action异步实现

方式:异步action函数的写法和组件中获取异步数据的写法完全一致

  • 接口地址:http://geek.itheima.net/v1_0/channels

  • 请求方式:get

  • 请求参数:无

在这里插入图片描述

需求:在Pinia中获取频道列表数据并把数据渲染App组件的模板中

在这里插入图片描述
store/channel.js

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

export const useChannelStore = defineStore('channel', () => {
    // 声明数据 state
    const channelList = ref([])
    // 声明操作数据的方法 action
    const getList = async () => {
        // 支持异步
        const { data: { data } } = await axios.get('http://geek.itheima.net/v1_0/channels')
        channelList.value = data.channels
    }
    // 声明getters相关

    return {
        channelList,
        getList
    }
})

App.vue

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

<template>
  <div>
    <h3>App.vue根组件</h3>
    <button @click="channelStore.getList">获取频道数据</button>
    <ul>
      <li v-for="item in channelStore.getList" :key="item.id">{{ item.name }}</li>
    </ul>
  </div>
</template>

<style scoped></style>

6. storeToRefs工具函数

使用storeToRefs函数可以辅助保持数据(state + getter)的响应式解构
在这里插入图片描述
1.定义store

我们知道 Store 是用 defineStore() 定义的,它的第一个参数要求是一个独一无二的名字

import { defineStore } from 'pinia'

// 你可以对 `defineStore()` 的返回值进行任意命名,但最好使用 store 的名字,同时以 `use` 开头且以 `Store` 结尾。(比如 `useUserStore`,`useCartStore`,`useProductStore`)
// 第一个参数是你的应用中 Store 的唯一 ID。
export const useCounterStore = defineStore('counter', {
  // 其他配置...
})

这个名字 ,也被用作 id ,是必须传入的, Pinia 将用它来连接 store 和 devtools。为了养成习惯性的用法,将返回的函数命名为 use… 是一个符合组合式函数风格的约定。

defineStore() 的第二个参数可接受两类值:Setup 函数Option 对象

Setup函数

export const useCounterStore = defineStore('counter', () => {
  const count = ref(0)
  function increment() {
    count.value++
  }

  return { count, increment }
})

在 Setup Store 中:

  • ref() 就是 state 属性
  • computed() 就是 getters
  • function() 就是 actions

2.使用store

虽然我们前面定义了一个 store,但在我们使用 <script setup> 调用 useStore()(或者使用 setup() 函数,像所有的组件那样) 之前,store 实例是不会被创建的

<script setup>
import { useCounterStore } from '@/stores/counter'
// 可以在组件中的任意位置访问 `store` 变量 ✨
const store = useCounterStore()
</script>

请注意,store 是一个用 reactive 包装的对象,这意味着不需要在 getters 后面写 .value,就像 setup 中的 props 一样,如果你写了,我们也不能解构它:

<script setup>
const store = useCounterStore()
// ❌ 这将不起作用,因为它破坏了响应性
// 这就和直接解构 `props` 一样
const { name, doubleCount } = store 
name // 将始终是 "Eduardo" 
doubleCount // 将始终是 0 
// ✅ 这样写是响应式的
// 💡 当然你也可以直接使用 `store.doubleCount`
const doubleValue = computed(() => store.doubleCount)
</script>

为了从 store 中提取属性时保持其响应性,你需要使用 storeToRefs()。它将为每一个响应式属性创建引用。当你只使用 store 的状态而不调用任何 action 时,它会非常有用。请注意,你可以直接从 store 中解构 action,因为它们也被绑定到 store 上:

<script setup>
import { storeToRefs } from 'pinia'
const store = useCounterStore()
// `name` 和 `doubleCount` 是响应式的 ref
// 同时通过插件添加的属性也会被提取为 ref
// 并且会跳过所有的 action 或非响应式 (不是 ref 或 reactive) 的属性
const { name, doubleCount } = storeToRefs(store)
// 作为 action 的 increment 可以直接解构
const { increment } = store
</script>

7. Pinia的调试

Vue官方的 dev-tools 调试工具 对 Pinia直接支持,可以直接进行调试
在这里插入图片描述

8. Pinia持久化插件

官方文档:https://prazdevs.github.io/pinia-plugin-persistedstate/zh/

在这里插入图片描述

  1. 安装插件 pinia-plugin-persistedstate

    npm i pinia-plugin-persistedstate
    
  2. 使用 main.js

    import { createApp } from 'vue'
    import { createPinia } from 'pinia'
    import persist from 'pinia-plugin-persistedstate'
    import App from './App.vue'
    const pinia = createPinia()
    ...
    createApp(App).use(pinia.use(persist))
    
  3. 配置 store/counter.js

    import { defineStore } from 'pinia'
    import { computed, ref } from 'vue'
    
    export const useCounterStore = defineStore('counter', () => {
      ...
      return {
        count,
        doubleCount,
        increment
      }
    }, {
      persist: true
    })
    
  4. 其他配置,看官网文档即可

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

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

相关文章

微信里写周报添加到公司办公平台的方法

概要 微信和公司用的办公平台互通&#xff0c;我们已经说过几篇。 这次将给大家介绍&#xff0c;如何在微信里写周报内容&#xff0c;添加到公司办公平台的周报应用里。 工作中&#xff0c;如果出差在外&#xff0c;或者回到家想要汇报一周的工作情况的时候&#xff0c;不用…

Druid连接池最小连接数设置失效问题

问题发现&#xff1a; 配置 当项目启动后 线程池确实是初始化了5条连接&#xff0c;但是当项目运行一段时间后&#xff0c;5条连接确消失了&#xff0c;只会程序用到得时候&#xff0c;再去初始化连接&#xff0c;这样有点违背了参数设置得意义&#xff0c;后来通过查阅资料发…

简单好用的文档管理系统MinDoc

什么是 MinDoc &#xff1f; MinDoc 是一款针对 IT团队开发的简单好用的文档管理系统。MinDoc 的前身是 SmartWiki 文档系统。SmartWiki 是基于 PHP 框架 laravel 开发的一款文档管理系统。因 PHP 的部署对普通用户来说太复杂&#xff0c;所以改用 Golang 开发。可以方便用户部…

vue 01

安装vscode 按照如下方式汉化 给vscode 安装插件 Vetur 安装node.js 下载地址https://nodejs.org/en/download/&#xff0c;选择windows msi 在cmd下检查如下&#xff1a; 检查nodejs版本:node --version 检查npm的安装版本&#xff1a;npm -v 执行命令&#xff1a; npm i…

学习rsync

文章目录 一、rsync介绍二、rsync的特点三、本地文件同步四、远程文件同步五、免密文件同步和更改端口后的文件同步六、rsync作为系统服务七、应用举例七、给rsync服务添加密码八、rsync搭配inotify进行实时同步九、xinetd托管rsyncd服务 一、rsync介绍 1.sync同步&#xff1a…

Python玫瑰花

系列文章 序号文章目录直达链接1浪漫520表白代码https://want595.blog.csdn.net/article/details/1306668812满屏表白代码https://want595.blog.csdn.net/article/details/1297945183跳动的爱心https://want595.blog.csdn.net/article/details/1295031234漂浮爱心https://want…

常见的作物模型应用技巧!DSSAT模型、APSIM模型、WOFOST模型与PCSE模型等应用

①最新DSSAT作物模型建模方法及应用 DSSAT模型内核算法是基于Fortran语言开发的&#xff0c;软件界面是基于C进行开发。了解和熟悉DSSAT模型的关键算法和软件的操作是学习DSSAT模型的基础。此外&#xff0c;想要成为一名优秀的作物模型使用者与科研团队不可或缺的人才&#xff…

Windows 安装 nvm 提示 ‘“node“‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

Windows 安装 nvm 提示 ‘“node”’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 解决办法 先卸载电脑中原有 nodejs 版本&#xff0c;再安装 nvm 即可。 安装完成之后记得重新打开终端 使用 安装 nodejs 18 添加环境变量 在 Path 里添加这两个变量名 结果 现…

XPS测试常见问题及解答(二)-科学指南针

在做X 射线光电子能谱(XPS)测试时&#xff0c;科学指南针检测平台工作人员在与很多同学沟通中了解到&#xff0c;好多同学仅仅是通过文献或者师兄师姐的推荐对XPS测试有了解&#xff0c;但是对于其原理还属于小白阶段&#xff0c;针对此&#xff0c;科学指南针检测平台团队组织…

认识京东联盟API,获取APPkey和APPsecret|直接调用KEY方式

做过淘客开发的一定接触过淘宝API开发。 而做京东联盟软件自然离不开京东联盟API。 京东联盟API目前上线的有很多。京东平台商品API。 https://jos.jd.com/api/list.htm?id117 Paste_Image.png 但是京东联盟API获取比较难&#xff0c;没办法在线申请&#xff0c;需要找官方…

NuGet包使用方法

NuGet包使用方法 必备条件 安装包括 dotnet CLI 的 .NET Core SDK。 从 Visual Studio 2017 开始&#xff0c;dotnet CLI 将自动随任何与 .NET Core 相关的工作负载一起安装。 如果你还没有帐户&#xff0c;请在 nuget.org 上注册一个免费帐户。 创建新帐户会发送确认电子邮…

Everything和SVN结合使用-在Everything中显示SVN

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…

实录分享 | Alluxio 在网易大数据的应用与优化

欢迎来到【微直播间】&#xff0c;2min纵览大咖观点 本次分享主要包括四个方面&#xff1a; 背景介绍&#xff1b;对象存储场景优化&#xff1b;Impala 引擎适配&#xff1b;通用功能增强。 一、 背景介绍 网易有数大数据基础平台NDH&#xff1a;NDH 是网易对标 Cloudera C…

【Linux学习笔记】代码编译工具gcc/g++

1. 程序的翻译1.1. 预处理1.2. 编译1.3. 汇编1.4. 链接 2. 动态链接和静态链接2.1. 动态链接2.2. 静态链接2.3. 动态链接和静态链接的区别2.4. 动态链接和静态链接的验证 3. make/makefile3.1. 依赖方法和依赖关系3.2. 写一个makefile文件3.3. PHONY的意义3.4. makefile的推导规…

Ubuntu:VS Code IDE安装ESP-IDF【保姆级】(草稿)

物联网开发学习笔记——目录索引 Visual Studio Code&#xff08;简称“VS Code”&#xff09;是Microsoft向开发者们提供的一款真正的跨平台编辑器。 参考&#xff1a; VS Code官网&#xff1a;Visual Studio Code - Code Editing. Redefined 乐鑫官网&#xff1a;ESP-IDF …

[网站部署03]宝塔+worldPress部署Ripro主题网站

1.下载好主题网站上传到下方目录即可 下载地址&#xff1a;请自行百度搜索&#xff0c;官网收费 下载好压缩包上传到/www/wwwroot/你的网站目录/wp-content/themes 2.回到Worldpress后台点击外观可以看到主题网站 http://192.168.49.128/wp-admin/themes.php 剩下的就是设置…

【matlab海洋专题】高级玫瑰图--风速风向频率玫瑰图--此图细节较多

玫瑰图分享过好多 这一次的还是不一样&#xff0c;细节较多 本期内容 【matlab海洋专题】高级玫瑰图–风速风向频率玫瑰图–此图细节较多: 总结起来&#xff0c;确实不好画&#xff01; 图片如下&#xff1a; 图片名称我不知道&#xff0c;我意会为&#xff1a; 风速风向…

众和策略:国际油价走高,石油板块强势拉升,通源石油、和顺石油等涨停

石油板块16日盘中大幅拉升&#xff0c;到发稿&#xff0c;通源石油、和顺石油、贝肯动力、中曼石油、泰山石油、仁智股份等涨停&#xff0c;潜能恒信、博迈科涨约8%。 燃气板块亦上扬&#xff0c;到发稿&#xff0c;洪通燃气、美能动力涨约5%&#xff0c;新疆火炬、九丰动力涨…

众和策略:减肥药概念热度不减,百花医药斩获4连板,公司提示风险

减肥药概念16日延续强势&#xff0c;部分个股继续走高。到发稿&#xff0c;博瑞医药涨约11%&#xff0c;百花医药、双鹭药业涨停&#xff0c;金凯生科涨近10%&#xff0c;昊帆生物涨超8%&#xff0c;华森制药、翰宇药业、常山药业等涨超5%。值得留意的是&#xff0c;博瑞医药近…

以任意位置中间元素翻转字符串:

前置知识&#xff1a; 你要学会如何将字符串转化为字符&#xff0c;如何将字符转为字符串 字符串转化为字符 String str "abcdef";char[] strChar str.toCharArray();for(int i :strChar){System.out.print((char)i" ");//需要进行强制类型转换&#x…