<uniapp><vuex><状态管理>在uniapp中,如何使用vuex实现数据共享与传递?

前言

本专栏是基于uniapp实现手机端各种小功能的程序,并且基于各种通讯协议如http、websocekt等,实现手机端作为客户端(或者是手持机、PDA等),与服务端进行数据通讯的实例开发。

发文平台

CSDN

环境配置

系统:windows
平台:visual studio code、HBuilderX(uniapp开发)
语言:javascript、html、vue
库:websocket、http

概述

本文主要介绍一下在uniapp中如何使用vuex来实现状态管理,即数据在页面与组件间的传递与共享。

注:本文是uniapp开发学习过程的一个记录,权作为以后参考。

1、vuex简介

Vuex 是专门为 Vue.js 设计的状态管理库,以利用 Vue.js 的细粒度数据响应机制来进行高效的状态更新。

vuex与全局变量的区别:
在这里插入图片描述

什么时候需要用vuex?

  • 当一个组件需要多次派发事件时。例如购物车数量加减。
  • 跨组件共享数据、跨页面共享数据。例如订单状态更新。
  • 需要持久化的数据。例如登录后用户的信息。
  • 当您需要开发中大型应用,适合复杂的多模块多页面的数据交互,考虑如何更好地在组件外部管理状态时。

vuex作为状态管理,有5个核心:state、getter、mutation、action、module。

2、简单示例

先看下在uniapp中使用vuex的简单示例。我们在项目的根目录下面,新建一个目录:
store,在store路径下创建index.js文件,并添加代码:

import { createStore } from 'vuex'
const store = createStore({state:{name:'zhou',age:'30'}
})
export default store

注意:以上代码是基于vue3版本下的,如果是vue2,则代码如下:

import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)// 创建 Vuex 实例
const store = new Vuex.Store({state: {name:'zhou',age:'30'}
})// 导出默认实例
export default store

我们继续,以上我们新建一个store实例,我们需要在导入它,在main.js文件中添加:

import App from './App'
// #ifndef VUE3
import Vue from 'vue'
import './uni.promisify.adaptor'
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({//store,//注入Vuex实例,此处是vue2版本用法...App
})
app.$mount()
// #endif// #ifdef VUE3
import { createSSRApp } from 'vue'
//
import store from './store'
import Vuex from 'vuex'
export function createApp() {const app = createSSRApp(App)app.use(store)return {app}
}
// #endif

以上是uniapp自动生成的项目文件中main.js的结构,其中:

import store from './store'
import Vuex from 'vuex'
...
app.use(store)

以上三行代码是我们添加的,用于调用store。
然后我们可以在页面中访问数据了:

computed:{...mapState({name:state=>state.name,age:state=>state.age}),// getname(){// 	return this.$store.state.name// },// getage(){// 	return this.$store.state.age// }}

如上,我们访问store是在computed中来访问的,上面有两种方法,一种是单个获取,一种是批量获取,对于有多个变量的需求来说,显然使用mapState更便捷。
使用变量:

<text>name:{{ name }}</text>
<text>age:{{ age }}</text>

变量值显示:
在这里插入图片描述
以上是简单示例。

3、实例使用

假设我们有一组数据:

position、speed、current、torque

这一组数据是通过websocket通讯获取,以较高频率实时更新。
与第二步类似,我们先在store中创建这些变量:

import { createStore } from 'vuex'
const store = createStore({state:{position:'',//位置值speed:'',//速度值current:'',//电流值torque:''//力矩值}
})
export default store

注意:理论上,我们这样创建的变量,在页面调用时,是可以直接修改其值的:

this.$store.state.position = '1000';

vue也能监控并刷新,但是基于vuex的设计理念,不推荐这样直接修改状态,而是使用vuex的另一个核心功能:mutations。
因此,我们为state的变量增加修改值的功能:

state:{position:'0',//位置值speed:'0',//速度值current:'0',//电流值torque:'0'//力矩值},mutations:{setPosition(state,value){state.position = value},setSpeed(state,value){state.speed = value},setCurrent(state,value){state.current = value},setTorque(state,value){state.torque = value}}

如上,我们为store实例增加了mutations,并且在其中添加了四个函数,分别是用于修改相应变量值的。
注:如果你看到上面四个函数,觉得逻辑都相似,是不是可以写成一个通用函数,结果是,可以。
所以,我们可以写一个通用函数:

setValue(state,payload){const { key,value } = payloadif (state.hasOwnProperty(key)){state[key] = value} else {console.log('未发现共享变量!')}}

这里是使用了payload来传递参数,payload可以是一个结构体,比如,这里,我们传入一个key用于获取state的变量,value用于赋值。
以上函数编写完成后,我们可以在页面调用:

methods: {...//省略其他代码...mapMutations(['setValue','setPosition','setSpeed']),setValues(){const key = 'position';const value = '1234';this.setValue({key,value});},setPosi(){const value = '1000';this.setPosition(value);},setSpd(){const spd = '122';this.setSpeed(spd);}

如上,我们使用mapMutations来访问mutations中函数。
然后,我们可以分别使用其中的函数:
如:

setValues(){const key = 'position';const value = '1234';this.setValue({key,value});}

上面是通用函数,根据传入的key和value来执行,也可以使用单独的值修改函数:

setPosi(){const value = '1000';this.setPosition(value);}

我们可以来看一下演示:
在这里插入图片描述

注:本文是学习记录,但是以上代码经过测试,vuex的状态管理方案,将用在其他项目需求上(websocket数据共享),将在后续博文介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/82317.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高速串行差分信号仿真分析及技术发展挑战续

7.3 3.125Gbps 差分串行信号设计实例仿真分析 7.3.1 设计用例说明 介绍完 Cadence 系统本身所具有的高速差分信号的仿真分析功能之后&#xff0c;我们以一个实例来说明 3.125Gbps 以下的高速差分系统的仿真分析方法。 在网上下载的设计文件“Booksi_Demo_Allegro160_Finishe…

【Golang】部分语法格式和规则

1、时间字符串和时间戳的相互转换 func main() {t1 : int64(1546926630) // 外部传入的时间戳&#xff08;秒为单位&#xff09;&#xff0c;必须为int64类型t2 : "2019-01-08 13:50:30" // 外部传入的时间字符串//时间转换的模板&#xff0c;golang里面只能是 &quo…

第十六章:数据治理之数据架构:数据模型和数据流转关系

本章我们说一下数据架构&#xff0c;说到数据架构&#xff0c;就很自然的想到企业架构、业务架构、软件架构&#xff0c;因为个人并没有对这些内容进行深入了解&#xff0c;所以这里不做比对是否有相似或者共通的地方&#xff0c;仅仅来说一下我理解的数据架构。 1、什么是架构…

Day126 | 灵神 | 二叉树 | 层数最深的叶子结点的和

Day126 | 灵神 | 二叉树 | 层数最深的叶子结点的和 1302.层数最深的叶子结点的和 1302. 层数最深叶子节点的和 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 这道题用层序遍历的思路比较好想&#xff0c;就把每层的都算一下&#xff0c;然后返回最后一层的和就…

PCIE 4.0 vs PCIE 5.0固态硬盘——区别、科普与选购场景全解析

随着数字内容和高性能计算需求的爆发&#xff0c;固态硬盘&#xff08;SSD&#xff09;已成为PC、游戏主机和工作站不可或缺的核心硬件。面对市面上层出不穷的新一代SSD产品&#xff0c;大家最常见的一个疑惑&#xff1a;**PCIe 4.0和PCIe 5.0固态硬盘&#xff0c;到底有啥区别…

vue pinia 独立维护,仓库统一导出

它允许您跨组件/页面共享状态 持久化 安装依赖pnpm i pinia-plugin-persistedstate 将插件添加到 pinia 实例上 pinia独立维护 统一导出 import { createPinia } from pinia import piniaPluginPersistedstate from pinia-plugin-persistedstateconst pinia creat…

Dify源码学习

文章目录 1 大模型基本原理1.1 model_context_tokens、max_tokens和prompt_tokens1.1.1 三者之间的关系1.1.2 总结对比 2 Dify源代码2.0 前后端代码跑起来【0】准备开发环境【1】下载代码【2】运行后端&#xff08;1&#xff09;Start the docker-compose stack&#xff08;2&a…

连接表、视图和存储过程

1. 视图 1.1. 视图的概念 视图&#xff08;View&#xff09;&#xff1a;虚拟表&#xff0c;本身不存储数据&#xff0c;而是封装了一个 SQL 查询的结果集。 用途&#xff1a; 只显示部分数据&#xff0c;提高数据访问的安全性。简化复杂查询&#xff0c;提高复用性和可维护…

微信小程序中,解决lottie动画在真机不显示的问题

api部分 export function getRainInfo() {return onlineRequest({url: /ball/recruit/getRainInfo,method: get}); }data存储json数据 data&#xff1a;{rainJson:{} }onLoad方法获取json数据 onLoad(options) {let that thisgetRainInfo().then((res)>{that.setData({r…

从加密到信任|密码重塑车路云一体化安全生态

目录 一、密码技术的核心支撑 二、典型应用案例 三、未来发展方向 总结 车路云系统涉及海量实时数据交互&#xff0c;包括车辆位置、传感器信息、用户身份等敏感数据。其安全风险呈现三大特征&#xff1a; 开放环境威胁&#xff1a;V2X&#xff08;车与万物互联&#xff0…

光谱相机在地质勘测中的应用

一、‌矿物识别与蚀变带分析‌ ‌光谱特征捕捉‌ 通过可见光至近红外&#xff08;400-1000nm&#xff09;的高光谱分辨率&#xff08;可达3.5nm&#xff09;&#xff0c;精确识别矿物的“光谱指纹”。例如&#xff1a; ‌铜矿‌&#xff1a;在400-500nm波段反射率显著低于围…

理论篇三:如何编写自定义的Webpack Loader或Plugin插件

在 Webpack 中,自定义 Loader 和 Plugin 是扩展构建能力的关键方式。以下是它们的实现方法和核心逻辑,通过代码示例和步骤拆解帮助你快速掌握。 一、自定义 Loader 1. Loader 的本质 作用:将非 JS 文件转换为 Webpack 能处理的模块。特点:纯函数,接收源文件内容,返回处理…

【算法】力扣体系分类

第一章 算法基础题型 1.1 排序算法题 1.1.1 冒泡排序相关题 冒泡排序是一种简单的排序算法&#xff0c;它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换&#xff0c…

C11 日期时间处理案例

文章目录 显示当前日期时间得到当前日期时间的17位数字形式(YYYYmmddHHMMSSsss)从日期时间字符串得到time_t 类型时间戳从时期时间字符串得到毫秒单位的时间戳得到当前日期时间以毫秒为单位的时间戳一个综合案例 所有例子在VS2019上编译运行通过 显示当前日期时间 #include &…

Python 训练营打卡 Day 34

GPU训练及类的call方法 一、GPU训练 与day33采用的CPU训练不同&#xff0c;今天试着让模型在GPU上训练&#xff0c;引入import time比较两者在运行时间上的差异 import torch # 设置GPU设备 device torch.device("cuda:0" if torch.cuda.is_available() else &qu…

Ubuntu22.04 系统安装Docker教程

1.更新系统软件包 #确保您的系统软件包是最新的。这有助于避免安装过程中可能遇到的问题 sudo apt update sudo apt upgrade -y 2.安装必要的依赖 sudo apt install apt-transport-https ca-certificates curl software-properties-common -y 3.替换软件源 原来/etc/apt/s…

深入解析前端 JSBridge:现代混合开发的通信基石与架构艺术

引言&#xff1a;被低估的通信革命 在移动互联网爆发式增长的十年间&#xff0c;Hybrid App&#xff08;混合应用&#xff09;始终占据着不可替代的地位。作为连接 Web 与 Native 的神经中枢&#xff0c;JSBridge 的设计质量直接决定了应用的性能上限与开发效率。本文将突破传…

ES 面试题系列「三」

1、在设计 Elasticsearch 索引时&#xff0c;如何考虑数据的建模和映射&#xff1f; 需要根据业务需求和数据特点来确定索引的结构。首先要分析数据的类型&#xff0c;对于结构化数据&#xff0c;如数字、日期等&#xff0c;要明确其数据格式和范围&#xff0c;选择合适的字段…

HTML5快速入门-常用标签及其属性(三)

HTML5快速入门-常用标签及其属性(三) 文章目录 HTML5快速入门-常用标签及其属性(三)音视频标签&#x1f3a7; <audio> 标签 — 插入音频使用 <source> 提供多格式备选&#xff08;提高兼容性&#xff09;&#x1f3a5; <video> 标签 — 插入视频&#x1f3b5…

Qt文件:XML文件

XML文件 1. XML文件结构1.1 基本结构1.2 XML 格式规则1.3 XML vs HTML 2. XML文件操作2.1 DOM 方式&#xff08;QDomDocument&#xff09;读取 XML写入XML 2.2 SAX 方式&#xff08;QXmlStreamReader/QXmlStreamWriter&#xff09;读取XML写入XML 2.3 对比分析 3. 使用场景3.1 …