前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Vue工程】006-Pinia

【Vue工程】006-Pinia

作者头像
訾博ZiBo
发布于 2025-01-06 07:00:30
发布于 2025-01-06 07:00:30
17800
代码可运行
举报
运行总次数:0
代码可运行

【Vue工程】006-Pinia

一、概述

1、官网

https://pinia.vuejs.org/zh/

2、官方 Demo

https://stackblitz.com/github/piniajs/example-vue-3-vite?file=README.md

3、简介

Pinia 是 Vue 的专属状态管理库,它允许你跨组件或页面共享状态。

4、优点

  1. 使用 pinia作为数据仓库,可以很方便的在多个 组件/页面 中共用同一个变量;
  2. TypeScript 的支持更加友好;
  3. 可以在不重载页面的前提下修改仓库数据,且能实时响应在页面。

二、基本使用

1、安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pnpm add pinia

2、创建 pinia 实例

创建 src/store/index.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { createPinia } from 'pinia';

const store = createPinia();

export default store;

3、在 main.ts 注册

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { createApp } from 'vue';
import './style.css';
import App from './App.vue';
// 导入路由
import router from './router';
// 导入 store
import store from './store';

const app = createApp(App);
// 注册路由
app.use(router);
// 注册 store
app.use(store);
app.mount('#app');

4、创建 user.ts

创建 src/store/user.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { defineStore } from 'pinia';

// 定义一个 userinfo 类型
export interface User {
  name?: string;
  age?: number;
  token?: string;
}

// defineStore 第一个参数是id,必需且值唯一
export const useUserStore = defineStore('user', {
  // state返回一个函数,防止作用域污染
  state: () => ({
    name: 'zibo',
    age: 26,
    token: '202305110056',
  }),
  // getters:获取 state 中的数据
  // getters 与 vue 中的 computed 类似,提供计算属性
  getters: {
    // 获取整个对象
    user: (state: User) => state,
    // 获取对象中某个属性
    newName: (state: User) => state.name + '123',
  },
  // actions:更新 state 中的数据
  actions: {
    // 更新整个对象
    setUser(user: User) {
      this.$patch(user);
    },
    // 更新对象中某个属性
    setName(name: string) {
      this.$patch({ name });
    },
  },
});

5、使用 useUserStore

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div>姓名:{{ newName }} 年龄:{{ user.age }}</div>
  <div>token:{{ user.token }}</div>
  <button @click="handleUser">更新用户</button>
  <button @click="handleName">更新名字</button>
</template>

<script lang="ts" setup>
// 导入 useUserStore
import { useUserStore } from '@/store/user';
// 引入 storeToRefs 函数,使得解构 store 仍具有响应式特性
import { storeToRefs } from 'pinia';

// 通过 useUserStore 获取到 userStore
const userStore = useUserStore();

// storeToRefs 会跳过所有的 action 属性,只暴露 state 属性
const { user, newName } = storeToRefs(userStore);

// action 属性直接解构
const { setName, setUser } = userStore;

// 更新用户
const handleUser = () => {
  setUser({
    name: '张三',
    age: 18,
    token: '123456',
  });
};

// 更新名字
const handleName = () => {
  setName('李四');
};
</script>
<style scoped></style>

三、异步 actions

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { defineStore } from 'pinia';

const getData = () => {
  return new Promise<number>((resolve) => {
    setTimeout(() => {
      resolve(Math.random() * 100);
    }, 200);
  });
};

export const useListStore = defineStore('list', {
  state: () => {
    return {
      list: [] as number[],
    };
  },
  actions: {
    async updateList() {
      try {
        const data = await getData();
        this.list.push(data);
      } catch {
        /* empty */
      }
    },
  },
});

四、store 的相互引用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { defineStore } from 'pinia';
import { useUserStore } from './user';

enum Sex {
  man = '男人',
  woman = '女人',
}

export const userSexStore = defineStore('user2', {
  state: () => {
    return {
      sex: Sex.man,
    };
  },
  actions: {
    updateSex() {
      const userStore = useUserStore();  // 引用其他store
      if (userStore.userInfo.name !== 'zhangsan') this.sex = Sex.woman;
    },
  },
});

五、路由钩子中使用 store

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { useUserStore } from '@/store/user';

