pinia在vue3中的使用

299 阅读3分钟

pinia在vue3中的使用

一、pinia是什么?

  1. 官网解释:

Pinia 是 Vue 的存储库,它允许您跨组件/页面共享状态。

  1. 从上面官网的解释不难看出,pinia和Vuex的作用是一样的,它也充当的是一个存储数据的作用,存储在pinia的数据允许我们在各个组件中使用。

  2. 实际上,pinia就是Vuex的升级版,官网也说过,为了尊重原作者,所以取名pinia,而没有取名Vuex,所以大家可以直接将pinia比作为Vue3的Vuex。

  3. 优点:

  • Vue2和Vue3都支持,这让我们同时使用Vue2和Vue3的小伙伴都能很快上手。
  • pinia中只有state、getter、action,抛弃了Vuex中的Mutation,Vuex中mutation一直都不太受小伙伴们的待见,pinia直接抛弃它了,这无疑减少了我们工作量。
  • pinia中action支持同步和异步,Vuex不支持
  • 良好的Typescript支持,毕竟我们Vue3都推荐使用TS来编写,这个时候使用pinia就非常合适了
  • 无需再创建各个模块嵌套了,Vuex中如果数据过多,我们通常分模块来进行管理,稍显麻烦,而pinia中每个store都是独立的,互相不影响。
  • 体积非常小,只有1KB左右。
  • pinia支持插件来扩展自身功能。
  • 支持服务端渲染。

二、下面是使用Pinia的详细步骤:

  1. 安装Pinia:在项目目录下运行以下命令安装Pinia:
     npm install pinia
    
  2. 创建和配置Pinia实例:在main.ts中,创建一个新的Pinia实例,并将其配置为Vue应用程序的插件,添加以下代码:
        import { createPinia } from 'pinia'
        const app = createApp(App)
        const pinia = createPinia()
        app.use(pinia)
        app.mount('#app')
    
  3. 定义Store,在你的应用程序中,创建一个或多个Store来管理状态。每个Store都是一个类,通过defineStore函数定义。
        import { defineStore } from "pinia" 
        export const useMain = defineStore('useStore', {    // 定义容器
          /**
           * 存储全局状态
           * 注意点:必须是箭头函数: 为了在服务器端渲染的时候避免交叉请求导致数据状态污染
          */
          state: () => {
            return {
             
            }
          },
          /**
           * 用来封装计算属性 有缓存功能  类似于computed
           */
          getters: {
            
          },
          /**
           * 编辑业务逻辑  类似于methods
           */
          actions: {
              
          }
        })
    
  4. pinia实现数据持久化。
    1. 下载 pinia-plugin-persistedstate

        npm i pinia-plugin-persistedstate
      
    2. 注册,在main.ts中加入

        import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
        pinia.use(piniaPluginPersistedstate);
      
    3. 存储到localstorage。只需在store/index中加入persist:true即可(默认存储数据到localStorage中,键名默认为store设置的id名)。

    4. // 开启数据持久化
      persist:true,
      
    5. 存储在sessionStorage,键名为key

        persist:{
            // 修改存储中使用的键名称,默认为当前 Store的 id
            key: 'storekey',
            // 修改为 sessionStorage,默认为 localStorage
            storage: window.sessionStorage
         }
      
  5. 在页面中使用。
      import { useMain } from '../store' // 引入store
      const useStoreMain = useMain()
    
  6. 如果直接从pinia中解构数据,会丢失响应式,使用storeToRefs可以将store实例中的状态转换为ref对象,保证解构出来的数据也是响应式的。
      import { storeToRefs } from 'pinia'
      const { count } = storeToRefs(useStoreMain)