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

Pinia的使用

Pinia官网

💡 直观
store 就像组件一样熟悉。API 旨在让您编写组织良好的 store 。

🔑 类型安全
类型是推断出来的,这意味着即使在 JavaScript 中 store 也可以为您提供自动完成功能!

⚙️ 开发工具支持
Pinia 与 Vue devtools 挂钩,为您提供增强的 Vue 2 和 Vue 3 开发体验。

🔌 可扩展
响应存储更改以通过事务、本地存储同步等扩展 Pinia。

🏗 模块化设计
构建多个 Store 并让您的捆绑程序代码自动拆分它们。

📦 极轻
Pinia 约 1kb,您甚至会忘记它的存在!

Pinia 最初是在 2019 年 11 月左右重新设计使用 Composition API 。从那时起,最初的原则仍然相同,但 Pinia 对 Vue 2 和 Vue 3 都有效,并且不需要您使用组合 API。 除了安装和 SSR 之外,两者的 API 都是相同的,并且这些文档针对 Vue 3,并在必要时提供有关 Vue 2 的注释,以便 Vue 2 和 Vue 3 用户可以阅读!

Pinia 是 Vue 的存储库,它允许您跨组件/页面共享状态。 如果您熟悉 Composition API,您可能会认为您已经可以通过一个简单的 export const state = reactive({}). 这对于单页应用程序来说是正确的,但如果它是服务器端呈现的,会使您的应用程序暴露于安全漏洞。 但即使在小型单页应用程序中,您也可以从使用 Pinia 中获得很多好处:

  1. dev-tools 支持
  2. 跟踪动作、突变的时间线
  3. Store 出现在使用它们的组件中
  4. time travel 和 更容易的调试
  5. 热模块更换
  6. 在不重新加载页面的情况下修改您的 Store
  7. 在开发时保持任何现有状态
  8. 插件:使用插件扩展 Pinia 功能
  9. 为 JS 用户提供适当的 TypeScript 支持或 autocompletion
  10. 服务器端渲染支持
// 定义
import { defineStore } from 'pinia'
export const useCounterStore = defineStore('counter', {
  state: () => {
    return { count: 0 }
  },
  actions: {
    increment() {
      this.count++
    },
  },
})
// 使用:
import { useCounterStore } from '@/stores/counter'
export default {
  setup() {
    const counter = useCounterStore()
    counter.count++
    counter.$patch({ count: counter.count + 1 })
    counter.increment()
  },
}
// 高级写法:
export const useCounterStore = defineStore('counter', () => {
  const count = ref(0)
  function increment() {
    count.value++
  }
  return { count, increment }
})
// mapStores()、mapState() 或 mapActions()
const useCounterStore = defineStore('counter', {
  state: () => ({ count: 0 }),
  getters: {
    double: (state) => state.count * 2,
  },
  actions: {
    increment() {
      this.count++
    },
    randomizeCounter() {
      this.counter = Math.round(100 * Math.random())
    },
    async fetchUserPreferences(preferences) {
      const auth = useAuthStore()
      if (auth.isAuthenticated) {
        this.preferences = await fetchPreferences()
      } else {
        throw new Error('User must be authenticated')
      }
    },
  }
})
const useUserStore = defineStore('user', {})
export default {
  computed: {
    ...mapStores(useCounterStore, useUserStore)
    ...mapState(useCounterStore, ['count', 'double']),
  },
  methods: {
    ...mapActions(useCounterStore, ['increment']),
  },
}

Pinia(发音为 /piːnjʌ/,类似于英语中的“peenya”)是最接近有效包名 piña(西班牙语中的_pineapple_)的词。 菠萝实际上是一组单独的花朵,它们结合在一起形成多个水果。 与 Store 类似,每一家都是独立诞生的,但最终都是相互联系的。

Pinia API 与 Vuex ≤4 有很大不同,即:

mutations 不再存在。他们经常被认为是 非常 冗长。他们最初带来了 devtools 集成,但这不再是问题。

  1. 无需创建自定义复杂包装器来支持 TypeScript,所有内容都是类型化的,并且 API 的设计方式尽可能利用 TS 类型推断。
  2. 不再需要注入、导入函数、调用函数、享受自动完成功能!
  3. 无需动态添加 Store,默认情况下它们都是动态的,您甚至都不会注意到。请注意,您仍然可以随时手动使用 Store 进行注册,但因为它是自动的,您无需担心。
  4. 不再有 modules 的嵌套结构。您仍然可以通过在另一个 Store 中导入和 使用 来隐式嵌套 Store,但 Pinia 通过设计提供平面结构,同时仍然支持 Store 之间的交叉组合方式。 您甚至可以拥有 Store 的循环依赖关系。
  5. 没有 命名空间模块。鉴于 Store 的扁平架构,“命名空间” Store 是其定义方式所固有的,您可以说所有 Store 都是命名空间的。

http://www.kler.cn/news/136234.html

相关文章:

  • C#判断带数字的字符串数组连续性的两种方式
  • 【C++】string类 (模拟实现详解 下)
  • 2024软考网络工程师笔记 - 第8章.网络安全
  • 【SpringCloud】06-Sentinel
  • 【AIGC】优化长提示词Prompt:提升ChatGPT输出内容的准确性与实用性
  • Nginx、Tomcat等项目部署问题及解决方案详解
  • 读像火箭科学家一样思考笔记04_第一性原理(下)
  • MATLAB算法实战应用案例精讲-【神经网络】Transformer
  • K8S(一)
  • maven升级版本后报错:Blocked mirror for repositories
  • 传递函数的推导和理解
  • 大数据HCIE成神之路之数学(3)——概率论
  • AVL树你需要了解一下
  • 代码随想录 Day50 单调栈 LeetCodeT503 下一个最大元素II T42接雨水
  • 【教3妹学编辑-mysql】详解数据库三大范式
  • 鸢尾花分类
  • 如何进行数据结构的设计和实现?
  • C++标准模板库(STL)-list介绍
  • SpringSecurity5|12.实现RememberMe 及 实现原理分析
  • 力扣labuladong一刷day13天双指针8道链表题
  • Uniapp中的事件处理:uni.emit和uni.on/uni.once
  • “非旺玖原装的PL2303,.........“解决办法
  • 线上发生锁表怎么办 show processlist命令详解
  • 基于 Junit 的接口自动化测试框架实现!
  • Avoiding Row-by-Row Processing 避免逐行处理
  • 【C++】类与对象(上)