首页 > 其他分享 >【Vue3新工具】Pinia.js:提升开发效率,更轻量、更高效的状态管理方案!

【Vue3新工具】Pinia.js:提升开发效率,更轻量、更高效的状态管理方案!

时间:2024-11-21 21:56:31浏览次数:1  
标签:const pinia counter js state Pinia 轻量 store

大家好,欢迎来到程序视点!我是小二哥! 前言 在VUE项目开发中,一些数据常常被多个组件频繁使用,为了管理和维护这些数据,就出现了状态管理模式。 今天小二哥要给大家推荐的不是VueX,而是称为新一代的状态管理工具的Pinia.js。      关于Pinia.js Pinia.js 由 Vue.js团队成员所开发的,是新一代的 Vuex,即 Vuex5.x,在 Vue3.0 项目的使用中备受推崇。    它已经加入官方团队了哦! Pinia.js 定位和特点:

  • 完整的 typescript 的支持;
  • 极其轻量,压缩后的体积只有1.6kb;
  • 去除 mutations,只有 state,getters,actions(这是我最喜欢的一个特点);
  • actions 支持同步和异步;
  • 没有模块嵌套,只有 store 的概念,能够构建多个 store,store 之间可以自由使用,更好的代码分割;
  • 关联 Vue Devtools 钩子,提供更好地开发体验;
