vuex和pinia转态管理工具介绍

一、介绍

相同点: 都是Vue.js的状态管理工具

不同点:

区别PiniaVuex
支持Vue2和Vue3都支持Vue3写法需要额外配置
Mutation只有 state, getter 和 action,无Mutationaction异步、Mutation 同步
actionaction支持同步和异步action异步、Mutation 同步
Typescript良好的Typescript支持需要额外的配置
模块嵌套不需要嵌套模块,符合 Vue3 的 Composition api,让代码扁平化需要
模块嵌套不需要嵌套模块,符合 Vue3 的 Composition api,让代码扁平化Vuex中如果数据过多,我们通常分模块来进行管理
模块嵌套不需要嵌套模块,符合 Vue3 的 Composition api,让代码扁平化,pinia中每个store都是独立的,互相不影响Vuex中如果数据过多,我们通常分模块来进行管理
体积体积非常小,只有1KB左右体积大
插件扩展支持插件来扩展自身功能不能
服务端渲染支持服务端渲染不能

总结:pinia的优点

  • 支持Vue3 和 Vue2,完整的 ts 的支持;
  • 足够轻量,压缩后的体积只有1kb左右;
  • 去除 mutations,只有 state,getters,actions;
  • actions 支持同步和异步;
  • 代码扁平化没有模块嵌套,只有 store 的概念,store 之间可以自由使用,每一个store都是独立的 无需手动添加store,store 一旦创建便会自动添加;
  • 支持插件来扩展自身功能|
  • 支持服务端渲染

注意点

pina的使用,有时候动态路由一般需要在beforeEach中去做拦截处理,把后端传过来的路由数据存入,页面第一次也会去走一次router文件,由于pinia没有挂载到vue上面,导致报错,

问题: Uncaught Error: [🍍]: getActivePinia was called with no active Pinia. Did you forget to install pinia?
这个问题代表当前正在使用pinia; 但是pinia 还没有挂载成功

做法就是新建一个js文件,然后在js文件创建初始化,然后导出,然后分别在main和使用路由守卫的地方去引入。

二、使用

1、pinia使用

  • 安装
 npm install pinia@next
  • vue3项目下创建一个 Pinia store,例如counterStore.js
import { defineStore } from 'pinia';export const useCounterStore = defineStore({id: 'counter',state: () => ({count: 0,}),getters: {doubleCount() {return this.count * 2;},},actions: {increment() {this.count++;},decrement() {this.count--;},},
});
  • 引入 Pinia 到 Vue 应用中
// main.js
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'const app = createApp(App)const pinia = createPinia()
app.use(pinia)app.mount('#app')
  • 在页面上使用
<template><div><p>Count: {{ counter.count }}</p><p>Double Count: {{ counter.doubleCount }}</p><button @click="counter.increment">Increment</button><button @click="counter.decrement">Decrement</button></div>
</template><script>
import { useCounterStore } from '@/counterStore.js';export default {setup() {const counter = useCounterStore();return { counter };},
};
</script>

2、Vuex使用

  • 安装
npm install vuex
  • Vue 2 项目中创建一个 Vuex store,例如 store.js 的文件
import Vue from 'vue';
import Vuex from 'vuex';Vue.use(Vuex);export default new Vuex.Store({state: {count: 0,},mutations: {increment(state) {state.count++;},decrement(state) {state.count--;},},actions: {increment(context) {context.commit('increment');},decrement(context) {context.commit('decrement');},},getters: {doubleCount(state) {return state.count * 2;},},
});
  • 主Vue实例中引入并配置store。
// main.js
import Vue from 'vue';
import App from './App.vue';
import store from './store';new Vue({store,render: h => h(App)
}).$mount('#app');
  • 在页面上使用
<template><div><p>Count: {{ $store.state.count }}</p><p>Double Count: {{ doubleCount }}</p><button @click="increment">Increment</button><button @click="decrement">Decrement</button></div>
</template><script>
export default {computed: {doubleCount() {return this.$store.getters.doubleCount;},},methods: {increment() {this.$store.dispatch('increment');},decrement() {this.$store.dispatch('decrement');},},
};
</script>
  • 优化,有时候需要引入很多个,此时可以根据自动批量导入JS模块
    在这里插入图片描述
import Vue from 'vue'
import Vuex from 'vuex';
Vue.use(Vuex);//导入modules所有模块
const modulesFiles = require.context('./modules', true, /\.js$/);const modules={};
modulesFiles.keys().forEach(key => {const module= modulesFiles(key).default;const moduleName=key.slice(2,-3);//以文件名为模块名,./user.js 截取(user)modules[moduleName]=module
});const store=new Vuex.Store({modules,});
export default store
  • 例如user.js的写法
