Vue3 & pinia 的使用

一、Pinia 的介绍与作用

Pinia 是 Vue 官方最新推荐的、取代传统 Vuex 的一款工具,可以理解为 Vuex 的进阶版,它有几点好处:

1、数据结构更简单,简化 Vuex 声明繁琐的 module 嵌套结构带来的问题,一切都是扁平式的。

2、更好用、简洁明了的语法糖,就像 Vue3 Steup 那样,更新数据直接赋值,不再像 Vuex 那样要经过几个步骤。

3、更友好的兼容、支持 TypeScript 类型推导,不再像 Vuex 那样手动定义一套复杂的 TS 。

二、Pinia 安装&引入

2.1 安装依赖

npm i pinia
or
yarn add pinia

2.2 引入依赖

import { createApp } from 'vue'
import App from './App.vue'
import { createPinia } from 'pinia' // ++
const pinia = createPinia() // ++
const app = createApp(App) // ++
app.use(pinia) // ++
.mount('#app')

三、使用方式1

3.1 声明定义

随意建个文件并以 use 开头作为文件名,例如:useCounter.js,示例代码如下:

useXXX 仅作为一种声明规范,看你心情定义。

// src/store/useCounter.js
import { defineStore } from 'pinia'
export const userCounter = defineStore('counter', {
  state: () => ({
    count: 0,
  }),

  getters: {
    doubleCount: (state) => state.count * 2,
  },

  actions: {
    increment() {
      this.count ++
    }
  }
})

白话参数解释:

  • state 当作声明 Vue2 data or Vue3 ref/reative 里的响应式数据。
  • getters 当作 Vue2/3 里的 computed 属性。
  • actions 当作 Vue2/3 定义 methods 函数。

3.2 视图渲染

<script>
import { userCounter } from './store/useCounter'
export default {
  setup() {
    const counter = userCounter()

    return {
      counter,
    }
  },
}

</script>

<template>
  <button @click="counter.increment()">Increase</button>
  <div>
    Count: {{ counter.count }}
  </div>
</template>

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/2602242871304b8387fa625ac5a9bc83.png

四、使用方式2

4.1 声明定义

import { ref, computed } from 'vue'
import { defineStore } from 'pinia'
export const userCounter = defineStore('counter', () => {
  const count = ref(0)
  const increment = () => {
    count.value ++
  }
  const doubleCount = computed(() => count.value * 2)

  return {
    count,
    increment,
    doubleCount,
  }
})`

白话参数解释:
上面这些代码你没看错,根据使用方式1我们知道 state 形如 data 或 ref ,因此我们可以 Vue3 提供的语法来声明、获取、赋值,
Pinia 能够让我们写 store 代码就像写 Vue3 代码一样简单。

4.2 视图渲染

效果和上面一样,代码完全不用变!!!

五、高级语法糖

5.1 store.$patch

定义:store.$patch() 允许你一次性直接更新多个 state 变量。

用法1:基本类型操作

import { userCounter } from './store/useCounter'
const counter = userCounter()
const patch = () => {
	counter.$patch({
	  count: counter.count + 1,
	  // 假设 counter 还声明了 age, name 变量:
	  age: 120,
	  name: 'DIO',
	})
}
return {
	patch,
	counter,
}

<button @click="patch()">Patch</button>
<div>
   Count: {{ counter.count }}
</div>

同时更新 count, age, name 。
在这里插入图片描述

用法2:引用类型操作(增删改)

counter .$patch((state) => {
  counter.aaaa.push({ name: 'shoes', quantity: 1 })
  counter.bbbb = true
})

通过一个回调函数传 state 的方式来改变引用对象,效果图就不展示了,和上面一样实时更新。

熟悉 React useState 语法的都知道,以上两种用法正好对应 React 的 setState ,唯一不同的是,$patch 里直接操作 state,而不用 return 。

5.2 Plugin

Pinia 允许你在引入 pinia 依赖时,通过注册一些插件的形式,向 store 注入一个全局对象或方法(响应式的),便于其它 state 直接引入使用,也可以直接注入其它第三方插件对象,比如 router, antd message 等。

代码示例如下:

// app.js
import { createPinia } from 'pinia'
function MyPiniaPlugin() {
  return { 
    getPluginName: 'Hello, I am a plugin.',
    changePluginName() {
      this.getPluginName = 'Jack'
    }
   }
}

const pinia = createPinia()
pinia.use(MyPiniaPlugin)

// App.vue
<script>
import { userCounter } from './store/useCounter'
export default {
  setup() {
    const counter = userCounter()
    return {
      counter,
    }
  },
}

</script>
<template>
  <button @click="counter.changePluginName()">Change plugin name</button>
  <div>
    PluginName: {{ counter.getPluginName }}
  </div>
</template>

在这里插入图片描述

六、事项与小技巧

  • 对于【使用方式1】的语法来说,可直接使用 $reset() 来重置数据。
userCounter.$reset()

在这里插入图片描述

  • 对于【使用方式2】的语法来说,Vue3 的任何 API 语法都可以在 defineStore 里直接引用。

  • defineStore('alerts', ....} 第一个参数名字必须是唯一的,是后续访问该 state 的唯一标识符。

七、结语

  1. Pinia 能够让我们写 Store 就像写平时的 Vue2 data 和 Vue3 setup 一样简单。
  2. Pinia 支持多种写法来声明 Store ,简单且灵活,释放我们的小双手。
  3. 以上内容便是 Pinia 中比较常见的用法,我认为够用了,对其它语法感兴趣的可查阅文档。

完!

参考文献:
https://pinia.vuejs.org/core-concepts/

PiniaVue.js 的状态管理库,它在 Vue 3 中得到了原生支持。Pinia 是基于 Composition API 设计的,相比于 Vue 2 的 Vuex,Pinia 更简洁、更容易使用,并且拥有了更好的 TypeScript 支持。 要使用 Pinia,首先需要安装它: ```bash npm install pinia ``` 然后,在你的 Vue 3 应用中引入并使用 Pinia: ```javascript import { createApp } from &#39;vue&#39; import { createPinia } from &#39;pinia&#39; import App from &#39;./App.vue&#39; const app = createApp(App) // 创建 Pinia 实例 const pinia = createPinia() // 将 Pinia 实例添加到 Vue 应用中 app.use(pinia) app.mount(&#39;#app&#39;) ``` 接下来,你可以定义你的 store。一个基本的 Pinia store 包含了状态、getters、actions 和选项: ```javascript // src/stores/counter.js import { defineStore } from &#39;pinia&#39; export const useCounterStore = defineStore(&#39;counter&#39;, { state: () =&gt; { return { count: 0 } }, getters: { doubleCount: (state) =&gt; state.count * 2, }, actions: { increment() { this.count++ }, }, }) ``` 在组件中使用 store 的步骤如下: ```vue &lt;template&gt; &lt;div&gt; &lt;p&gt;Count is: {{ counterStore.count }}&lt;/p&gt; &lt;p&gt;Double count is: {{ counterStore.doubleCount }}&lt;/p&gt; &lt;button @click=&quot;counterStore.increment&quot;&gt;Increment&lt;/button&gt; &lt;/div&gt; &lt;/template&gt; &lt;script&gt; import { defineComponent } from &#39;vue&#39; import { useCounterStore } from &#39;../stores/counter&#39; export default defineComponent({ setup() { const counterStore = useCounterStore() return { counterStore, } }, }) &lt;/script&gt; ``` 通过以上步骤,你可以在 Vue 3 应用中成功地使用 Pinia 进行状态管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cookcyq

请作者喝杯暖暖的奶茶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值