前端框架 Nuxt3 集成 Pinia

本文详细介绍了如何在Nuxt3中集成Pinia状态管理库,并提供了state、getters和actions的基础使用案例。还展示了如何实现Pinia的持久化存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、Nuxt3集成Pinia

二、Pinia的使用

state的使用

1、基本使用及动态渲染

2、state的重置

3、批量更改state数据

getters的使用

1、getters的基本使用

2、getters传参

actions的使用

1、actions的基本使用

三、Pinia的持久化存储


一、Nuxt3集成Pinia

参考官方文档:简介 | Pinia

继承步骤看官方介绍,nuxt3里使用Pinia如下:

1、创建目录如下:

创建composables目录,再在该目录下创建store目录用于存放pinia的store文件,另外在composables目录下创建store.ts文件(文件名可自拟),由于composables目录下的自动导入功能,可以帮助我们快速使用store文件。

 我创建了便于管理的目录结构: 通过index索引文件可以方便的导出每个模块store的仓库。

/composables/store/user/index.ts:

export const user = defineStore("user", {
    state: () => {
        return {
            name: "Dragon Wu",
            age: 100,
            sex: "male",
            token: "xxx"
        }
    }
})

 /composables/store/index.ts索引所有store:

import {user} from "./user/index"

//模块
const stores = {
    user
}

export default stores

 /composables/store.ts自动导入,方便直接调用:

import stores from "./store/index"

export const useStore = stores

二、Pinia的使用

state的使用

1、基本使用及动态渲染

在上面基础上进行演示,

<template>
  <div>
    <span>{{ name }}</span>
    <span>{{ age }}</span>
    <span>{{ sex }}</span>
    <span>{{ token }}</span>
    <div>
      <button @click="changeName">changeName</button>
    </div>
  </div>
</template>

<script lang="ts" setup>
import {ref} from "vue";
import {storeToRefs} from "pinia";

const user = useStore.user()
// 这种解构不能动态渲染
// const {name, age, sex, token} = user
// const name = ref < string > (user.name)
// const age = ref < number > (user.age)
// const sex = ref < string > (user.sex)
// const token = ref < string > (user.token)

//可动态渲染的解构如下:
const {name, age, sex, token} = storeToRefs(user)

const changeName = () => {
  user.name = "Mark"
  console.log(user.name)
}
</script>

页面上使用也很简单,就是先调用全局的自动导入useStore,useStore下有我们的各个store模块,选择user模块,并进行调用user(),便在页面里获取到了状态仓库user。

要注意的是: 普通结构和ref均不能进行动态渲染,要想修改时页面同时生效还需引入pinia的storeToRefs来包裹store仓库。

点击按钮后store发生了改变,同时动态渲染了页面的数据。 

2、state的重置

store.$reset()

//重置store
const reset = () => {
  user.$reset()
}

调用该函数后数据变回了最初的模样:

3、批量更改state数据

store.$patch({要更改的参数})

const patch=()=>{
  user.$patch({
    name: "John",
    age: 3
  })
}

 调用函数后页面数据更新了

getters的使用

getters类似于computed拥有计算的缓存属性。

1、getters的基本使用

user的store文件修改如下:

export const user = defineStore("user", {
    state: () => {
        return {
            name: "Dragon Wu",
            age: 100,
            sex: "male",
            token: "xxx"
        }
    },
    getters: {
        getNewName: (state) => {
            return state.name + ":New"
        }
    }
})

页面中使用:  store.get属性名

<template>
    ...
    <div>
      <span>{{user.getNewName}}</span>
    </div>
  </div>
</template>
<script lang="ts" setup>
//...

const user = useStore.user()

</script>

 获取到了getters里的计算属性

更多参考:Getter | Pinia

2、getters传参

将刚才的getters修改如下:

getters: {
        getNewName: (state) => {
            return (s: string) => state.name + s
        }
    }

页面调用如下:

   <div>
      <span>{{user.getNewName('xxx')}}</span>
    </div>

