vue中的pinia

2023-05-21 21:59:34 浏览数 (1)

Pinia是什么?

Pinia是vue的专属状态库,允许开发者跨组件或页面共享状态,他是一个拥有组合式API的Vue状态管理库,支持vue2和vue3,有三个概念,state、getter 和 action,我们可以假设这些概念相当于组件中的 data、 computed 和 methods。。

Pinia的使用

  • 使用npm包管理工具安装:npm install pinia
  • 在main.js中创建一个 pinia 实例 (根 store) 并将其传递给应用,如下所视:
代码语言:txt复制
import { createApp } from 'vue'
// 引入创建 pinia 实例的api
import { createPinia } from 'pinia'
import App from './App.vue'

const pinia = createPinia()
const app = createApp(App)

// 注册为vue插件
app.use(pinia)
app.mount('#app')
  • 在src目录下创建一个stores文件夹,里面创建一个js文件,作为一个存储库

defineStore第二个参数传入Option对象

与 Vue 的选项式 API 类似,我们也可以传入一个带有 stateactions 与 getters 属性的 Option 对象

  • 存储库中的代码如下:
代码语言:txt复制
// 1.导入 defineStore 定义Store
import {defineStore} from 'pinia'

// 6.导出该store

// defineStore第一个参数是独一无二的字符串,方便后续组件访问该store
// 第二个参数可以接收一个对象,也可以接收一个函数。
export const useCounterStore = defineStore('counter', {

  // 3.state 都是你的 store 的核心,state 被定义为一个返回初始状态的函数;可以通过 this 访问 state 中的数据
  state: () => ({ count: 0 }),

  // 4.Getter 完全等同于 store 的 state 的计算值。可以通过 defineStore() 中的 getters 属性来定义它们。推荐使用箭头函数,并且它将接收 state 作为第一个参数
  // 如果getters中想要访问其他getters我们可以通过this访问到整个store实例
  getters: {
    double: (state) => state.count * 2,
  },

  // 5.可通过this访问整个store实例,并且action可以是异步的
  actions: {
    increment() {
      console.log(this)
      this.count  
    },
  },
})

defineStore第二个参数传入Setup 函数

也存在另一种定义 store 的可用语法。与 Vue 组合式 API 的 Setup 函数相似,我们可以传入一个函数,该函数定义了一些响应式属性和方法,并且返回一个带有我们想暴露出去的属性和方法的对象。

代码语言:txt复制
export const useCounterStore = defineStore('counter', () => {
  const count = ref(0)
  function increment() {
    count.value  
  }

  return { count, increment }
})
  • 组件中使用store
代码语言:txt复制
<script setup>
  // 引入创建store实例的函数
  import {useCounterStore} from '@/stores/count'
  const countStore = useCounterStore()
</script>

<template>
  {{countStore.count}},{{countStore.double}}
  <button @click="countStore.increment">点击 1</button>
</template>

<style>

</style>

上面代码我们访问shore中的函数或者数据都要使用 store. 会麻烦,我们可以使用解构的形式将我们需要的数据提取出来:

代码语言:txt复制
<script setup>
  import { storeToRefs } from 'pinia'
  import {useCounterStore} from '@/stores/count'
  const countStore = useCounterStore()
  // 这样直接解构会失去数据的响应式
  // let {count, double, increment} = countStore;
  let { increment} = countStore;
  // storeToRefs()。它将为每一个响应式属性创建引用
  let {count, double} = storeToRefs(countStore);
</script>

注意:本文是接收在vue3<script setup>使用pinia

插件

由于有了底层 API 的支持,Pinia store 现在完全支持扩展。以下是你可以扩展的内容:

    为 store 添加新的属性

    定义 store 时增加新的选项

    为 store 增加新的方法

    包装现有的方法

    改变甚至取消 action

    实现副作用,如本地存储

    仅应用插件于特定 store

插件是通过 pinia.use() 添加到 pinia 实例的。最简单的例子是通过返回一个对象将一个静态属性添加到所有 store。

关于插件的更多用法可以查看官网:Pinia插件

希望本片文章能够帮助大家快速入门pinia,感谢大家的观看!

0 人点赞