vuex和pinia转态管理工具介绍

文章目录

    • 一、介绍
    • 二、使用
      • 1、pinia使用
      • 2、Vuex使用

一、介绍

相同点: 都是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 getters
		this.$store.getters[‘user/getName’]
         
        异步修改state里面的数据
		await this.$store.dispatch(‘user/setName’,‘修改’)
  }		
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

埋点,自己写插件,自己写的按钮埋点,掘金同款投递简历

20分钟掌握 Vite 插件开发 - 掘金 vite的生命周期啥的 1.浏览器的控制台输出有样式的字 // const randomLetterPlugin ()>{ // const letters [wwwwwww,000000000000,888888888888]; // //随机获取一个字符并打印 // const printRandomLetter ()>{ // …

如何更好的管理个人财务?使用极空间部署私有记账系统Firefly III

如何更好的管理个人财务&#xff1f;使用极空间部署私有记账系统Firefly III 哈喽小伙伴们好&#xff0c;我是Stark-C~ 不知道屏幕前的各位“富哥”日常生活中是怎么管理自己巨额财富的&#xff0c;反正对于像我这样年薪过千的摸鱼族来说&#xff0c;请一个专业的理财顾问多多…

电子签名在人力资源中的应用:让HR工作更高效

人力资源&#xff08;HR&#xff09;行业是电子签领域的重要应用之一&#xff0c;它可以在以下场景中使用电子签&#xff1a; 1. 在招聘流程中&#xff0c;HR部门可以利用电子签名工具来完成与招聘候选人之间的任何文件签署操作。例如&#xff0c;维护人才库数据库、简历、面试…

世界读书日 | 开发者必读书单重磅来袭,华为云DTSE专家天团力荐

春色恰如许&#xff0c;读书正当时。 读书&#xff0c;就像解锁一把神秘钥匙&#xff0c;为开发者洞开新世界的大门&#xff0c;赋予他们破译复杂难题的能力、挑战未知领域的勇气。书页翻动间&#xff0c;开发者得以站在巨人的肩膀上&#xff0c;汲取前人经验&#xff0c;积蓄…

RANSAC 配准算法

RANSAC 配准算法 1. 简介2. RANSAC步骤3. RANSAC原理4. RANSAC的优缺点5. 代码实现6. 参考 1. 简介 先讲一下背景吧。 点云配准&#xff08;Point Cloud Registration&#xff09;指的是输入两幅点云 (source 和 target) &#xff0c;输出一个变换使得变换后的source和target…

管理 Python 项目的艺术:在 PyCharm 中使用虚拟环境(以BPnP为例)

在 PyCharm 中使用虚拟环境对于 Python 项目开发具有多方面的重要作用&#xff0c;这些作用体现在提升项目管理的效率、保障代码的可运行性以及维护项目的长期稳定性等方面。以下是使用虚拟环境的几个关键好处&#xff1a; 1. 依赖管理和隔离 虚拟环境允许每个项目拥有…

深度相机(3D相机)

传统的RGB彩色相机称为2D相机&#xff0c; 只能得到2D的图像信息&#xff0c; 无法得到物体与相机的距离信息&#xff0c;也就是深度信息。 顾名思义&#xff0c; 深度相机除了获取2D信息&#xff0c;还能得到深度信息&#xff0c;也叫RGBD相机&#xff0c; 或3D相机。 顺便提…

CSS介绍及三种应用方式[内联,内嵌,外链]元素及实例讲解

css介绍 CSS&#xff08;Cascading Style Sheets&#xff09;是一种用于描述HTML文档外观和格式的样式表语言。CSS允许开发者和设计师将网页的呈现&#xff08;布局、颜色、字体等&#xff09;与内容&#xff08;HTML&#xff09;分离开来&#xff0c;从而使得网页的设计更加灵…

vue2+vxe-table实现表格增删改查+虚拟滚动

vue2vxe-table实现表格增删改查虚拟滚动 使用的vxe-table版本&#xff1a;v3.x (vue 2.6 长期维护版) 完整代码 <template><div><vxe-toolbar ref"xToolbar" export :refresh"{query: findList}"><template #buttons><vxe-b…

