Pinia(三)了解和使用state
state就是我们要定义的数据, 如果定义store时传入的第二个参数是对象, 那么state需要是一个函数, 这个函数的返回值才是状态的初始值.- 这样设计的原因是为了让
Pinia在客户端和服务端都可以工作 - 📕官方推荐使用箭头函数(
()=>{})获得更好的类型推断 -
import { defineStore } from 'pinia'; const userStore = defineStore('user', { state: () => { return { user: { name: 'tom', age: 18 }, color: 'red', userList: [], } } })
- 这样设计的原因是为了让
TypeScript- 可以定义
interface来标记类型 -
import { defineStore } from 'pinia'; interface UserInfo { name: string; age: number; } export const userStore = defineStore('user', { state: () => { return { color: 'red' as string, userList: [] as UserInfo[], user: { name: 'tom', age: 18 } as UserInfo | null } } })
- 可以定义
- 访问
state- 默认可以直接通过
store实例访问和修改state. -
const user = userStore(); function changeColor() { user.color = 'black' } function changeAge() { user.user.age++; }
- 默认可以直接通过
- 重置
state- 调用
store的$reset() -
function resetStore() { user.$reset(); }
- 调用
- 修改
state- 除了直接通过
store修改state, 还可以调用store的$patch方法. 这个方法允许一次进行多处修改 -
function patchChange() { user.$patch({ color: 'skyblue', user: { age: user.user.age + 10 } }) } - 但是这种语法有时会很麻烦, 比如我们想要对数组进行增删时, 这种语法会要求创建一个新的数组. 所以
$patch方法可以接收一个函数为参数. -
function patchChangeFunction() { user.$patch((state) => { state.userList.push({ name: 'mike', age: 19 }); state.user.age++; state.color = 'pink'; }); } - 📕也直接通过
store的$state属性修改state, 因为其内部会调用$patch -
function stupidChange() { user.$state = { color: 'hahha' } // 实际上内部调用了 // user.$patch({ color: 'hahha' }) }
- 除了直接通过
- 订阅状态
- 我们可以通过
store的$subscribe方法侦听state的改变. 使用$subscribe而不是watch()的好处是$subscribe总是在state修改之后执行一次. -
user.$subscribe((mutation, state) => { console.log('mutation', mutation); }) 
- 参数
state: 最新的state - 参数
mutationtype: 表示通过那种方式修改的值direct: 直接修改, 例如user.user.age++patch object: 通过$patch({...})传递对象的方式修改patch function: 通过$patch(() => {...})传递对象的方式修改
storeId: 定义defineStore的第一个参数, 也就是store.$id属性payload: 只有type值为plain object才会有这个值, 即为传递给$patch的对象参数.$subscribe的返回值是一个函数, 调用这个函数将取消订阅-
const stopSubscribeFunc = user.$subscribe((mutation, state) => { console.log('mutation', mutation); console.log('state', state); }) function stopSubscribe() { stopSubscribeFunc() }
-
- 📕如果在组件内调用
store.$subscribe(), 那么组件卸载时会自动清理定于, 除非将detached设置为true-
user.$subscribe((mutation, state) => { // do something... }, { detached: true })
-
- 如果要实现保存数据到
localStorage, 可以使用watchmain.js-
const pinia = createPinia(); app.use(pinia); watch( pinia.state, (state) => { console.log(state) localStorage.setItem('piniaState', JSON.stringify(state)); }, { deep: true, immediate: true } )
- 我们可以通过
本文介绍了Pinia状态管理库中的state概念和操作方法。通过定义state函数来设置初始状态,并利用箭头函数增强类型推断。文章详细阐述了如何直接修改、重置和部分更新state,以及通过$subscribe监听状态变化。此外,还讨论了如何利用watch保存数据到localStorage。
1146

被折叠的 条评论
为什么被折叠?



