nuxt3:使用pinia

一、官网介绍为什么使用pinia

Pinia 是 Vue 的存储库,它允许您跨组件/页面共享状态。 如果您熟悉 Composition API,您可能会认为您已经可以通过一个简单的 export const state = reactive({}). 这对于单页应用程序来说是正确的,但如果它是服务器端呈现的,会使您的应用程序暴露于安全漏洞。 但即使在小型单页应用程序中,您也可以从使用 Pinia 中获得很多好处:

  • dev-tools 支持

  • 跟踪动作、突变的时间线

  • Store 出现在使用它们的组件中

  • time travel 和 更容易的调试

  • 热模块更换

  • 在不重新加载页面的情况下修改您的 Store

  • 在开发时保持任何现有状态

  • 插件:使用插件扩展 Pinia 功能

  • 为 JS 用户提供适当的 TypeScript 支持或 autocompletion

  • 服务器端渲染支持

二、代码实践

2.1、安装

pnpm add pinia

2.2、main.ts

import { createApp } from 'vue'
import '@/styles/index.less'
import '@/styles/reset.less'
import App from './App.vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import Antd from 'ant-design-vue'
import 'ant-design-vue/dist/antd.css'
import router from "./routers/index";
import { api } from './api/index'
import { createPinia } from 'pinia'
import piniaPersist from 'pinia-plugin-persist' // pinia持久化
import 'vue-global-api';

const app = createApp(App)
const pinia = createPinia()
pinia.use(piniaPersist)
app.use(ElementPlus)
app.use(Antd)
app.use(router)
app.use(pinia)
app.config.globalProperties.$api = api
app.mount('#app')

2.3、src/views/stores/index.ts

import { defineStore } from "pinia";
import { ref, computed } from "vue"
// count1 是 id 须唯一
// options方法
export const useCountStore = defineStore('count1',{
    // 在大多数情况下,state 都是你的 store 的核心。人们通常会先定义能代表他们APP 的 state。
    // 在 Pinia 中,state 被定义为一个返回初始状态的函数。这使得Pinia 可以同时支持服务端和客户端。
    state: () => { // 类似vue2的 data,data(){return{}} 防止服务端数据污染;----推荐使用箭头函数,为了完整类型推理;
        return {
            // 所有属性将自动推断出他们的类型
            counter: 0
        }
    },
    persist: { // 持久化
        enabled: true,
    },
    getters: { // 相当于computed 计算属性
        doubleCount (state){
            return state.counter * 2
        }
    },
    actions: { // 相当于methods
        addCounter(){
            // this指向对应的store仓库
            this.counter += 1
        }
    }
})
// count2 是 id 须唯一
// setup方法
export const useCount2Store = defineStore('count2', ()=> {
    const counter = ref(1) // state
    const gettersCounter = computed(()=>{
        return counter.value + 5
    })
    function addCounter(){
        counter.value += 1
    }
    return { counter, gettersCounter, addCounter}
})

2.4、src/views/pinia/index.vue

<template>
  <div class="container">
    <div>pinia-options</div>
    <div>count1.counter: {
    
    { count1.counter }}</div>
    <div>count1.doubleCount {
    
    { count1.doubleCount }}</div>
    <div @click="count1.addCounter()"> count1.counter: addCount+=1 </div>
    <div @click="changeCount1()"> count1.counter: addCount+=2 </div>
    <div>pinia-setup</div>
    <div>count2.counter: {
    
    { count2.counter }}</div>
    <div>count2.gettersCounter {
    
    { count2.gettersCounter }}</div>
    <div @click="count2.addCounter()"> count2.counter: addCount++ </div>
    <div @click="changeCount2()"> count2.counter: addCount+=2 </div>
  </div>
</template>

<script setup lang="ts">
import { useCountStore, useCount2Store } from '@/views/stores/index'
const count1 = useCountStore()
const count2 = useCount2Store()
console.log('count1:', count1)
console.log('count2:', count2)
const changeCount1 = () => {
  // 方式一、需要修改数据时直接修改
  count1.counter += 2
  // 方式二、如果需要修改多个,可以使用pinia的$patch方法,推荐使用
  // count1.$patch({
  //   counter: count1.counter += 2
  // })
  // 方式三、对于复杂的方法可以封装actions的函数
  // count1.$patch((state)=>{}
  //   state.counter = count1.counter += 2
  // )
  // 方式四、对于复杂的方法可以封装actions的函数
  // count1.addCounter
}
const changeCount2 = () => {
  count2.counter += 2
}
</script>

<style scoped lang="less">
</style>

2.5、浏览器展示

三、欢迎交流指正,关注我,一起学习。

参考链接

bilibili-pinia-写网页的叮叮

猜你喜欢

转载自blog.csdn.net/snowball_li/article/details/128651770