可以看到传参调用成功。基本就是个函数嵌套实现。

actions的使用

actions类似于method属性,用于处理业务逻辑的

1、actions的基本使用

 也是在user的store里书写案例如下:

export const user = defineStore("user", {
    state: () => {
        return {
            name: "Dragon Wu",
            age: 100,
            sex: "male",
            token: "xxx"
        }
    },
    getters: {
        //...
    },
    actions: {
        growUp() {
            this.age++
        },
        changeName(s: string) {
            this.name = s
        }
    }
})

页面调用

<template>
  <div>
    //...
    <div>
      <span>{{ user.age }}</span>
    </div>
    <div><span>{{ user.name }}</span></div>
    <div>
      <button @click="growUp">growUp</button>
      <button @click="changeName">changeName</button>
    </div>
  </div>
</template>
<script lang="ts" setup>
//...
const user = useStore.user()
const growUp = () => {
  user.growUp()
}
const changeName = () => {
  user.changeName("John")
}

</script>

actions调用成功!

此外,向token的请求存储都可以在action里面实现。 

三、Pinia的持久化存储

pinia默认是不会自动持久化存储的,当页面刷新时数据还是会丢失,此时需要使用自动持久化插件,Nuxt3的使用方法参考插件官网文档:

Usage with Nuxt3 | pinia-plugin-persistedstate

### Nuxt 3 打包教程 Nuxt 3 提供了一个强大的构建工具链来支持项目的打包和部署。以下是关于如何进行 Nuxt 3 的打包以及 `nuxt.config.ts` 中的相关配置说明。 #### 配置文件设置 在 Nuxt 3 中,所有的全局配置都集中于 `nuxt.config.ts` 文件中。通过该文件可以调整构建行为以及其他框架选项。例如: - **Pinia 模块集成** 如果需要使用 Pinia 进行状态管理,则可以在 `modules` 字段中引入对应的模块[^1]: ```typescript export default defineNuxtConfig({ modules: [&#39;@pinia/nuxt&#39;], }); ``` - **Vite 构建优化** 对于更复杂的场景,可以通过 Vite 插件进一步定制化构建逻辑。比如预处理器选项、Rollup 输出分块策略等都可以在此处定义[^2]: ```typescript export default defineNuxtConfig({ vite: { css: { preprocessorOptions: { scss: { api: &#39;modern-compiler&#39;, }, }, }, }, build: { modulePreload: false, sourcemap: false, rollupOptions: { output: { format: &#39;es&#39;, manualChunks(id) { if (id.includes(&#39;.scss&#39;)) { return &#39;style&#39;; } if (id.includes(&#39;node_modules&#39;)) { return &#39;vendors&#39;; } }, }, }, }, }); ``` 上述代码片段展示了如何针对 SCSS 文件单独打包成一个 chunk (`style`) 并将第三方依赖分离到另一个 chunk (`vendors`) 中,从而提升加载性能并减少重复资源下载。 #### 实际打包命令 完成以上配置之后,在终端执行以下命令即可触发 Nuxt 3 的生产环境打包过程: ```bash npm run build ``` 这一步会基于当前目录下的 `nuxt.config.ts` 设置生成静态或者服务端渲染所需的产物,默认存放在 `.output/` 路径下[^3]。 #### 部署至 Nginx 流程概述 当本地成功打包完成后,需将 `.output/` 整体复制到目标服务器上,并借助 PM2 工具实现长期稳定运行的服务托管方案。具体操作步骤参见记录实例: - 使用 FTP/SFTP 将前端编译后的成果传输至上云主机; - 安装 Node.js 和 npm/yarn 环境作为基础支撑平台; - 下载安装 pm2 来监控进程健康状况; - 创建专属的应用描述 JSON 文件(如 ecosystem.config.js),指明入口脚本地址为 ./.output/server/index.mjs; 最终效果即实现了高可用性的 Web 应用程序上线发布!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值