router.beforeEach((to, from, next) => {
  // ✅ 这样做是可行的,因为路由器是在其被安装之后开始导航的,
  // 而此时 Pinia 也已经被安装。
  const store = useUserStore();
  if (!store.token) {
    next({
      path: '/login',
    });
  } else {
    next();
  }
});

六、数据持久化

1、安装插件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pnpm add pinia-plugin-persistedstate

2、使用插件

修改 src/store/index.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { createPinia } from 'pinia';
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';

const store = createPinia();

store.use(piniaPluginPersistedstate); // 使用持久化插件

export default store;

3、在 store 模块中启用持久化

在 src/store/user.ts 中启用:添加 persist 配置项 当更新 state 值时,会默认存储到 localStorage 中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { defineStore } from 'pinia'
export const useUserStore = defineStore('user', {
  state: () => ({
    ...
  }),
  getters: { ... },
  actions: { ... },
    
  // 开始数据持久化
  persist: true,
})

4、修改 key 与存储位置

默认存储到 localStorage 的 key 值就是 store 模块 id 值。可以修改 key 值和存储位置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//将persist: true,改为
persist: {
  key: 'storekey', // 修改存储的键名,默认为当前 Store 的 id
  storage: window.sessionStorage, // 存储位置修改为 sessionStorage
},

5、自定义要持久化的字段

默认会将 store 中的所有字段都缓存,可以通过 paths 点符号路径数组指定要缓存的字段

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
persist: {
  paths: ['user.name'], // 存储 user 对象的 name 属性
},

七、补充:修改 state 的几种方法

1、直接修改

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const add = () => store.counter ++

2、$patch 传递参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const add = () => {
  store.$patch({
    count:store.counter + 2,
  })
};

3、$patch 传递方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const add = () => {
 store.$patch(state => {
   state.counter += 10
 })
};

4、actons

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  // actions:更新 state 中的数据
  actions: {
    // 更新整个对象
    setUser(user: User) {
      this.$patch(user);
    },
    // 更新对象中某个属性
    setName(name: string) {
      this.name = name;
    },
  },

八、user.ts setup 写法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { defineStore } from 'pinia';
import { computed, reactive } from 'vue';

// 定义一个 userinfo 类型
export interface User {
  name?: string;
  age?: number;
  token?: string;
}

// defineStore 第一个参数是id,必需且值唯一
export const useUserStore = defineStore('user', () => {
  // 定义一个响应式对象
  const user = reactive<User>({
    name: 'zibo',
    age: 26,
    token: '202305110056',
  });
  // 计算属性:双倍年龄
  const doubleAge = computed(() => user.age! * 2);
  // 函数:更新整个对象
  const setUser = (newUser: User) => {
    user.age = newUser.age;
    user.name = newUser.name;
    user.token = newUser.token;
  };
  // 函数:更新对象中某个属性
  const setName = (name: string) => {
    user.name = name;
  };
  // 导出
  return {
    user,
    doubleAge,
    setUser,
    setName,
  };
});

九、在 Vue3 的 Setup 语法外使用 Pinia

如果你准备在 Vue3 的 Setup 语法外引入 Pinia 的 Store,例如 useCounterStore。

直接 import { useCounterStore } from "@/store/modules/xxxxxx" 是不行的,你得像这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import store from "@/store"

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

  return { count, doubleCount, increment }
})

/** 在 setup 外使用 */
export function useCounterStoreHook() {
  return useCounterStore(store)
}

