Vue3推荐的替代Vuex的新一代状态管理工具:Pinia 配置教程

Pinia 官方网站:pinia.vuejs.org

一、安装Pinia

npm install pinia --save

二、配置Pinia

(默认项目都使用 TypeScript ,默认后缀都是.ts)
在 src 目录内新建一个 store 的目录,然后在此目录下新建一个 index.ts 文件,内容如下:

import { createPinia } from 'pinia'

const store = createPinia()

export default store

三、在项目中注册并启用Pinia

打开项目下的 “main.ts”,在里面追加pinia的内容:

import { createApp } from 'vue'
import App from './App.vue'
// 导入Pinia状态管理器
import store from './store/index'

createApp(App).use(store).mount('#app')

四、创建一个State

在 src/store 目录下新建一个 user.ts 文件,内容如下:

import { defineStore } from 'pinia'

export const userStore = defineStore('userInfo', {
	state: () => {
		return {
			userID: '10001',
			userName: '某同学',
		}
	},
	getters: {
		fullName: (state) => {
			return `${state.userName}(${state.userID})`
		},
	},
	// action 支持 async/await 的语法,可以自行添加使用
	// action 里的方法相互之间调用,直接用 this 访问即可
	actions: {
		updateUserName(name: string) {
			this.userName = name
		},
	},
})

五、在页面中使用这个Store

例如需要在 app.vue 这个页中使用,内容如下:

<template>
	{{ store.fullName }}
	<p>
		<button @click="onChangeName()">改变Store里的名字</button>
	</p>
</template>

<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { userStore } from '@/store/user'

const store = userStore()

const onChangeName = (name) => {
    store.updateUserName(name ?? '李同学')
}

onMounted(() => {
    onChangeName('张同学')
})

</script>

<style scoped></style>

到此一个基础的store就已经完成,如果还需要结合Local Storage持久化存储数据,接着往下看

六、Pinia的数据持久化,使用插件(pinia-plugin-persist)

pinia plugin persist官方网站:pinia-plugin-persist

1、安装 pinia-plugin-persist

npm install pinia-plugin-persist --save

2、在 Pinia 中启用 pinia-plugin-persist

打开 src/store/index.ts ,修改内容如下:

import { createPinia } from 'pinia'
import piniaPluginPersist from 'pinia-plugin-persist'

const store = createPinia()
store.use(piniaPluginPersist)

export default store

3、在一个state中使用localStorage存储数据

打开上面创建的 user.ts 文件,修改内容如下:

import { defineStore } from 'pinia'

export const userStore = defineStore('userInfo', {
	state: () => {
		return {
			userID: '10001',
			userName: '某同学',
		}
	},
	getters: {
		fullName: (state) => {
			return `${state.userName}(${state.userID})`
		},
	},
	actions: {
		updateUserName(name: string) {
			this.userName = name
		},
	},
	// 开启数据缓存
	persist: {
		enabled: true,
		strategies: [
			{
				key: 'my_project', // key可以自己定义,不填的话默认就是这个store的ID
				storage: localStorage, // storage可以填sessionStorage,localStorage
				paths: ['userID', 'userName'] }, // paths是需要存储的字段,不填就是全部
			},
		],
	},
})

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值