修身养性,知行合一

  • 首页
  • 爱码
    • 系统
    • 数据库
    • JavaScript
    • CSharp
    • Python
  • 生活
    • 文化
    • 美食
  • 杂谈
  • 关于
修身养性,知行合一
码字,杂谈
  1. 首页
  2. 爱码
  3. 前端
  4. JavaScript
  5. Vue
  6. 正文

利用 pinia 添加局部 store

2024年7月19日 2893点热度 0人点赞 0条评论

在开发中,有些时候,我们希望可以在局部实现 store,以方便数据的临时存储。

这种需求,更多是在编写单独的复杂组件,并需要打包成库时,可能需要用到。比如,在 element-ui 中,table 组件就用到了临时存储,它们内部手动实现了一个 store 对象。这当然是一个灵活的方案,但每次手写也是很不爽的。

由于 pinia 小巧,灵活,且完整的支持类型系统,所以特别适合添加在组件中。

定义 store

首先配置好 store

import Vue from 'vue';
import { createPinia, PiniaVuePlugin } from 'pinia';

Vue.use(PiniaVuePlugin);

export const store = createPinia();

然后创建一个 store

export useInfoStore = defineStore({
  id: 'info', // 之后我们使用这个名字就可以了
  state: () => ({
    // 定义自己的内容,比如这里有一个 username
    username: ''
  }),
  actions: {
    setUsername(name: string) {
        this.username = name;
    }
  }
})

这样,我们就定义好了 store。它就可以使用了。

其实,这一步和在项目中使用没有区别,我们在项目中也是这样使用。但是,我们挂载的时机很重要,通过不同的挂载时机,我们可以区分不同的 store。

挂载 store

在我们希望使用的组件的根文件下,比如,我们的项目中,有一个 table 组件,其他地方引用时,需要从 @/components/table 中引入,我们就可以在 @/components/table/index.vue 文件中引入这个 store。

// table/index.vue

<template>
...
</template>

<script lang="ts">
import Vue from 'vue';
imnport { store } from './store'; // 比如我们刚才的 store 就定义在了这里

export default Vue.extend({
    name: 'MyTable',

    pinia: store // 在这里添加就可以了
})
</script>

这种方式,同时适用于 vue2 和 vue3。现在,我们在这个组件以内就可以完整的使用 store 中的内容,并且如果我们还要使用全局的内容,也不会有冲突。这个方式主要是因为 pinia 有一套自己的声明系统,通过 id 来区分不同的存储,所以,我们在创建时,只要把 id 写好,就不会有问题。

最后

这种方式,既简单又好用,特别适合快速开发,而且 pinia 可以和 vuex 共存,这种方式生成的组件包,在安装后,并不会影响全局功能。方便了我们自行开发一个响应式 store 的繁琐操作。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: pinia vue
最后更新:2024年7月19日

jeremyjone

这个人很懒,什么都没留下

打赏 点赞
< 上一篇
下一篇 >

文章评论

取消回复

文章目录
  • 定义 store
  • 挂载 store
  • 最后
最新 热点 随机
最新 热点 随机
node-sass 的安装 解决端口被占的问题 vue3 组件 Props 的声明方式 给 div 添加选中状态 请求的取消 rgb 颜色小数兼容问题
windows下mysql自动备份 MySql的BLOB格式 JavaScript 之 canvas(一) JavaScript 之 canvas(五)-- 椭圆、橡皮 JavaScript 之 canvas(四)-- 绘制文字 windows server 域内配置防火墙规则

(っ•̀ω•́)っ✎⁾⁾ 开心每一天

COPYRIGHT © 2021 jeremyjone.com. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

京ICP备19012859号-1

京公网安备 11010802028585号