然后引入 import { useCounterStoreHook } from "@/store/modules/xxxxxx" 即可!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-05-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
生产环境服务器变慢,如何利用Linux指令操作诊断和对性能评估(思路)?
Linux环境下诊断服务器的常用命令 Linux诊断服务器 一 top命令解析 整机排查 top 二 vmstat -n s t查看CPU的性能 vmstat -n a b mpstat和pidstat 三 free 查看内存使用情况 内存的三种单位不同的显示方式(按G按M(默认按kb)) pidstat 查看某进程内存的消耗 四 df查看硬盘使用情况 五 磁盘IO利用率 iostat -xdk s t 六 网络IO ifstat l
名字是乱打的
2022/05/13
9950
生产环境服务器变慢,如何利用Linux指令操作诊断和对性能评估(思路)?
Linux命令 之服务器性能查询
java TestLinuxDemo
疯狂的KK
2019/08/16
3.9K0
Linux命令 之服务器性能查询
性能测试 操作系统性能分析思路总结
先查看系统整体负载(可通过w,uptime,top等命令查看),可以查看15分钟前,5分钟前,1分钟前到现在负载均值。
授客
2019/09/11
1.6K0
面试官:生产服务器变慢了,你能谈谈诊断思路吗?
生产服务器变慢了,一般都是从这几点去分析:服务器整体情况, CPU 使用情况,内存,磁盘,磁盘 IO ,网络 IO
macrozheng
2020/09/08
2K0
面试官:生产服务器变慢了,你能谈谈诊断思路吗?
Linux服务器检查性能瓶颈
如果Linux服务器突然访问卡顿变慢,负载暴增,如何在最短时间内找出Linux性能问题所在?
码客说
2022/01/25
4.6K1
Linux服务器检查性能瓶颈
服务出现明显的变慢,该如何诊断处理?
在日常工作中,应用出现性能问题是不可避免的,绝大部分公司都没有专门的性能团队,出现问题还是需要我们自己去排查处理,所以掌握基本的性能知识和技能就显得很有必要,也是开发工程师进阶的必要条件,能否快准狠的定位解决问题,也是对知识、技能和能力的检验。
故里
2022/06/08
5030
服务出现明显的变慢,该如何诊断处理?
linux 常用的性能分析命令vmstat|iostat|iotop|mpstat
1.vmstat--虚拟内存统计 vmstat(VirtualMeomoryStatistics,虚拟内存统计) 是Linux中监控内存的常用工具,可对操作系统的虚拟内存、进程、CPU等的整体情况进行监视。
瑾诺学长
2021/02/25
1.6K0
一秒内诊断 Linux 服务器的性能
60,000 毫秒内对 Linux 的性能诊断 当你为了解决一个性能问题登录到一台 Linux 服务器:在第一分钟你应该检查些什么? 在 Netflix,我们有一个巨大的 EC2 Linux 云,以及大量的性能分析工具来监控和诊断其性能。其中包括用于云监控的 Atlas,以及用于按需实例分析的 Vector。虽然这些工具可以帮助我们解决大多数问题,但我们有时仍需要登录到一个服务器实例,并运行一些标准 Linux 性能工具。 在这篇文章中,Netflix Performance Engineering 团
小小科
2018/05/04
1.5K0
一秒内诊断 Linux 服务器的性能
性能测试必备监控技能linux篇14
前言 如果性能测试的目标服务器是linux系统,在如何使用linux自带的命令来实现性能测试过程的监控分析呢? 对于日常性能测试来讲,在linux下或是类Unix系统,我们必须掌握以下常用的指标查看命令。 ps pstree top free vmstat iostat iotop sar 当然还有其他命令,这里就上述笔者常用的命令推荐大家掌握。 ps ps命令能给出当前系统中进程的快照。下面我们列举几个常用的选项,对于其他的请参考官方文档或是自行搜索相关文档。 使用 -a 参数。-a 代表 all。同时加
苦叶子
2018/04/04
1.4K0
性能测试必备监控技能linux篇14
Linux服务器那么多参数该如何监控,掌握这些Linux监控命令可以早点下班!
平时我们经常需要监控内存的使用状态,常用的命令有free、vmstat、top、dstat -m等。
网络技术联盟站
2023/03/01
6360
Linux服务器那么多参数该如何监控,掌握这些Linux监控命令可以早点下班!
如何用九条命令在一分钟内检查 Linux 服务器性能?
这个命令可以快速查看机器的负载情况。在Linux系统中,这些数据表示等待CPU资源的进程和阻塞在不可中断IO进程(进程状态为D)的数量。这些数据可以让我们对系统资源使用有一个宏观的了解。
芋道源码
2018/12/29
9520
如何用九条命令在一分钟内检查 Linux 服务器性能?
如何快速分析出现性能问题的Linux服务器
本文将详细介绍以下这些Linux命令及其扩展选项的意义,及其在实践中的作用。并利用一个实际出现问题的例子,来验证这些套路是不是可行,下面工具的屏幕输出结果都来自这个出现问题的系统。当遇到一个系统性能问题时,如何利用登录的前60秒对系统的性能情况做一个快速浏览和分析,主要包括如下10个工具,这是一个非常有用且有效的工具列表。
星哥玩云
2022/07/26
1.3K0
如何快速分析出现性能问题的Linux服务器
Linux服务器性能评估与优化(一)--CPU和负载
性能调优是找出系统瓶颈并消除这些瓶颈的过程。 很多系统管理员认为性能调优仅仅是调整一下内核的参数即可解决问题, 事实上情况并不是这样。 性能调优是实现操作系统的各个子系统之间的平衡性,这些子系统包括:
黄规速
2022/04/14
5.3K0
Linux服务器性能评估与优化(一)--CPU和负载
​Linux CPU 性能优化指南
本文作者:allenxguo,腾讯 QQ 音乐后台开发工程师 本文主要帮助理解 CPU 相关的性能指标,常见的 CPU 性能问题以及解决方案梳理。 系统平均负载 简介 系统平均负载:是处于可运行或不可中断状态的平均进程数。 可运行进程:使用 CPU 或等待使用 CPU 的进程 不可中断状态进程:正在等待某些 IO 访问,一般是和硬件交互,不可被打断(不可被打断的原因是为了保护系统数据一致,防止数据读取错误) 查看系统平均负载 首先top命令查看进程运行状态,如下: PID USER
腾讯技术工程官方号
2020/08/11
8.8K0
1 分钟内对 Linux 进行性能诊断的10 个命令
当你发现 Linux 服务器上的系统性能问题,在最开始的 1 分钟时间里,你会查看哪些系统指标呢? Netflix 在 AWS 上有着大规模的 EC2 集群,以及各种各样的性能分析和监控工具。 比如我
Vincent-yuan
2021/12/20
1K0
1 分钟内对 Linux 进行性能诊断的10 个命令
Linux性能检测常用的9个基本命令
作为一个Linux运维人员,主要就是对Linux服务器的性能做一些优化,本篇博文仅仅介绍如何性能检测常用的指令!
网络技术联盟站
2020/05/14
1.9K0
如何用九条命令在一分钟内检查Linux服务器性能?
一、uptime命令 这个命令可以快速查看机器的负载情况。在Linux系统中,这些数据表示等待CPU资源的进程和阻塞在不可中断IO进程(进程状态为D)的数量。这些数据可以让我们对系统资源使用有一个宏观
小小科
2018/05/03
9700
如何用九条命令在一分钟内检查Linux服务器性能?
软件性能测试(连载8)
CPU依次处理上述任务的调度方法是切换。切换分为“进程切换”“线程切换”和“中断切换”。中断切换即在本节“软中断与硬中断”中提及的,当系统中有非常重要的请求来临,CPU停止手头工作,触发硬中断。“进程切换”和“线程切换”,在切换前都要调取上次保存的信息,在切换后都要保存当前的信息。“进程切换”和“线程切换”合在一起叫做上下文切换(context switches)。图3-21为当前仅有2个任务等待CPU处理下的进程下文切换。
顾翔
2020/02/19
8420
软件性能测试(连载8)
Linux环境监控工具汇总
GreatSQL季报(2021.12.26) https://mp.weixin.qq.com/s/FZ_zSBHflwloHtZ38YJxbA
GreatSQL社区
2022/02/13
8110
不会用这个工具,你的 Linux 服务器就是个摆设!
vmstat(VirtualMeomoryStatistics,虚拟内存统计)是 Linux 中监控内存的常用工具,可对操作系统的虚拟内存、进程、CPU 等的整体情况进行监视。
民工哥
2023/09/09
9040
不会用这个工具,你的 Linux 服务器就是个摆设!
推荐阅读
相关推荐
生产环境服务器变慢,如何利用Linux指令操作诊断和对性能评估(思路)?
更多 >
LV.1
梦创双杨数据科技股份有限公司java开发工程师
目录
  • 【Vue工程】006-Pinia
  • 一、概述
    • 1、官网
    • 2、官方 Demo
    • 3、简介
    • 4、优点
  • 二、基本使用
    • 1、安装
    • 2、创建 pinia 实例
    • 3、在 main.ts 注册
    • 4、创建 user.ts
    • 5、使用 useUserStore
  • 三、异步 actions
  • 四、store 的相互引用
  • 五、路由钩子中使用 store
  • 六、数据持久化
    • 1、安装插件
    • 2、使用插件
    • 3、在 store 模块中启用持久化
    • 4、修改 key 与存储位置
    • 5、自定义要持久化的字段
  • 七、补充:修改 state 的几种方法
    • 1、直接修改
    • 2、$patch 传递参数
    • 3、$patch 传递方法
    • 4、actons
  • 八、user.ts setup 写法
  • 九、在 Vue3 的 Setup 语法外使用 Pinia
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档