场景是采用vite搭建的vue3.0+ts项目,官方更推荐使用pinia这个状态管理工具,现在就开始学习记录一下
安装:
npm install pinia //下载安装
引入:在main.ts中全局引入:
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
const app = createApp(App)
const pinia = createPinia()
app.use(pinia)
app.mount('#app')
定义store文件夹再定义index.ts入口文件
state: 定义store的初始状态,也就是数据类似vue2中的data
import { defineStore } from 'pinia'
interface UserState {
name: string
age: number
isAdmin: boolean
}
export const useUserStore = defineStore('user', {
state: (): UserState => ({
name: 'Alice',
age: 25,
isAdmin: false
})
})
import { useUserStore } from '@/stores/user'
const store = useUserStore()
console.log(store.name)
getters:类似于computer计算属性,
可以通过this去访问store实例,包括函数和初始值
export const useUserStore = defineStore('user', {
state: () => ({
name: 'Alice',
age: 25
}),
getters: {
isAdult(): boolean {
return this.age >= 18
},
}
})
const store = useUserStore()
console.log(store.isAdult)
actions:可以进行同步或异步的操作
可以通过this去访问store实例,包括函数和初始值
export const useUserStore = defineStore('user', {
state: () => ({
users: [] ,
}),
actions: {
addUser(user: string) {
this.users.push(user)
},
async fetchUsers() {
try {
const response = await api.getUsers()
this.users = response.data
} catch (error) {
console.error('Failed to fetch users:', error)
}
},
}
})
const store = useUserStore()
store.addUser('1314')
id:用于store的唯一标识
export const useUserStore = defineStore('user', {
})
$符号:store中内置的属性和方法
$patch:批量修改state中的值
store.$patch({
name: 'Bob',
age: 30
})
store.$patch((state) => {
state.items.push({ id: 1 })
state.hasChanged = true
})
$reset:重置 state 为初始值
store.$reset()
$subscribe:订阅 state 变化
store.$subscribe((mutation, state) => {
console.log('State changed:', mutation.type, state)
})
$state:访问整个 state 对象
console.log(store.$state)
组合式 Store 语法:类似vue中的写法
export const useCounterStore = defineStore('counter', () => {
const count = ref(0)
const name = ref('Eduardo')
const doubleCount = computed(() => count.value * 2)
function increment() {
count.value++
}
return { count, name, doubleCount, increment }
})