Vuex的使用

来源:https://www.cnblogs.com/wxw1314/archive/2018/08/05/9255868.html
-Advertisement-
Play Games

Vuex Vuex是專為Vue.js應用程式開發的狀態管理模式。它採用集中式存儲管理應用的所有組件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。 應用場景 對於深層嵌套組件,依靠props進行父子組件的傳遞顯得太過臃腫,而且難以維護。而vuex的出現就是為瞭解決數據傳遞的問題。Vuex作 ...


 

Vuex

Vuex是專為Vue.js應用程式開發的狀態管理模式。它採用集中式存儲管理應用的所有組件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。

應用場景

對於深層嵌套組件,依靠props進行父子組件的傳遞顯得太過臃腫,而且難以維護。而vuex的出現就是為瞭解決數據傳遞的問題。Vuex作為一個全局管理倉庫,可以管理所有組件的狀態state,不同組件之間也可依靠Vuex來共用狀態State。

Vuex不同於單純的全局對象

1,Vuex的狀態存儲是響應式的。當Vue組件從store中讀取狀態時,若store的中的狀態發生變化,那麼相應的組件也會相應的得到高效更新。

2,改變store中狀態的唯一途徑就是顯式地提交mutation。所有的state的改變都必須經過mutation事件,方便我們跟蹤每一個狀態的的變化。

核心概念

state

負責存儲整個應用的狀態數據。在vue組件中獲取Vuex狀態的方式如下,在計算屬性中返回某個狀態:

1,需要在DOM節點上獲取到狀態;

 實現:在項目中,在組件中把存在Vuex中的“columns”取出來,並顯示在該組件上

 1),在computed中返回該狀態。

1  computed: {
2    columns(){
3      return this.$store.state.columns;
4    }
5  },

2),在需要用到的dom節點上進行操作。

1 <el-col :span="20">
2    <el-checkbox-group   v-model="column">
3       <el-checkbox :label="item.name" v-for="(item,index) in columns" :key="index">{{item.name}}</el-checkbox>
4    </el-checkbox-group>
5 </el-col>

結果:每當store.state.columns變化時,都會重新計算屬性,並且觸發更新相關聯的DOM。

2,在vue生命周期中獲取到Vuex中的狀態,可以直接用this.$store.state對象

eg:

this.id = this.$store.state.articleId;

mapState輔助函數

當一個組件需要獲取多個狀態時,vuex提供了mapState輔助函數生成計算屬性。

實現:從Vuex中獲取“activityLeft”和“columns”兩個狀態時,可以按以下兩個方式獲取。

1),直接獲取

1 computed: {
2   activityLeft(){
3     return this.$store.state.activityLeft;
4   },
5   columns(){
6     return this.$store.state.columns;
7   }
8 }

2),用mapState輔助函數輔助函數獲取

1 computed: {
2    ...mapState([
3       'activityLeft',
4       'columns'
5    ])
6 },

mutation

上面說到,更改 Vuex 的 store 中的狀態的唯一方法是提交 mutation。

Vuex 中的mutation非常類似於事件:每個 mutation 都有一個字元串的 事件類型 (type) 和 一個 回調函數 (handler)。

實現:在組件中改變Vuex狀態中的acticleId狀態,不可以用“this.$store.state.articleId = 1”這種方式進行修改,需要以下麵的方面進行修改。

eg:

1),組件中需要用state.commit來喚醒mutation中的handler。例如在點擊編輯時,獲取到該item的id傳遞給對應的handler

1 handleCurrentChange(id) {
2   this.$store.commit("getArticleId",id);
3 }

 2),在Vuex中添加一一對應的handler

1 mutations:{
2   getArticleId(state,id){
3     state.articleId = id;
4   },  
5 }

註意:

1,最好在提前在你的 store 中初始化好所有所需屬性。上述例子應該在state中先初始化好articleId。

2,mutation必須是同步函數。在 mutation 中混合非同步調用會導致你的程式很難調試,如果需要處理非同步操作,可以使用Action

Action

1,Action 提交的是 mutation,而不能直接變更狀態

2,Action 可以包含任意非同步操作

實現:在項目中,在Action中使用axios去獲取數據,並把數據存進Vuex的狀態裡面。

1),在組件的methods中通過 store.dispatch 方法觸發Action

 1 handleSizeChange(val) {
 2   this.pageSize = val;
 3     let data = {
 4       "type":this.$store.state.navName,
 5       "wid":this.$store.state.websiteId,
 6       "pageSize":this.pageSize,
 7       "pageNum":this.pageNum,
 8       "searchTitle":this.searchTitle
 9      };
10    this.$store.dispatch("getArticle",data);
11 },

2),在Vuex註冊一一對應的Action

 1 actions:{
 2   getArticle({commit},{type='',searchTitle='',wid,pageNum=1,pageSize=20}){
 3     axios.post(api.url+'articleList',{
 4       type:type,
 5       searchTitle:searchTitle,
 6       wid:wid,
 7       pageSize:pageSize,
 8       pageNum:pageNum
 9     }).then((response)=>{
10       if(response.data.ret == 0){
11         var data = response.data;
12         var msg = data.msg;
13         var total = data.total;
14         commit('getArticle',{msg,total})
15       }
16     });
17   },
18 }