使用 安装脚手架vite 首先确保使用的脚手架是vite // 安装vite
npm init vite@latest
安装依赖
npm install pinia --save
以上安装完成之后,可以在项目根目录的package.json文件内找到相关的信息(部分片段):
{ "dependencies": { "pinia": "^2.0.11", "vue": "^3.2.25" }, "devDependencies": { "@vitejs/plugin-vue": "^2.2.0", "vite": "^2.8.0" } }
优化改造 因为需要在整个项目使用状态管理,因此需要在 main.js 文件里配置,以使它应用到整个应用(app):
// main.js import { createApp } from 'vue' import App from './App.vue' // 导入构造函数 import { createPinia } from 'pinia' // 实例化 Pinia const pinia = createPinia() // 创建Vue应用实例app const app = createApp(App) // 应用以插件形式挂载Pinia实例 app.use(pinia) app.mount('#app')
定义状态仓库
// src/store/index.js // 引入仓库定义函数 import { defineStore } from 'pinia' // 传入2个参数,定义仓库并导出 // 第一个参数唯一不可重复,字符串类型,作为仓库ID以区分仓库 // 第二个参数,以对象形式配置仓库的state,getters,actions // 配置 state getters actions export const mainStore = defineStore('main', { // state 类似组件的data选项,函数形式返回对象 state: () => { return { msg: '程序视点', counter: 0 } }, getters: {}, actions: {} })
类似vuex,单独一个文件定义状态仓库并导出。 读取仓库内状态并改变 在需要使用状态的组件内需要先导入状态仓库:
import { mainStore } from "../store/index.js";
再实例化仓库函数:
const store = mainStore();
即可使用。 Store中State读取和修改 storeToRefs响应式函数
<template> <button @click="handleClick">修改状态数据</button> <!-- 模板内不需要加.value --> <p>{{store.counter}}</p> <!-- 或者使用解构之后的 --> <p>{{counter}}</p> </template> <script setup> // 导入状态仓库 import { mainStore } from "../store/index.js"; // 使普通数据变响应式的函数 import { storeToRefs } from "pinia"; // 实例化仓库 const store = mainStore(); // 解构并使数据具有响应式 const { counter } = storeToRefs(store); // 点击 + 1; function handleClick() { // ref数据这里需要加.value访问 counter.value++; } </script>
可以像下面这样直接修改 state,但一般不建议这么做。
store.counter += 1;
通过 actions 去修改 state action 里可以直接通过 this 访问。
export const mainStore = defineStore('main', { // state 类似组件的data选项,函数形式返回对象 state: () => { return { msg: '程序视点', counter: 0 } }, getters: {}, actions: { updateCount(){ this.counter += 1; } } }) <script lang="ts" setup> import { mainStore } from "../store/index.js"; const store = mainStore(); userStore.updateCount(); </script>
$patch方法 对象形式修改 前面介绍的是少量数据的变更,如果涉及数据比较多,则推荐使用仓库实例的$patch方法,批量修改,虽然看起来和前面的几乎没有区别,但是会加快修改速度,对程序的性能有很大的好处。$patch传入一个对象,对象的属性就是各种状态。
<template> <button @click="handleClick">修改状态数据</button> <p>{{msg}}</p> <!-- 或者使用解构之后的 --> <p>{{counter}}</p> </template> ​ <script setup> // 导入状态仓库 import { mainStore } from "../store/index.js"; // 使普通数据变响应式的函数 import { storeToRefs } from "pinia"; // 实例化仓库 const store = mainStore(); // 解构并使数据具有响应式 const { msg,counter } = storeToRefs(store); ​ // 点击 + 1;修改字符串 function handleClick() { store.$patch({ msg: "pinia good!", counter: counter.value + 1, }); } </script>
函数形式 上面例子中的$patch也可以传入一个函数,函数参数为state状态:
<template> <button @click="handleClick">修改状态数据</button> <p>{{msg}}</p> <!-- 或者使用解构之后的 --> <p>{{counter}}</p> </template> <script setup> // 导入状态仓库 import { mainStore } from "../store/index.js"; // 使普通数据变响应式的函数 import { storeToRefs } from "pinia"; // 实例化仓库 const store = mainStore(); // 解构并使数据具有响应式 const { msg,counter } = storeToRefs(store); // 点击 + 1;修改字符串 function handleClick() { store.$patch((state) => { state.msg = "pinia good!"; state.counter++; }); } </script>
以上就是关于 Pinia.js 用法的一些介绍。关于Pinia.js的基础操作可以通过下方阅读原文查看。Pinia.js 的内容还远不止这些,更多内容及使用有待大家自己探索。
Pinia官方文档 https://pinia.vuejs.org/
写在最后 【程序视点】助力打工人减负,从来不是说说而已! 后续小二哥会继续详细分享更多实用的工具和功能。持续关注,这样就不会错过之后的精彩内容啦! 如果这篇文章对你有帮助的话,别忘了【点赞】【分享】支持下哦~

标签:const,pinia,counter,js,state,Pinia,轻量,store
From: https://www.cnblogs.com/tanggoahead/p/18561642

相关文章

  • Next.js项目App目录如何简单集成markdown博客
    文章原文:Next.js项目App目录如何简单集成markdown博客此教程适用于比较简单的项目实现,如果你是刚入门next,并且不想用太复杂的方式去实现一个博客项目,那么这个教程就挺适合你的。Next.js官方关于markdown的文档有说明过如何渲染markdown,也是针对App目录的,但我尝试过并不太行,可能......
  • WEB攻防-XSS跨站&反射型&存储型&DOM型&标签闭合&输入输出&JS代码解析
    XSS跨站-输入输出-原理&分类&闭合漏洞原理:接受输入数据(如前端JS代码进行执行),输出显示数据后解析执行(先分析,在输入,有闭合绕闭合,有过滤绕过滤)反射(非持续型攻击)有一些浏览器会阻止不确定用户会不会点击利用:可以制造一个钓鱼网站基础类型:反射(非持续),存储(持续),DOM......
  • 2024最新版Node.js详细安装教程(含npm配置淘宝最新镜像地址)
    一:Node.js安装浏览器中搜索Nodejs,或直接用网址:Node.js—在任何地方运行JavaScript建议此处下载长期支持版本(红框内):开始下载,完成后打开文件:进入安装界面,在此处勾选,再点击next:此处为你希望将Nodejs安装到哪里,可以是默认的,也可以自定义,前提是要明确安装到哪里。这里不......
  • 数据传输序列化 Json和protobuf
    1序列化序列化(Serialization)将对象的状态信息转换为可以存储或传输的形式的过程,与之相对应的过程称之为反序列化(Unserialization)。序列化和反序列化主要用于解决在跨平台和跨语言的情况下,模块之间的交互和调用,但其本质是为了解决数据传输问题。 1.1如何实现序列化......
  • H.265流媒体播放器EasyPlayer.js网页全终端安防视频流媒体播放器关于pts值
    随着科技的飞速发展和互联网的普及,流媒体播放器已成为现代通信和娱乐的重要组成部分。其核心技术和发展趋势不仅影响着用户的观看体验,还引领着整个行业的变革。关于pts值是可以的,一秒回调一次。对于版本EasyPlayer.js支持buf:当前缓冲区时长,单位毫秒。fps:当前视频帧率。......
  • H.264/H.265播放器EasyPlayer.js网页全终端安防视频流媒体播放器关于iOS不能系统全屏
    在数字化时代,流媒体播放器已成为信息传播和娱乐消遣的主流载体。随着技术的进步,流媒体播放器的核心技术和发展趋势不断演变,影响着整个行业的发展方向。EasyPlayer播放器属于一款高效、精炼、稳定且免费的流媒体播放器,可支持多种流媒体协议播放,无须安装任何插件,起播快、延迟低、兼......
  • 使用 vscode 调试 nodejs 代码
    继前一篇:使用cmake.js在Windows上编译js代码我们已经能在vscode上成功的编译出js代码,那我们该如何断点调试js代码以及js引用的C库源码呢首先要先以Debug模式编译js代码cmake-jscleancmake-jscompile-D找到debug生成的pdb文件,这个很重要,关......
  • 视频流媒体播放器EasyPlayer.js无插件直播流媒体音视频播放器Android端webview全屏调
    流媒体播放器的核心技术与发展趋势正在不断推动着行业的变革。未来,随着技术的不断进步和应用场景的不断拓展,流媒体播放器将为用户带来更加便捷、高效、个性化的观看体验。同时,流媒体播放器也会成为数字娱乐产业的重要组成部分,为整个行业的繁荣发展贡献更多的力量。Android端webvi......
  • RTSP播放器EasyPlayer.js播放器点击全屏按钮报:fullscreen request error TypeError Di
    流媒体技术分为顺序流式传输和实时流式传输两种。顺序流式传输允许用户在下载的同时观看,而实时流式传输则允许用户实时观看内容。流媒体播放器负责解码和呈现内容,常见的播放器包括VLC和HTML5播放器等。流媒体技术的应用场景广泛,包括娱乐、教育、视频监控、企业培训等。关于iframe......
  • threejs根据接口状态更换物体颜色
    问题需求是根据接口返回的状态来修改物体A的颜色,但在实际操作中,发现物体A颜色成功修改,但物体B的颜色也变了,代码如下letmodel=XXX;//导入的物体object.sceneconstchangePumpColor=()=>{constnameNode=model.getObjectByName('xxx');setObject3DColor(nameN......