当前位置: 首页 > news >正文

vue3使用pinia

文章目录

  • 为什么要使用 Pinia
  • 安装
  • 挂载
  • 创建store
  • 使用store
  • 替换Store整个状态
  • 修改store数据
  • 使用Getters
  • 多个store互相调用
  • 异步Actions
  • Actions互相调用
  • Pinia数据持久化

为什么要使用 Pinia

Pinia 是新一代的状态管理器,由 Vue.js团队中成员所开发的,因此也被认为是下一代的 Vuex,即 Vuex5.x,尤雨溪推荐在vue3项目中替代Vuex

  • 对 typescript 兼容性更好;
  • 去除 mutations,只有 state,getters,actions;
  • 修改状态可以直接修改,也可以在action中修改;
  • actions中 支持使用同步和异步;
  • 更加小巧,压缩后的体积只有1.6kb;
  • 可以创建多个store;

安装

npm i pinia

挂载

mian.js


	import { createPinia } from 'pinia';
	const pinia = createPinia();
	app.use(pinia);
	app.mount('#app')

创建store

store/index.js


import { defineStore } from "pinia"
 
 /**
   * 这个 第一个参数main,也称为 id,是必要的,Pinia 使用它来将 store 连接到 devtools。 
   * 将返回的函数命名为use...(更好的语义化) 是跨可组合项的约定,以使其符合你的使用习惯。
 */
export const useStore  = defineStore('main', {

  state: () => {
    return {
      count: 0,
      list: [1, 2, 3, 4 ]
    }
  },
  /**
   * 用来封装计算属性 有缓存功能  类似于computed
   */
  getters: {
    getNum(state){
        return `我是一个计数器${state.count}`
    }
    
    //或者不使用state传递参数直接使用this
   	//getNum(){
    //    return `我是一个计数器${this.count}`
   // }
   
  },
  /**
   * 编辑业务逻辑  类似于methods
   */
  actions: {
    changeState(){
        this.count = 123;
    }
  }
 
})

使用store

	
<template>
	{{ store.count }}
</template>

import { useStore } from '@/store/index.js'

const store = useStore();


如果不想使用stroe.可以使用解构,但使用解构会使其失去响应式,这时候可以用 pinia 的提供的 storeToRefs

<template>
	{{ count }}
</template>

import { storeToRefs } from 'pinia';

//解构
const { count, list } = storeToRefs(store);

替换Store整个状态


store.$state = { counte: 666, list: 'Paimon' }

修改store数据

简单修改


store.count++;

除了直接用 store.counte++ 修改 store,你还可以调用 $patch 方法。 它允许您使用部分“state”对象同时应用多个更改:


store.$patch({
  counte: store.counte+ 1,
  list: [1,1,1],
})

$patch 方法也接受一个函数批量修改集合内部分对象的情况:


store.$patch((state) => {
    state.count = state.count += 100;
    state.list = [1, 2, 3];
})

通过action修改

store/index.js


  actions: {
    changeState(){
        this.count = 123;
    }
  }

调用 actions 中定义的方法


import { useStore } from '@/store/index.js';
import { storeToRefs } from 'pinia';

const store = useStore();

//调用
store.changeState();

使用Getters

Pinia中的 getters 与vue中的getter同为计算属性,具有缓存性,如果getters中的属性值未发生变化,多次调用只执行一次

store/index.js


  getters: {
    getNum(){
        return ` 计数 ${this.count} `
    }
  },
  

<template>

    {{ store.getNum }}
    
</template>

多个store互相调用

新建 store/user.js


import { defineStore } from "pinia" 
 
export const useUser  = defineStore('user', {
  state: () => {
    return {
     name:'小明'
    }
  },
  getters: {},
  actions: {}
})

store/index调用


import { defineStore } from "pinia" 
import {useUser} from './user.js'

export const useStore  = defineStore('main', {
  state: () => {
    return {
      count: 0,
      list: [1, 2, 3, 4 ],
      name: 123
    }
  },
  
  actions: {
  
    changeState(){
    
    	//调用注意要加括号
        this.count = useUser().name;
        
    }
  } 
  
})

异步Actions

Actions支持 async/await 的语法,方便处理异步数据


 actions: {
 
    async getData(id) {
      const { data } = await api.getDate(id);
      return data
    },
    
  }
  

Actions互相调用


 actions: {
 
    async getData(id) {
      const { data } = await api.getDate(id);
      return data
    },
	
	setData(){
		this.getData('123');
	}
    
  }
  

Pinia数据持久化

npm install pinia-plugin-persist

main.js


import { createPinia } from 'pinia'
const app = createApp(App);
import piniaPersist from 'pinia-plugin-persist'
const pinia = createPinia()
pinia.use(piniaPersist)
app.use(pinia)
app.mount('#app')

store/index persist开启缓存配置


import { defineStore } from "pinia"
export const useStore  = defineStore('main', {

state: () => {
    return {
      count: 0,
      list: [1, 2, 3, 4 ],
      name: 123
    }
  },    
 
  getters: {},

  actions: {},
  
  // persist: true,//缓存所有数据
  
  persist: {
    enabled: true, // 开启数据缓存
    strategies: [
      {
        key: 'myuser',//存储key值
        storage: localStorage, // 默认是sessionStorage
        paths: ['count'] //指定字段存储数据
      }
    ],
  }
 
})
  

在这里插入图片描述

在这里插入图片描述

相关文章:

  • 快用Python(Pygame)代码燃放起你专属的烟花吧,咝......咻——嘭~
  • 关于CSDN编程竞赛的一些感受
  • 二分答案合辑
  • Eclipse Theia技术揭秘——自定义布局
  • 机器学习模型4——聚类1(k-Means聚类)
  • React 学习笔记总结(二)
  • ssh登陆概率性失败,报错:kex_exchange_identification
  • 微服务项目:尚融宝(60)(核心业务流程:个人中心)
  • 【P8179】【EZEC-11】Tyres(背包问题,决策单调性,分治)
  • <Linux复习>权限概念上
  • 嵌入式开发:嵌入式安全的6个要点
  • 第2章 Linux的Shell基础(一)
  • 0926物体检测和数据集
  • 【PAT甲级】1064 Complete Binary Search Tree
  • ASEMI快恢复二极管FR207参数,FR207图片,FR207应用
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • AHK 中 = 和 == 等比较运算符的用法
  • JAVA 学习IO流
  • MobX
  • npx命令介绍
  • Python语法速览与机器学习开发环境搭建
  • SpringCloud集成分布式事务LCN (一)
  • 从tcpdump抓包看TCP/IP协议
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 解析 Webpack中import、require、按需加载的执行过程
  • 老板让我十分钟上手nx-admin
  • 排序算法之--选择排序
  • 前端学习笔记之观察者模式
  • 如何学习JavaEE,项目又该如何做?
  • 一些关于Rust在2019年的思考
  • 字符串匹配基础上
  • Hibernate主键生成策略及选择
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 正则表达式-基础知识Review
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • #100天计划# 2013年9月29日
  • #pragma once
  • #Z0458. 树的中心2
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (第二周)效能测试
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (附源码)ssm码农论坛 毕业设计 231126
  • (小白学Java)Java简介和基本配置
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (转载)PyTorch代码规范最佳实践和样式指南
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .NET Remoting学习笔记(三)信道
  • .Net6 Api Swagger配置
  • .NET处理HTTP请求
  • .net和jar包windows服务部署
  • .NET下的多线程编程—1-线程机制概述
  • .NET学习教程二——.net基础定义+VS常用设置