vulhub weblogic全系列靶场

目录 简介 需要使用的工具 CVE-2017-10271 0x00 漏洞产生原因 0x01 影响范围 0x02 漏洞地址 0x03 环境 0x04 漏洞复现 1. 手工 2. 漏洞利用工具 CVE-2018-2628 0x00 漏洞产生原因 0x01 影响范围 0x02 环境 0x03 漏洞复现 1.nmap扫是否是T3协议 2.漏洞检测&…

【C++】详解初始化列表,隐式类型转化,类静态成员,友元

前言 初始化列表是对构造函数内容的补充&#xff0c;小编会详细的讲解初始化列表的概念&#xff0c;特性&#xff0c;注意点。这是本篇内容的重头戏&#xff0c;小编会先提一个问题来抛砖引玉。 隐式类型转换顾名思义&#xff0c;首先它不需要主动转换&#xff0c;类似于把浮点…

抖音运营全攻略 沈阳新媒体运营培训

抖音发展趋势 数据显示&#xff0c;2023年&#xff0c;抖音日活量突破10亿。是目前最火的短视频软件。 抖音的总用户数量已超过12亿&#xff0c;日活10亿&#xff0c;人均单日使用时长超过2小时&#xff0c;这只是平均数据&#xff0c;其实大部分人刷抖音时间会超过3个小时&am…

Hive数据类型

1.基本数据类型 示例&#xff1a; -- 创建表并定义列的数据类型 CREATE TABLE data_types_example (tinyint_column TINYINT,smallint_column SMALLINT,int_column INT,bigint_column BIGINT,boolean_column BOOLEAN,float_column FLOAT,double_column DOUBLE,string_column S…

HSB矩形调色板设计和计算方法

HSB矩形调色板设计和计算方法 RGB调色板绘制较容易&#xff0c;HSB调色板较难绘制&#xff0c;前些天发文介绍了几个矩形样例的绘制方法&#xff0c;今介绍矩形的HSB调色板的设计方法和H,S,B值的计算方法&#xff0c;好东西必须与大家分享。 此文介绍HSB调色板和选色条的绘制方…

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…

Springboot 结合PDF上传到OSS

目录 一、首先注册阿里云OSS&#xff08;新用户免费使用3个月&#xff09; 二、步骤 2.1 将pdf模板上传到oos 2.2 这里有pdf地址,将读写权限设置为共工读 ​编辑 三、代码 3.1 pom.xml 3.2 配置文件 3.3 oss model 3.4 配置类(不需要修改) 3.5 将配置类放入ioc容器 3.…

【C++】:构造函数和析构函数

目录 前言一&#xff0c;构造函数**1.1 什么是构造函数****1.2 构造函数的特性**1.3 总结 二&#xff0c;析构函数**2.1 什么是析构函数****2.2 析构函数的特性****2.3 总结** 前言 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并…

JetBrains PhpStorm v2024.1 安装教程 (PHP集成开发IDE)

前言 PhpStorm是由JetBrains推出的一款轻量级集成开发环境&#xff0c;专为PHP开发者而设计。该软件融合了智能的HTML/CSS/JavaScript/PHP编辑器、代码质量分析工具、版本控制系统集成&#xff08;包括SVN和GIT&#xff09;、调试和测试等功能。除此之外&#xff0c;PhpStorm还…

画图的神器及必备的调色和选图工具

大学生研究生论文写作及画图的神器 前言常用的工具集合画图工具配色参考画图神器词云 最后下篇 前言 好久没有更博&#xff0c;来更一下吧。最近刚好被问到平常是用什么来画图的&#xff0c;包括会议论文&#xff0c;各种类型的PPT汇报以及项目报告等等里面的图怎么画好。所以…

CSS动画(css、js动画库:各种动画效果)

第一种方法&#xff1a;文字从上到下显示动画&#xff1b; <div class"text-container"><div class"text">文字从上到下显示</div></div><style scoped> /*确保 keyframes 规则在引用它的任何选择器之前定义&#xff0c;以避…