<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
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82317.shtml
英文地址,請注明出處:http://en.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 …