(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)
目录
Vue3.3新特性
defineOptions
defineModel
pinia
介绍
与 Vuex 3.x/4.x 的比较
安装
核心概念
定义 Store
Option Store
Setup Store
storeToRefs
State
Getter
Action
pinia-plugin-persistedstate
概述
安装
用法
背景说明:有为了从 store 中提取属性时保持其响应性,你需要使用
storeToRefs()
。它将为每一个响应式属性创建引用。当你只使用 store 的状态而不调用任何 action 时,它会非常有用。请注意,你可以直接从 store 中解构 action,因为它们也被绑定到 store 上:State
在大多数情况下,state 都是你的 store 的核心。人们通常会先定义能代表他们 APP 的 state。在 Pinia 中,state 被定义为一个返回初始状态的函数。这使得 Pinia 可以同时支持服务端和客户端。
import { defineStore } from 'pinia' const useStore = defineStore('storeId', { // 为了完整类型推理,推荐使用箭头函数 state: () => { return { // 所有这些属性都将自动推断出它们的类型 count: 0, name: 'Eduardo', isAdmin: true, items: [], hasChanged: true, } }, })
默认情况下,你可以通过
store
实例访问 state,直接对其进行读写。const store = useStore() store.count++
Getter
Getter 完全等同于 store 的 state 的计算值。可以通过
defineStore()
中的getters
属性来定义它们。推荐使用箭头函数,并且它将接收state
作为第一个参数:export const useStore = defineStore('main', { state: () => ({ count: 0, }), getters: { doubleCount: (state) => state.count * 2, }, })
然后你可以直接访问 store 实例上的 getter 了:
Double count is {{ store.doubleCount }}
Action
Action 相当于组件中的 method。它们可以通过
defineStore()
中的actions
属性来定义,并且它们也是定义业务逻辑的完美选择。export const useCounterStore = defineStore('main', { state: () => ({ count: 0, }), actions: { increment() { this.count++ }, randomizeCounter() { this.count = Math.round(100 * Math.random()) }, }, })
类似 getter,action 也可通过
this
访问整个 store 实例,并支持完整的类型标注(以及自动补全)。不同的是,action
可以是异步的,你可以在它们里面await
调用任何 API,以及其他 action!下面是一个使用 Mande 的例子。请注意,你使用什么库并不重要,只要你得到的是一个Promise
,你甚至可以 (在浏览器中) 使用原生fetch
函数:import { mande } from 'mande' const api = mande('/api/users') export const useUsers = defineStore('users', { state: () => ({ userData: null, // ... }), actions: { async registerUser(login, password) { try { this.userData = await api.post({ login, password }) showTooltip(`Welcome back ${this.userData.name}!`) } catch (error) { showTooltip(error) // 让表单组件显示错误 return error } }, }, })
Action 可以像函数或者通常意义上的方法一样被调用:
pinia-plugin-persistedstate
概述
本插件兼容
pinia^2.0.0
,在使用之前请确保你已经 安装 Pinia。pinia-plugin-persistedstate
丰富的功能可以使 Pinia Store 的持久化更易配置:安装
1.用你喜欢的包管理器安装依赖
- pnpm:
pnpm i pinia-plugin-persistedstate
- npm:
npm i pinia-plugin-persistedstate
- yarn:
yarn add pinia-plugin-persistedstate
2.将插件添加到 pinia 实例上
import { createPinia } from 'pinia' import piniaPluginPersistedstate from 'pinia-plugin-persistedstate' const pinia = createPinia() pinia.use(piniaPluginPersistedstate)
用法
创建 Store 时,将
persist
选项设置为true
。使用组合式 Store 语法:
import { defineStore } from 'pinia' export const useStore = defineStore( 'main', () => { const someState = ref('你好 pinia') return { someState } }, { persist: true, } )