const state = {name: '测试'
};
const getters = {getName: state => state.name
}
const mutations = {SET_NAME(state, val) {state.name = val;}
};
const actions = {setName({commit}, val) {return new Promise((resolve, reject) => {setTimeout(() => {commit('SET_NAME', val);resolve()}, 100)}).catch(err => {reject(err)})}
};export default {namespaced: true,state,mutations,actions,getters
};
  • 自动批量导入JS模块:在页面上使用
 export default {mounted(){获取user  state里面的数据this.$store.state.user.name //测试修改user  mutations 的数据this.$store.commit(‘user/SET_NAME’,‘修改’)获取user gettersthis.$store.getters[‘user/getName’]异步修改state里面的数据await this.$store.dispatch(‘user/setName’,‘修改’)}		
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nvm管理多个node版本,快速来回切换node版本

前言 文章基于 windows环境 使用nvm安装多版本nodejs。 最近公司有的项目比较老需要降低node版本才能运行&#xff0c;由于来回进行卸载不同版本的node比较麻烦&#xff1b;所以需要使用node工程多版本管理&#xff0c;后面自己就简单捯饬了一下nvm来管理node&#xff0c;顺便…

淘宝京东比价接口推荐(商品api接口)

主流电商商品API接口 数据时代&#xff0c;做好数据分析的重要性不言而喻。电商行业也同样如此&#xff0c;做好商品数据的整合分析&#xff0c;对于电商企业来说&#xff0c;有以下几个好处&#xff1a; 更好地了解产品表现。通过商品数据分析&#xff0c;品牌方可以了解到商…

前端css中的transform(转换)的使用

前端css中的transform的使用 一、前言二、流程图三、举例&#xff08;一&#xff09;、平移1.平移&#xff0c;源码12.源码1运行效果(1).视频效果(2).截图效果 3.平移3d效果&#xff0c;源码24.源码2运行效果&#xff08;1&#xff09;、视频效果&#xff08;2&#xff09;、截…

甘特图:如何制定一个有效的产品运营规划?

做好一个产品的运营规划是一个复杂且系统的过程&#xff0c;涉及多个方面和阶段。以下是一些关键步骤和考虑因素&#xff0c;帮助你制定一个有效的产品运营规划&#xff1a; 1、明确产品定位和目标用户&#xff1a; 确定产品的核心功能、特点和优势&#xff0c;明确产品在市…

Android Studio实现内容丰富的安卓校园超市

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 项目代号168 1.开发环境 后端用springboot框架&#xff0c;安卓的用android studio开发 android stuido3.6 jdk1.8 idea mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册…

jdbc操作数据库 and 一个商品管理页面

文章目录 1. 介绍1.1 应用知识介绍1.2 项目介绍 2. 文件目录2.1 目录2.2 介绍以下&#xff08;从上到下&#xff09; 3. 相关代码3.1 DBConnection.java3.2 MysqlUtil.java3.3 AddServlet.java3.4 CommodityServlet.java3.5 DelectServlet.java3.6 SelectByIdServlet.java3.7 S…

iStat Menus for Mac:强大的系统监控工具

iStat Menus for Mac是一款功能强大的系统监控工具&#xff0c;专为Mac用户设计&#xff0c;旨在帮助用户全面了解电脑的运行状态&#xff0c;提高电脑的性能和稳定性。 iStat Menus for Mac v6.73 (1239)中文版下载 该软件可以实时监测CPU使用率、内存占用、网络速度、硬盘活动…

Python网络爬虫之数美滑块的加密及轨迹分析

目录 一、引言 二、数美滑块验证概述 三、数美滑块加密机制分析 1、参数混淆与加密 2、JS代码动态执行 四、轨迹分析 1、轨迹数据获取 2、轨迹特征提取 五、动态JS参数分析 1、网络请求分析 2、JS代码调试与追踪 六、Python实现案例分析 1. 环境搭建与依赖安装 2…

模块三——二分:34.在排序数组中查找元素的第一个和最后一个位置

文章目录 前言题目描述算法原理细节问题 代码实现 前言 相信通过本模块的第一篇博客&#xff0c;大家已经能够对二分有一个清晰的认知了&#xff0c;最好画画图来加深理解&#xff0c;以下是一些新的注意事项&#xff1a; 请⼤家⼀定不要觉得背下模板就能解决所有⼆分问题。⼆…

TaskWeaver使用记录

TaskWeaver使用记录 1. 基本介绍2. 总体结构与流程3. 概念细节3.1 Project3.2 Session3.3 Memory3.4 Conversation3.5 Round3.6 Post3.7 Attachment3.8 Plugin3.9 Executor 4. 代码特点5. 使用过程5.1 api调用5.2 本地模型使用5.3 添加插件 6. 存在的问题与使用体验6.1 判别模型…

【Qt 学习笔记】Qt常用控件 | 显示类控件 | Label的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 显示类控件 | Label的使用及说明 文章编号&#xff1a;Q…

qt实现不定数量的按钮向前向后移动展示

按钮模拟移动 引言示例代码第一种思路开发环境代码结构实现代码第二种思路开发环境实现代码第三种思路开发环境实现代码总结引言 此文主要记录用qt实现按钮的移动,具体效果如下: 模拟按钮移动效果 示例代码 本文记录了三种实现方式。 第一种 思路 用动态数组vector存放创…