認識和使用Vuex-案例

  1. 集中管理共享的數據,易于開發和后期維護;
  2. 能夠高效的實現組件之間的數據共享,提高開發效率;
  3. 存儲在Vuex的數據是響應式的,能夠實時保持頁面和數據的同步;

安裝Vuex依賴包

npm install vuex --save

導入包

import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)

創建store對象

const store = new Vuex.Store({state: {},mutations: {},actions:{},getters: {}
})

將store對象掛載到vue的實例中

new Vue({el: '#app',render: h => h(app),router,//將創建的共享數據對象掛載到vue的實例中,所有的組件就可以直接從store中獲取全局的數據了store
})

State和Mutation

State

State提供了唯一的數據公共源,所有共享的數據都要統一放到store的state進行存儲;

import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)const store = new Vuex.Store({state: {count:0, //在state中存儲一個count數據},
})

訪問State數據

方式一:$store.state.數據名

由于 Vuex 的狀態存儲是響應式的,從 store 實例中讀取狀態最簡單的方法就是在計算屬性 (computed)中返回某個狀態:

<template><div> <p>從state中拿到的{{conut}}</p><!-- 或者--><p>從state中拿到的{{$store.state.count}}</p></div>
</template><script>
export default {computed: {conut() {return this.$store.state.count}},
}
</script>
<style></style>

方式二:mapState 輔助函數

當一個組件需要獲取多個狀態的時候,將這些狀態都聲明為計算屬性會有些重復和冗余。為了解決這個問題,我們可以使用 mapState 輔助函數幫助我們生成計算屬性,讓你少按幾次鍵:

<template><div> <p>從state中拿到的{{conut}}</p></div>
</template>//從Vuex中按需導入mapState 函數
import { mapState } from 'vuex'<script>
export default {computed: {//將全局數據映射為當前組件的計算屬性...mapState (['conut'])},
}
</script>
<style></style>

Mutation

只有通過Mutation才能變更Store的數據,不能直接在組件中操作Store的數據;
在Mutation統一操作Store的數據雖然比較繁瑣,但是便于集中監控所有數據的變化;
一條重要的原則就是要記住 mutation 必須是同步函數,一些異步函數我們要放到后面講的action中處理;

import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)const store = new Vuex.Store({state: {count:0, //在state中存儲一個count數據},mutations: {add(state){//變更state中的count數據state.count++}},
})

觸發Mutation來改變數據

在組件中使用 this.$store.commit(‘xxx’) 提交 mutation,或者使用 mapMutations 輔助函數將組件中的 methods 映射為 store.commit 調用。

<template><div> <p>從state中拿到的{{$store.state.count}}</p><button @click = "addCount"></button></div>
</template>//從Vuex中按需導入mapMutations函數
import {mapMutations} from 'vuex'<script>
export default {methods:{// 第二種方式:將 `this.addCount()` 映射為 `this.$store.commit('add')`//...mapMutations(['add']),addCount(){//第一種方式:使用 this.$store.commit('xxx') 提交 mutationthis.$store.commit('add') }}
}
</script>
<style></style>

組件觸發Mutation時傳遞參數

首先要在mutations中寫好接受參數的函數

import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)const store = new Vuex.Store({state: {count:0, //在state中存儲一個count數據},mutations: {add(state,num){//變更state中的count數據state.count += num}},
})

組件觸發Mutation調用更改函數并提交參數

<template><div> s<p>從state中拿到的{{$store.state.count}}</p><button @click = "addCount"></button></div>
</template><script>
export default {methods:{addCount(){//第一種方式:使用 this.$store.commit('xxx') 提交 mutationvar num = 5this.$store.commit('add' ,num ) }}
}
</script>
<style></style>

Action

Action用于處理異步任務
如果通過異步操作變更數據,必須通過Action
,而不是使用Mutation,但是在Action中還是要通過觸發Mutation的方式間接變更數據。

Action 提交的是 mutation
Action 函數接受一個與 store 實例具有相同方法和屬性的 context 對象,因此你可以調用 context.commit 提交一個 mutation。

import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)const store = new Vuex.Store({state: {count:0, //在state中存儲一個count數據},mutations: {add(state){//變更state中的count數據state.count++}},actions:{asyncAdd(context){setTimeout(() => { //這里用定時器假設是異步操作context.commit('add') //這里還是觸發mutations中的add方法更改count數據}, 1000)}}
})

簡化代碼

 actions:{asyncAdd({commit}){setTimeout(() => { commit('add')}, 1000)}}

觸發Action中的異步函數

第一種方式:通過 this.$store.dispatch 方法觸發

  methods:{addCount(){this.$store.dispatch('asyncAdd')}}

第二種方式:mapActions輔助函數

<template><div> <!-- 這里點擊事件可以直接寫成actions函數事件名  --><button @click = "asyncAdd"></button> </div>
</template>//從Vuex中按需導入mapActions函數
import { mapActions} from 'vuex'<script>
export default {methods: {//將指定的actions函數,映射為當前組件的methods函數...mapActions(['asyncAdd'])},
}
</script>

觸發Action異步時攜帶參數

首先要先更改一下mutations和actions中的函數

mutations: {add(state,num){//變更state中的count數據state.count += num}
},
actions:{asyncAdd({commit},num){setTimeout(() => { commit('add',num)}, 1000)}}

然后還是通過 this.$store.dispatch 方法觸發

  methods:{addCount(){var num = 5this.$store.dispatch('asyncAdd',num )}}

Getter

Getter用于對Store中的數據進行加工處理形成新的數據;

Getter可以對Store中已有的數據進行加工處理形成新的數據,類似Vue的計算屬性
Store中的數據發生變化,Getter的數據也會跟著發生變化
Getter的返回值會根據它的依賴被緩存起來,且只有當它的依賴值發生了改變才會被重新計算。

import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)const store = new Vuex.Store({state: {count:0, //在state中存儲一個count數據},getters: {newCount:state => {return  ‘最新值是’+ state.count}}
})

訪問Getter的數據

第一種方式:通過 this.$store.getters方法觸發

  computed:{count(){return  this.$store.getters. newCount}}

第二種方式:mapActions輔助函數

//從Vuex中按需導入mapGetters 函數
import { mapGetters } from 'vuex'<script>
export default {computed: {//將 store 中的 getter 映射到組件計算屬性...mapGetters (['newCount'])},
}
</script>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78644.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78644.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78644.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LLM大模型中的基礎數學工具—— 信號處理與傅里葉分析

Q51: 推導傅里葉變換 的 Parseval 定理 傅里葉變換的 Parseval 定理揭示了啥關系&#xff1f; Parseval 定理揭示了傅里葉變換中時域與頻域的能量守恒關系&#xff0c;即信號在時域的總能量等于其在頻域的總能量。這就好比一個物體無論從哪個角度稱重&#xff0c;重量始終不…

對Mac文字雙擊或三擊鼠標左鍵沒有任何反應

目錄 項目場景&#xff1a; 問題描述 原因分析&#xff1a; 解決方案&#xff1a; 項目場景&#xff1a; 在使用Mac系統的時候&#xff0c;使用Apple無線鼠標&#xff0c;雙擊左鍵能夠選取某個單詞或詞語&#xff0c;三擊左鍵能夠選取某一行&#xff0c;&#xff08;百度、…

Go語言企業級項目使用dlv調試

使用dlv調試Go語言代碼 打包Go代碼(禁止優化和內聯&#xff08;便于調試更復雜的邏輯&#xff09;)&#xff1a; go build -gcflags"all-N -l" -o xxx_api_debug.exe啟動一個dlb監聽可運行程序的端口&#xff1a; dlv --listen:2345 --headlesstrue --api-version…

Kafka命令行的使用/Spark-Streaming核心編程(二)

Kafka命令行的使用 創建topic kafka-topics.sh --create --zookeeper node01:2181,node02:2181,node03:2181 --topic test1 --partitions 3 --replication-factor 3 分區數量&#xff0c;副本數量&#xff0c;都是必須的。 數據的形式&#xff1a; 主題名稱-分區編號。 在…

Python3:Jupyterlab 安裝和配置

Python3:Jupyterlab 安裝和配置 Jupyter源于Ipython Notebook項目&#xff0c;是使用Python&#xff08;也有R、Julia、Node等其他語言的內核&#xff09;進行代碼演示、數據分析、機器學習、可視化、教學的非常好的工具。 最新的基于web的交互式開發環境&#xff0c;適用于n…

快速排序及其在Unity游戲開發中的應用

一、快速排序(Quick Sort) 快速排序是一種**分治法(Divide and Conquer)**思想的排序算法,它的基本步驟是: 選一個基準元素(pivot):通常選第一個元素、最后一個元素,或者隨機一個。分區(Partition):把數組分成兩部分,小于等于 pivot 的放左邊,大于 pivot 的放右…

【硬核干貨】SonarQube安全功能

原文鏈接&#xff1a;【硬核干貨】SonarQube安全功能 關于曉數神州 曉數神州堅持以“客戶為中心”的宗旨&#xff0c;為客戶提供專業的解決方案和技術服務&#xff0c;構建多引擎數字化體系。 核心業務1&#xff1a;聚焦DevOps全棧產品&#xff0c;打造需求管理、項目管理、開…

修改el-select背景顏色

修改el-select背景顏色 /* 修改el-select樣式--直接覆蓋默認樣式&#xff08;推薦&#xff09; */ ::v-deep .el-select .el-input__inner {background-color: #1d2b72 !important; /* 修改輸入框背景色 */color: #fff; } ::v-deep .el-select .el-input__wrapper {background-…

Unity-粒子系統:螢火蟲粒子特效效果及參數

螢火蟲特效由兩部分組成。螢火蟲粒子底色粒子面片。螢火蟲的旋轉飛動主要由 Noise參數和Color over Lifetime模塊控制。 貼圖&#xff1a;中間實周邊虛的圓&#xff0c;可隨意自行制作 Shader&#xff1a;Universal Render Pipeline/2D/Sprite-Lit-Default 以下是粒子詳細參…

K8S Service 原理、圖例——深度好文

一、理論介紹 1.1、3W 法則 1、是什么&#xff1f; Service 是一種為一組功能相同的 pod 提供單一不變的接入點的資源。當 Service 存在時&#xff0c;它的IP地址和端口不會改變。客戶端通過IP地址和端口號與 Service 建立連接&#xff0c;這些連接會被路由到提供該 Service 的…

Alibaba Cloud Linux 3.2104 LTS 64位 容器優化版安裝docker docker compose記錄

整個安裝過程耗時4小時。&#xff08;包含以下檢查內容:&#xff09; 檢查該linux版本信息&#xff08;并通過監控指標檢查運行狀態/cpu占用/內存占用/磁盤讀取寫入IOPS /同時連接數&#xff09; 1&#xff1a;根據當前的系統進行yum與dnf的升級&#xff0c;保持穩定修復的版本…

STM32N6570-DK ISP調試

STM32N6570-DK之ISP調試應用 準備工作-下載安裝軟件包:一、使用STM32CubeProgrammer給板子燒入STM32N6_ISP_IQTune_App_revC01-v1.1.0-trusted.bin。二、打開STM32 ISP IQTune.exe ,出現可連接端口:三、根據教程進行相應調試:準備工作-下載安裝軟件包: https://www.st.co…

12.thinkphp驗證

一&#xff0e;驗證器定義 1. 驗證器的使用&#xff0c;我們必須先定義它&#xff0c;系統提供了一條命令直接生成想要的類&#xff1b; php think make:validate User 2. 這條命令會自動在應用目錄下生成一個validate文件夾&#xff0c;并生成User.php類&#xff1b; class…

OpenWrt 與 Docker:打造輕量級容器化應用平臺技術分享

文章目錄 前言一、OpenWrt 與 Docker 的集成前提1.1 硬件與內核要求1.2 軟件依賴 二、Docker 環境部署與驗證2.1 基礎服務配置2.2 存儲驅動適配 三、容器化應用部署實踐3.1 資源限制策略3.2 Docker Compose 適配 四、性能優化與監控4.1 容器資源監控4.2 鏡像精簡策略 五、典型問…

EasyRTC音視頻實時通話嵌入式SDK,打造社交娛樂低延遲實時互動的新體驗

一、方案背景 在數字化時代&#xff0c;社交娛樂已經成為人們生活中不可或缺的一部分。隨著移動互聯網和智能設備的普及&#xff0c;用戶對實時互動的需求越來越高。EasyRTC作為一款基于WebRTC技術的實時音視頻通信解決方案&#xff0c;憑借其低延遲、高穩定性和跨平臺兼容性&…

軟件編程命名規范

編程命名規范是保證代碼可讀性、可維護性和團隊協作效率的重要基礎。以下是涵蓋主流編程語言的通用命名規范&#xff0c;結合行業最佳實踐和常見規范&#xff08;如Google、Microsoft、Airbnb等風格指南&#xff09;&#xff1a; 一、通用命名原則 清晰優先&#xff1a;名稱應…

換張電話卡能改變IP屬地嗎?一文解讀

在互聯網時代&#xff0c;IP屬地&#xff08;即網絡定位信息&#xff09;的顯示引發了許多用戶的關注。有人好奇&#xff1a;更換電話卡&#xff08;SIM卡&#xff09;是否能改變自己的IP屬地&#xff1f;本文將解析IP屬地的定義、電話卡的作用&#xff0c;并深入探討兩者之間的…

前端:純HTML、CSS和JS菜單樣式

實現了一個多級折疊菜單系統,使用純HTML、CSS和JavaScript(無任何框架) 一、二級菜單展開 1、實現效果 初始狀態-展示全部一級菜單 選中共狀態,一級標題選中共為藍色背景色,二級標題選中共為藍色文字,展開右側圖標為-,后縮狀態右側圖標為+ 2、實現 ??HTML結構?? …

Centos8 安裝 Docker

yum 更換國內源 1. 備份原 yum 配置 cd /etc/yum.repos.d/ mkdir backup mv *.repo backup/2. 下載新 yum 配置&#xff08;阿里源&#xff09; wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo3. 替換源中的系統版本變量 sed -…

AI測試工具Testim——告別自動化測試維護難題

隨著人工智能技術的快速發展&#xff0c;AI測試工具正在成為提升軟件研發效能的關鍵。每款AI的特性各有差異&#xff0c;今天&#xff0c;我們就給大家介紹一款專注于Web和移動應用的端到端的AI測試工具--Testim。 Testim的簡介 官網地址&#xff1a;https://www.testim.io/ 簡…