当前位置: 首页 > news >正文

uniapp 系统学习,从入门到实战(八)—— Vuex 的使用

全篇大概 4500 字(含代码),建议阅读时间 30min


📚 目录

  1. Vuex核心概念解析
  2. 在 UniApp 中集成Vuex
  3. 状态管理与数据共享实践
  4. 总结

一、Vuex 核心概念解析

1.1 什么是状态管理

在跨多组件的大型应用中,不同页面/组件需要共享和修改相同数据时,直接通过 Props/Event 传递会导致代码冗余和维护困难。Vuex 作为 ​集中式状态管理方案,通过统一存储和管理应用级状态,实现数据流的可预测性。

1.2 Vuex 五大核心概念

State(状态)
单一数据源,所有组件共享的数据存储对象

// store/index.js
export default new Vuex.Store({state: {userInfo: null,     // 用户信息cartItems: [],      // 购物车商品themeColor: '#42b983' // 全局主题色}
})

Getters(派生状态)
基于 State 的计算属性,用于派生复杂数据

getters: {totalPrice: state => {return state.cartItems.reduce((sum, item) => sum + item.price * item.quantity, 0)},isLoggedIn: state => !!state.userInfo
}

Mutations(同步修改)
唯一修改 State 的方法,必须是同步函数

mutations: {SET_USER(state, user) {state.userInfo = user},ADD_TO_CART(state, product) {const item = state.cartItems.find(p => p.id === product.id)item ? item.quantity++ : state.cartItems.push({...product, quantity: 1})}
}

Actions(异步操作)
处理异步逻辑后提交 Mutations

actions: {async login({ commit }, credentials) {const res = await uni.request({url: '/api/login',method: 'POST',data: credentials})commit('SET_USER', res.data)}
}

Modules(模块化)
将复杂 Store 拆分为多个模块

// store/modules/cart.js
export default {namespaced: true,state: { items: [] },mutations: { /* ... */ }
}

二、在 UniApp 中集成 Vuex

2.1 安装与配置

步骤 1:安装依赖

npm install vuex --save

步骤 2:创建 Store 结构

├── store/
│   ├── index.js       # 主入口
│   ├── modules/       # 模块目录
│   │   └── user.js
│   └── types.js       # Mutation 类型常量

步骤 3:初始化 Store

// store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
import user from './modules/user'Vue.use(Vuex)export default new Vuex.Store({modules: {user}
})

步骤 4:挂载到 UniApp

// main.js
import Vue from 'vue'
import App from './App'
import store from './store'Vue.config.productionTip = falseApp.mpType = 'app'const app = new Vue({store,...App
})
app.$mount()

三、状态管理与数据共享实践

3.1 基础使用场景

场景 1:全局用户状态管理

<!-- pages/user/login.vue -->
<script>
export default {methods: {handleLogin() {this.$store.dispatch('user/login', {username: 'test',password: '123456'}).then(() => {uni.switchTab({ url: '/pages/home/index' })})}}
}
</script>

场景 2:跨页面共享购物车数据

// 组件中访问购物车
computed: {cartItems() {return this.$store.state.cart.items},total() {return this.$store.getters['cart/totalPrice']}
}

3.2 模块化高级实践

模块定义

// store/modules/user.js
export default {namespaced: true,state: () => ({token: uni.getStorageSync('token') || null,profile: null}),mutations: {SET_TOKEN(state, token) {state.token = tokenuni.setStorageSync('token', token)},SET_PROFILE(state, user) {state.profile = user}},actions: {async fetchProfile({ commit }) {const { data } = await uni.$http.get('/user/profile')commit('SET_PROFILE', data)}}
}

跨模块调用

// 在购物车模块中获取用户ID
actions: {async loadCart({ rootState, commit }) {const userId = rootState.user.profile.idconst res = await uni.$http.get(`/cart/${userId}`)commit('INIT_CART', res.data)}
}

3.3 持久化存储方案

使用 vuex-persistedstate

npm install vuex-persistedstate

// store/index.js
import createPersistedState from 'vuex-persistedstate'export default new Vuex.Store({plugins: [createPersistedState({key: 'my-app-store',paths: ['user.token', 'settings.theme'],storage: {getItem: key => uni.getStorageSync(key),setItem: (key, value) => uni.setStorageSync(key, value),removeItem: key => uni.removeStorageSync(key)}})]
})

四、最佳实践与性能优化

4.1 代码组织规范

// store/types.js
export const SET_USER = 'user/SET_USER'
export const ADD_PRODUCT = 'cart/ADD_PRODUCT'// 使用常量代替字符串
mutations: {[SET_USER](state, payload) { /* ... */ }
}

4.2 严格模式与调试

// 开发环境开启严格模式
export default new Vuex.Store({strict: process.env.NODE_ENV !== 'production'
})

4.3 性能优化策略

使用 mapState 辅助函数

<script>
import { mapState, mapGetters } from 'vuex'export default {computed: {...mapState(['themeColor']),...mapGetters(['isLoggedIn'])}
}
</script>

避免过度渲染

// 使用 Object.assign 创建新引用
mutations: {UPDATE_ITEM(state, payload) {state.items = Object.assign({}, state.items, payload)}
}

五、实战案例:全局主题切换

5.1 Store 定义

// store/modules/settings.js
export default {namespaced: true,state: () => ({theme: 'light',colors: {light: { primary: '#42b983' },dark: { primary: '#34495e' }}}),mutations: {TOGGLE_THEME(state) {state.theme = state.theme === 'light' ? 'dark' : 'light'}}
}

5.2 组件中使用

<template><view :style="{ backgroundColor: themeColor }"><button @click="toggleTheme">切换主题</button></view>
</template><script>
import { mapState, mapMutations } from 'vuex'export default {computed: {...mapState('settings', ['theme', 'colors']),themeColor() {return this.colors[this.theme].primary}},methods: {...mapMutations('settings', ['TOGGLE_THEME']),toggleTheme() {this.TOGGLE_THEME()}}
}
</script>

总结

通过 Vuex 在 UniApp 中实现状态管理,开发者可以:

  • 集中管理跨组件共享数据
  • 通过严格的修改流程保证数据可追溯
  • 实现高效的模块化开发
  • 结合 UniApp 特性处理多端存储

相关文章:

uniapp 系统学习,从入门到实战(八)—— Vuex 的使用

全篇大概 4500 字(含代码)&#xff0c;建议阅读时间 30min &#x1f4da; 目录 Vuex核心概念解析在 UniApp 中集成Vuex状态管理与数据共享实践总结 一、Vuex 核心概念解析 1.1 什么是状态管理 在跨多组件的大型应用中&#xff0c;不同页面/组件需要共享和修改相同数据时&am…...

Vue Hooks 深度解析:从原理到实践

Vue Hooks 深度解析&#xff1a;从原理到实践 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff01;点我试试&#xff01;&#xff01; 文章目录 Vue Hooks 深度解析&#xff1a;从原理到实践一、背景…...

django中序列化器serializer 的高级使用和需要注意的点

在 Django REST framework(DRF)中,序列化器(Serializer)是一个强大的工具,用于将复杂的数据类型(如 Django 模型实例)转换为 Python 原生数据类型,以便将其渲染为 JSON、XML 等格式,同时也能将接收到的外部数据反序列化为 Django 模型实例。以下将介绍序列化器的高级…...

靶场(二)---靶场心得小白分享

开始&#xff1a; 看一下本地IP 21有未授权访问的话&#xff0c;就从21先看起 PORT STATE SERVICE VERSION 20/tcp closed ftp-data 21/tcp open ftp vsftpd 2.0.8 or later | ftp-anon: Anonymous FTP login allowed (FTP code 230) |_Cant get dire…...

PHP Error处理指南

PHP Error处理指南 引言 在PHP开发过程中,错误处理是一个至关重要的环节。正确的错误处理不仅能够提高代码的健壮性,还能提升用户体验。本文将详细介绍PHP中常见的错误类型、错误处理机制以及最佳实践,帮助开发者更好地应对和处理PHP错误。 PHP错误类型 在PHP中,错误主…...

视频输入设备-V4L2的开发流程简述

一、摄像头的工作原理与应用 基本概念 V4L2的全称是Video For Linux Two&#xff0c;其实指的是V4L的升级版&#xff0c;是linux系统关于视频设备的内核驱动&#xff0c;同时V4L2也包含Linux系统下关于视频以及音频采集的接口&#xff0c;只需要配合对应的视频采集设备就可以实…...

【Manus资料合集】激活码内测渠道+《Manus Al:Agent应用的ChatGPT时刻》(附资源)

DeepSeek 之后&#xff0c;又一个AI沸腾&#xff0c;冲击的不仅仅是通用大模型。 ——全球首款通用AI Agent的破圈启示录 2025年3月6日凌晨&#xff0c;全球AI圈被一款名为Manus的产品彻底点燃。由Monica团队&#xff08;隶属中国夜莺科技&#xff09;推出的“全球首款通用AI…...

Mybatis集合嵌套查询,三级嵌套

三个表&#xff1a;房间 玩家 玩家信息 知识点&#xff1a;Mybatis中级联有关联&#xff08;association&#xff09;、集合&#xff08;collection&#xff09;、鉴别器&#xff08;discriminator&#xff09;三种。其中&#xff0c;association对应一对一关系、collectio…...

thinkphp5.1 在fetch模版就超时

场景 当被渲染模版不存在&#xff0c;请求不响应任何内容&#xff0c;过一会就timeout 排查过程 使用xdebug,追踪代码&#xff0c;发现走到D:\temporary_files\m40285_mini\40285_mini\thinkphp\library\think\exception\Handle.php&#xff0c;进入死循环&#xff0c;一直…...

Dockerfile 深入浅出:从基础到进阶全解析

Dockerfile 深入浅出&#xff1a;从基础到进阶全解析 各位同学&#xff0c;大家好&#xff01;欢迎来到今天的 Dockerfile 课程。Docker 技术在当今的软件开发和部署领域可以说是非常热门&#xff0c;而 Dockerfile 作为构建 Docker 镜像的关键文件&#xff0c;掌握它对于我们…...

CAD2025电脑置要求

Windows 系统 操作系统&#xff1a;64 位 Microsoft Windows 11 和 Windows 10 version 1809 或更高版本。 处理器 基本要求&#xff1a;2.5-2.9GHz 处理器&#xff0c;不支持 ARM 处理器。 推荐配置&#xff1a;3GHz 以上处理器&#xff08;基础&#xff09;&#xff0c;4GHz …...

android App主题颜色动态更换

如何在Android开发中更换主题颜色&#xff0c;现在他们又问了关于动态更换应用主题颜色的问题。看来他们可能在实现过程中遇到了困难&#xff0c;或者需要更详细的动态切换指导。首先&#xff0c;我需要回顾之前的回答&#xff0c;看看是否已经覆盖了动态切换的部分&#xff0c…...

微服务,服务治理nacos,负载均衡LOadBalancer,OpenFeign

1.微服务 简单来说&#xff0c;微服务架构风格[1]是一种将一个单一应用程序开发为一组小型服务的方法&#xff0c;每个服务运行在 自己的进程中&#xff0c;服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并 且可通过全自动部署机制独立部署。这…...

浅论数据库聚合:合理使用LambdaQueryWrapper和XML

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、数据库聚合替代内存计算&#xff08;关键优化&#xff09;二、批量处理优化四、区域特殊处理解耦五、防御性编程增强 前言 技术认知点&#xff1a;使用 XM…...

FastGPT 引申:混合检索完整实例

文章目录 FastGPT 引申&#xff1a;混合检索完整实例1. 各检索方式的初始结果2. RRF合并过程3. 合并后的结果4. Rerank重排序后5. 最终RRF合并6. 内容总结 FastGPT 引申&#xff1a;混合检索完整实例 下边通过一个简单的例子说明不同检索方式的分值变化过程&#xff0c;假设我…...

Socket.IO聊天室

项目代码 https://github.com/R-K05/Socket.IO- 创建项目 服务端项目和客户端项目 安装Socket依赖 服务端 npm i socket.io 客户端 npm i socket.io-client 客户端添加聊天页面 源码 服务端 app.js const express require("express") const app express()co…...

MySQL表中数据基本操作

1.表中数据的插入&#xff1a; 1.insert insert [into] table_name [(column [,column]...)] values (value_list) [,(value_list)] ... 创建一张学生表&#xff1a; 1.1单行指定列插入&#xff1a; insert into student (name,qq) values (‘张三’,’1234455’); values左…...

可狱可囚的爬虫系列课程 16:爬虫重试机制

一、retrying模块简介 在爬虫中&#xff0c;因为我们是在线爬取内容&#xff0c;所以可能会因为网络、服务器等原因导致报错&#xff0c;那么这类错误出现以后&#xff0c;我们想要做的肯定是在报错处进行重试操作&#xff0c;Python提供了一个很好的模块&#xff0c;能够直接帮…...

第十五届蓝桥杯----B组cpp----真题解析(小白版本)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 必看前言&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;一、试题A&#xff1a;握手问题1.题意分析2.代码解答 二、试题B&#xff1a;小球反弹1.题意…...

软考架构师笔记-数据库系统

1.7 数据库系统 三级模式-两级映射 三级模式 外模式&#xff1a;用户视图概念模式&#xff1a;只涉及描述内模式&#xff1a;存储方式的描述 两级映射 外模式-概念模式映射概念模式-内模式映射 数据库的设计 步骤 需求分析 输出为需求分析、数据流图(Data FLow Diagram-DF…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...