Pinia 详解

简介: Pinia 详解

Pinia 概述

Pinia 是 Vue 的存储库,它允许您跨组件/页面共享状态。和Vuex相比,Pinia有很多的优势:

  • mutations不再存在
  • 更友好的TypeScript支持,Vuex之前对TS的支持很不友好
  • 不再有modules的嵌套结构,可以灵活使用每一个store,它们是通过扁平化的方式来相互使用的

二 Pinia安装

安装pinia

npm install pinia

配置pinia

新建store文件夹,在此文件夹下新建一个index.js

mport {defineStore} from "pinia"
export  const useUsersStore=defineStore("main",{
})

在main.js中use

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

三 pinia使用详解

Store有三个核心概念: state、getters、actions,等同于组件的data、computed、methods。

store文件夹下index.js中代码如下

import {defineStore} from "pinia"
export  const useUsersStore=defineStore("main",{
    state:()=>{
        return{
            username:"helloworld",
        }
    }
})

state

<script setup>
  import {useUsersStore} from "./store/index"
  import {storeToRefs} from "pinia"
  const userStore=useUsersStore()
  // const username=userStore.username //直接获取
  // const {username}=userStore //解构
  // const {username}=storeToRefs(userStore) //使用storeToRefs方法在解构后具有响应性
</script>
<template>
  <div>
  {{userStore.username}}
  </div>
</template>

这里const username=userStore.username 和const {username}=userStore 获得的username常量不具有响应性,要想具备响应性可以使用storeToRefs方法或者直接在template中使用store实例.属性。Pinia中可以直接使用store实例去修改state中的数据。


可以通过调用 store 上的 $reset() 方法将状态重置到其初始值


store.$reset()

可以调用 $patch 方法。 它允许您使用部分“state”对象同时应用多个更改

store.$patch({
  counter: store.counter + 1,
  name: 'Abalam',
})


可以通过将其 $state 属性设置为新对象来替换 Store 的整个状态

store.$state = { counter: 666, name: 'Paimon' }

getters

getters: {
    // 自动将返回类型推断为数字
    doubleCount(state) {
      return state.counter * 2
    },
    // 返回类型必须明确设置
    doublePlusOne(): number {
      return this.counter * 2 + 1
    },
  },

访问其它getter

1. doubleCountPlusOne() {
2. return this.doubleCount + 1
3.     },


将参数传递给 getter

Getters 只是幕后的 computed 属性,因此无法向它们传递任何参数。 但是可以从 getter 返回一个函数以接受任何参数:

 doubleCountPlusOne(state) {
      return (id:number)=>state.count+id
   },

actions的使用

actions 相当于组件中的 methods。可以使用defineStore()中的actions属性定义,并且它们非常适合定义一些业务逻辑。和getters一样,在action中可以通过this访问整个store实例的所有操作。

相关文章
|
5天前
|
存储 JavaScript 开发者
Pinia和Vuex的区别
Pinia和Vuex的区别
|
6月前
|
JavaScript 前端开发 API
轻松搞定Vue3+Pinia-4-多个store
轻松搞定Vue3+Pinia-4-多个store
187 0
|
6月前
|
JavaScript 前端开发 API
轻松搞定+Vue3+Vite+Pinia-1-state
轻松搞定+Vue3+Vite+Pinia-1-state
53 0
|
6月前
|
存储 缓存 前端开发
轻松搞定 Vue3+Vite+Pinia-3-getters
轻松搞定 Vue3+Vite+Pinia-3-getters
35 0
|
5天前
|
存储 JavaScript 开发者
|
8月前
|
存储 JavaScript API
vue中使用Pinia和Vuex详解
我们使用Vue2的时候,Vuex作为一个状态管理工具在组件中使用方便了很多。Vue3推出后,虽然相对于Vue2很多东西都变了,但是核心的东西还是没有变的,比如说状态管理、路由等等。实际上,pinia就是Vuex的升级版,官网也说过,为了尊重原作者,所以取名pinia,而没有取名Vuex,所以大家可以直接将pinia比作为Vue3的Vuex。
121 0
|
5天前
|
存储 JavaScript
vuex和pinia区别
vuex和pinia区别
9 0
|
6月前
|
前端开发 API
vue3中Pinia的使用之actions
vue3中Pinia的使用之actions
|
6月前
|
JavaScript 前端开发 API
vue3中Pinia的使用总结
vue3中Pinia的使用总结
|
6月前
|
存储 缓存 JavaScript
vue3中Pinia的使用之getters
vue3中Pinia的使用之getters