pinia快速入门(模块化)

最近总结了一下pinia的用法,将其模块化,可以更改的应用到实际开发中

下载pinia

手动添加pinia到vue 项目

npm i pinia

在main.js中配置pinia
import { createApp } from 'vue'

import App from './App.vue'

//创建vue实例
const app = createApp(App)

//引入pinia
import pinia from './stores'

//pinia插件的安装配置  
app.use(pinia)

createApp(App).mount('#app')
配置好之后在store文件下声明注册pinia

顺便加一句 写组件路径时发现路径写的费劲 在vite中加了一个配置路径的别名 也就是@

但是在配置的时候,vite报错 Dynamic require of "path" is not supported

说 不支持路径的动态要求 因为vite默认不支持require的方式引入

我更换成 import path from 'path' 就可以了

以下是配置vite路径别名的代码

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

import path from 'path'
// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src')
    }
  }
})

好了,言归正传,我们在main.js中配置好了之后,因为是模块化 我们需要将stores文件夹进行拆分

文件层级如下

 

user.js代表用户模块下的数据以及方法

index.js表示所有的模块最终通过这里统一导出

index.js代码如下

//将pinia 模块化 实现统一管理
import { createPinia } from 'pinia'
//引入pinia的数据持久化插件
import persist from 'pinia-plugin-persistedstate'
//将pinia分离出来 再导入到main.js
const pinia = createPinia()
//设置数据持久化
pinia.use(persist)

export default pinia

//将pinia统一管理  将各个模块的pinia在此处统一导出
export * from './modules/user'

user.js模块的代码如下

在这里我要说,定义完数据和方法之后,一定要return,一定要return,一定要return!!!

import {defineStore} from 'pinia';
import {ref} from 'vue';
//如果需要计算属性 引入计算属性
import { computed } from 'vue';
// 涉及异步调用  这里引入了axios 正常是引入请求
import axios from 'axios'

//定义store  
// defineStore(仓库唯一标识,()=>{...})
export const useUserStore = defineStore('user',()=>{
    //定义数据
    const name = ref('pinia定义的名字')
    const age = ref(1)
    //定义方法 调用此方法 传值 给name和age赋值
    //注意语法  一定是.value!!!
    const setUser = (n,a)=>{
        name.value = n
        age.value = a
    }
    //声明基于数据派生的计算属性 getters
    const doubleCount = computed(()=>{
        return age.value*2
    })
     //声明数据
     let channelList = ref()
     //声明操作数据的方法
     const getList = async()=>{
         const res = await axios.get('http://geek.itheima.net/v1_0/channels')
         //注意!!!是.value!!!
         channelList.value = res.data.data.channels
     }
    //返回数据
    return {name,age,setUser,doubleCount,getList,channelList}
},{
    //是否开启数据持久化
    persist:true,
    persist:{
        key:'user',//存储的key
        storage:localStorage,//存储的仓库
    }
})
在页面中引入方法,调用方法获取pinia中的数据(操作数据)
/* 在页面中引入定义好的数据和方法 */
import { useUserStore } from '@/stores/index.js'
//进入页面实例化
const userStore = useUserStore()
<div>
    {{ userStore.age }}      
  </div>
  <div>
    {{ userStore.name }}
  </div>
  <div>
    {{ userStore.doubleCount}}--计算属性后的值
  </div>
   <button @click="userStore.setUser('新修改的pinia的名字',120)">修改</button>
  <button @click="actionTest">点击异步调用</button>
  <ul>
    <li v-for="(item,index) in userStore.channelList" :key="index">{{ item.name }}</li>
  </ul>
持久化在locastorage中的体现

因为我们规定了存储的Key所以显示的Key是user

这是我的一些个人见解,有不足的地方还请大家指正,欢迎大家评论交流~~~ 

在Vue3项目中使用Pinia进行模块化状态管理,可以按照以下步骤进行定义模块化。 1. 首先,在store文件夹中创建一个新的模块文件,例如system.ts,用于定义系统相关的状态和操作。 2. 在该文件中,引入Pinia并创建一个新的store实例,然后定义系统相关的状态和操作。例如: ```typescript import { defineStore } from 'pinia'; export const useSystemStore = defineStore('system', { state: () => ({ // 定义系统相关的状态 // ... }), getters: { // 定义系统相关的getter // ... }, actions: { // 定义系统相关的操作 // ... }, }); ``` 3. 同样地,创建一个新的模块文件,例如user.ts,用于定义用户相关的状态和操作。在该文件中,也需要引入Pinia并创建一个新的store实例,然后定义用户相关的状态和操作。例如: ```typescript import { defineStore } from 'pinia'; export const useUserStore = defineStore('user', { state: () => ({ // 定义用户相关的状态 // ... }), getters: { // 定义用户相关的getter // ... }, actions: { // 定义用户相关的操作 // ... }, }); ``` 4. 在主store文件(通常是index.ts或index.js)中,引入所有的模块文件,并整合它们,最后导出一个store实例。例如: ```typescript import { createPinia } from 'pinia'; import { useSystemStore } from './system'; import { useUserStore } from './user'; export const store = createPinia(); store.use(useSystemStore); store.use(useUserStore); export default store; ``` 5. 现在,你可以在Vue组件中使用store实例来访问和修改模块化的状态,并且调用相关的操作。例如: ```vue <script> import { defineComponent } from 'vue'; import { useSystemStore, useUserStore } from '@/store'; export default defineComponent({ setup() { const systemStore = useSystemStore(); const userStore = useUserStore(); // 使用系统相关的状态和操作 // ... // 使用用户相关的状态和操作 // ... }, }); </script> ``` 通过以上步骤,你可以使用Pinia进行模块化状态管理,将相关的状态和操作封装在不同的模块中,提高代码的可维护性和可扩展性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Vue3 - Pinia 模块化(详细教程)](https://blog.csdn.net/weixin_44198965/article/details/128114009)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值