3),通過提交 mutation 來記錄狀態變更

1 mutations:{
2   getArticle(state,data){
3     var res = data.msg;
4     state.activityList = res;
5     state.total = data.total;
6   },
7 }

重點store.dispatch 可以處理被觸發的 action 的處理函數返回的 Promise,並且 store.dispatch 仍舊返回 Promise:

eg:一個 store.dispatch 在不同模塊中可以觸發多個 action 函數。

1 actions: {
2   async actionA ({ commit }) {
3     commit('gotData', await getData())
4   },
5   async actionB ({ dispatch, commit }) {
6     await dispatch('actionA') // 等待 actionA 完成
7     commit('gotOtherData', await getOtherData())
8   }
9 }

以上就是我在項目中基於vue-cli框架中使用Vuex的一些例子。最後上面提到的vuex狀態附在下列store.js中

 1 import Vue from 'vue';
 2 import Vuex from 'vuex';
 3 import axios from 'axios';
 4 import api from '../api/api.js';
 5 Vue.use(Vuex);
 6 let store = new Vuex.Store({
 7   state:{
 8     columns:[],
 9     articleId:'',
10   },
11   mutations:{
12     getArticle(state,data){
13       var res = data.msg;
14       state.activityList = res;
15       state.total = data.total;
16     },
17     getArticleId(state,id){
18       state.articleId = id;
19     },
20   },
21   actions:{
22     getArticle({commit},{type='',searchTitle='',wid,pageNum=1,pageSize=20}){
23       axios.post(api.url+'articleList',{
24         type:type,
25         searchTitle:searchTitle,
26         wid:wid,
27         pageSize:pageSize,
28         pageNum:pageNum
29       }).then((response)=>{
30         if(response.data.ret == 0){
31           var data = response.data;
32           var msg = data.msg;
33           var total = data.total;
34           commit('getArticle',{msg,total})
35         }
36       });
37     },
38   }    
39 });
40 export default store;

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 先設置Mysql全局 P.S.1:第9行,網上很多方法是這樣寫的:GRANT ALL ON *.* TO 'root'@'%'; ,實測mysql8.0.12.0報錯。 P.S.2:第13行,網上很多方法是這樣寫的:ALTER USER 'root'@'localhost' IDENTIFIED B ...
  • 大數據方向的工作目前分為三個主要方向:01.大數據工程師02.數據分析師03.大數據科學家04.其他(數據挖掘本質算是機器學習,不過和數據相關,也可以理解為大數據的一個方向吧) 本回答目錄:一、大數據工程師的技能要求二、大數據學習路徑三、學習資源推薦(書籍、博客、網站) 推薦一個大數據學習群 119 ...
  • 看到很多小伙伴都在學習大數據開發的路上很迷茫,不知道該如何成為一名合格的大數據開發工程師,也不知道該學習哪些技術,下麵就給大家談談如何成為一個大數據開發工程師! 想要成為大數據工程師,首先要更新自己的技術庫,也就是說需要將自己以前學習的技術知識找回來,還要增加一些大數據專業技術知識,先讓自己對大數據 ...
  • 第一次安裝wamp之後,所有服務可以正常使用,但是重啟之後wamp的圖標就變成黃色的了,重裝了也這樣 查看一下錯誤日誌: 日誌顯示的錯誤是這樣的: 日誌提示可能是3306埠被占用的錯誤,那來看一下是哪個程式占用了3306埠: windows下運行cmd ,輸入 可以看到是pid為2092這個程式 ...
  • 簡單複習下node,不過很多重要的知識點是圖,文字無法展示出來。 1.Node的特點 非同步I/O 事件與回調函數 單線程 跨平臺(libuv) 2.Node的應用場景 I/O密集型(事件迴圈、非同步I/O) CPU密集型(可以採用子進程) 3.CommonJS的模塊規範 模塊引用 模塊定義 模塊標識 ...
  • 1. ES5實現 父類: 子類繼承父類: 2. ES6實現 父類: 子類繼承: ...
  • ​ 昨晚睡前打開了半個月沒打開的知乎, 看到了一個專欄文章 "再見jquery,我的老朋友" ,突然想到之前github傳出,github已經徹底刪除jquery,這似乎標志著前端已經完全進入了一個新的時代,js從最開始的小丑語言,現在已經成為一個非常優秀的編程語言,開發者的目光從相容性一步步的轉向 ...
  • JQuery_1_選擇器 什麼是JQuery JQuery實際上就是一個javascript文件,它是一堆由javascript寫好的工具程式,一個被封裝好的js工具庫。它在js基礎之上做了很多的優化,讓網頁腳本的編寫過程更加的便捷高效。 JQuery有很多的版本,但各版本之間的差異都不是太大,基礎 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...