Vuex學習筆(基於Vue2.x)

来源:https://www.cnblogs.com/zy-feng/archive/2022/10/13/16789560.html
-Advertisement-
Play Games

本人水平有限,如有疏漏或者不正確部分,請大佬指正。 一.Vuex概述 1.1組件之間共用數據的方式 父向子傳值:v-bind 屬性綁定子向父傳值:v-on 事件綁定兄弟組件之間共用數據:eventBUs* $on 接收數據的那個組件* $emit 發送數據的那個組件 特點:適合小範圍使用 1.2Vu ...


本人水平有限,如有疏漏或者不正確部分,請大佬指正。

一.Vuex概述

1.1組件之間共用數據的方式

父向子傳值:v-bind 屬性綁定
子向父傳值:v-on 事件綁定
兄弟組件之間共用數據:eventBUs
* $on 接收數據的那個組件
* $emit 發送數據的那個組件
特點:適合小範圍使用

1.2Vuex是什麼

概念:Vuex是實現組建全局狀態(數據)管理的一種機制,可以方便的實現組件之間數據的共用

 

 

 

 

 1.3使用Vuex統一管理狀態的好處

 ①:能夠在vuex中集中管理共用的數據,易於開發和後期維護

 ②:能夠高效地實現組件之間的數據共用,提高開發效率

 ③:儲存在vuex中的數據都是響應式的,能夠試試保持數據與頁面的同步

1.4什麼樣的數據適合存儲到Vuex中

一般情況下,只有組件之間共用的數據,才有必要存儲到vuex中,對於組件中的私有數據,依舊存儲在組件自身的data中即可。

二.Vuex的基本使用

1.安裝vuex依賴包

npm install vuex --save

2.導入vuex包

import Vuex from 'vuex'

Vue.use(Vuex)

3.創建store對象

const store =new Vuex.Store({

//state 中存放的就是全局共用的數據

state:{ count : 0}

})

4.將store 對象掛載到vue實例中

new Vue({

el:"#app",

render:h => h(app),

router,

store

})

 

三.Vuex的核心概念

3.1核心概念包括 State,Mutation,Action,Gentter.Modules

3.2 state部分

State提供唯一的公共資源數據資源,所有共用數據都要統一放到Store的state中進行存儲。

 

 

組件訪問State中數據的第一種方式

this.$store.state.全局數據名稱

 

第二種方式:

首先從 vuex 中引入 mapState

 

 通過剛纔導入的mapState函數,將當前組件所需要的全局數據,映射為當前組件的computed計算屬性。便可直接調用使用

 

 

註意:雖然可以通過以上兩種方式修改 state 內部的數據,但是不建議使用該方式修改。

 

3.3 Mutation

Mutation用於變更state中的數據,

①:只能使用mutation 變更Store數據,不可以直接操作Store中的數據

②:通過這種方式雖有點繁瑣,但是可以集中監控所有數據的變化

 話不多說,上圖:

 

 第一種方式 觸發 mutation (不帶參數)

 

 觸發 mutation (攜帶參數)

 

  第二種方式 觸發 mutation 

 

 3.4 Action 

Action 用於處理非同步任務,想設置一些定時器等

第一種 觸發action (不攜帶參數)

 

 觸發 action (攜帶參數)

 

 

第二種方式 觸發 action

 

 3.5Getter

只是對 state中的數據起到包裝的作用,並不會修改任何數據。

①Getter可以對Store中已有的數據加工處理之後形成新的數據,類似Vue的計算屬性。

②Store中數據發生變化,Getter的數據也會跟著變化。

使用方法:

 

 

觸發方法

 

 

3.6modules

本部分參考自本文為CSDN博主「Meet_you_Q」
原文鏈接:https://blog.csdn.net/m0_60337445/article/details/122891271

modules 其實就是可以定義多個不同的 store ,互相抽離,防止數據過多,以至於導致單個store 過於臃腫

先簡單的舉個例子
index.js 文件的內容

import Vue from 'vue'
import Vuex from 'vuex'
import moduleA from '@/store/modules/moduleA'
Vue.use(Vuex)

const store = new Vuex.Store({
state: {
name: 'xxx'
},
mutations: {
changeName(state) {
state.name = 'xxx+++';
}
},
actions: {
},
// 就是使用modules屬性在進行註冊兩個狀態管理模塊
modules: {
moduleA,
}
});

export default store
moduleA.js的內容

export default {
state: {
name: 'aaa'
},
getters: {},
mutations: {
changeName(state, msg) {
console.log(msg);
state.name = 'aaa+++' + msg;
}
},
actions: {
actChangeName(context, msg) {
console.log(msg);
context.commit('changeName', msg);
}
}
}
調用state中數據的方式
由於我們是使用了模塊化的方式,調用最外層的state中的數據 依然是this.$store.state.name

那麼在使用modulesA中的方法的時候,是使用 this.$store.state.moduleA.name

調用mutations或者是actions中的方法
由於是沒有對模塊進行命名空間的,所以預設在使用 this.$store.commit/dispatch() 在提交方法的時候,會對所有狀態管理的actions和mutations中的方法進行匹配,這就導致了一個問題,就是當不同模塊之間的方法命名一樣的情況下,會造成方法同時調用的問題

這個時候,我們需要在定義模塊的時候,添加上 namespaced:true 屬性

export default {
namespaced: true, // 為當前模塊開啟獨立的 命名空間
state: {
name: 'aaa'
},
getters: {},
mutations: {
changeName(state, msg) {
console.log(msg);
state.name = 'aaa+++' + msg;
}
},
actions: {
actChangeName(context, msg) {
console.log(msg);
context.commit('changeName', msg);
}
}
}
使用命名空間之後的調用方式
我們需要在使用 this.$store.commit/dispatch() 的時候 需要在前面加上我們當前模塊名

例如: this.$store.commit("moduleA/changeName");

this.$store.dispatch("moduleA/actChangeName");

這樣就可以去調用指定的模塊裡面的方法,當前最外圍的mutations和actions還是一樣的調用方式

在使用了模塊後屬性的參數

mutations和actions的參數是沒什麼太大變化的

getters中是這樣的

getters: {
filters(state, getters, rootState) {
console.log(getters); // 代表的是getters屬性
// rootState ---> 根節點的狀態(也就是最外層的state)
return state.name + rootState.name;
}
},

使用了模塊化之後的輔助函數的使用
<!-- App -->
<template>
<div id="app">
<Panel>
<template #test="{ user }">
{{ user.id }}
</template>
</Panel>
<h2>{{ name }}</h2>
<button @click="changeName">觸發mutations</button>
<button @click="actChangeName">觸發actions</button>
<h2>{{ filters }}</h2>
</div>
</template>

<script>
// 這裡可以導入其他文件(比如:組件,工具js,第三方插件js,json文件,圖片文件等等)
// 例如:import 《組件名稱》 from '《組件路徑》';
import { createNamespacedHelpers } from "vuex";

const { mapState, mapMutations, mapActions, mapGetters } =
createNamespacedHelpers("moduleA"); // 需要指定模塊名字
import Panel from "@/components/Panel";
export default {
name: "App",
// import引入的組件需要註入到對象中才能使用
components: {
Panel,
},
data() {
return {};
},
// 監聽屬性 類似於data概念
computed: {
...mapState(["name"]),
...mapGetters(["filters"]),
},
// 監控data中的數據變化
watch: {},
// 方法集合
methods: {
// handler() {
// this.$store.commit("moduleA/changeName");
// },
...mapMutations(["changeName"]),
// handler2() {
// this.$store.dispatch("moduleA/actChangeName");
// },
...mapActions(["actChangeName"]),
},
beforeCreate() {}, // 生命周期 - 創建之前
// 生命周期 - 創建完成(可以訪問當前this實例)
created() {
console.log(this.$store);
},
};
</script>

 

本文來自博客園,作者:一粒金燦米,轉載請註明原文鏈接:https://www.cnblogs.com/zy-feng/p/16789560.html


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

-Advertisement-
Play Games
更多相關文章
  • 上一篇我們講到Mysql索引底層邏輯,為了瞭解後續sql知識,我們還是需要先學習一下相關“工具”得使用 一、Explain介紹 EXPLAIN是MySQl必不可少的一個分析工具,主要用來測試sql語句的性能及對sql語句的優化,或者說模擬優化器執行SQL語句。在select語句之前增加explain ...
  • 首發微信公眾號:SQL資料庫運維 原文鏈接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1&sn=450e9e94fa709b5eeff0de371c62072b&chksm=ea37536cdd40da7 ...
  • 本篇是「標簽畫像系列」的第四篇,此前我們已經介紹過了標簽畫像體系建設方法論、標簽體系設計與加工、標簽加工與落庫,這次我們來介紹一下「標簽評分」。 標簽評分是標簽治理的一個重要措施,通過給標簽打分,可清晰直觀的從各個維度評估標簽,掌握標簽真實使用情況,進行標簽持續優化,助力業務運營。同時,也能幫助數據 ...
  • 摘要:高性能、大容量、低成本、強穩定性,廣告業務需要的Ta都有 本文分享自華為雲社區《廣告業務存儲神器:華為雲GaussDB for Redis》,作者: GaussDB 資料庫。 一、從需求場景說起,什麼是RTA廣告業務? 在互聯網時代,媒體平臺逐漸成為廣告業務的主體,而作為廣告主的企業往往每年需 ...
  • Mysql雙機主從搭建 一、規劃說明 主節點: IP:192.168.1.146 系統:Centos7.6 版本:MySQL-5.7.38 mysql賬戶密碼:root/Admin_2022 同步賬戶:mysync/Admin_2022 主機名:m1 已關閉防火牆,配置阿裡源,連接互聯網 從節點: ...
  • 本文介紹瞭如何從Mac OS X Catalina將IPA文件上傳到App Store的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下麵隨著小編來一起學習吧! 問題描述 我剛剛在Apple Developer門戶中創建了一個應用程式,現在我想將從Phonegap創建的IPA文件上傳到Ap ...
  • 在上一篇文章Flutter(六):Flutter_Boost接入現有原生工程(iOS+Android)中介紹了Flutter_Boost的接入方法,這一篇將介紹Flutter自帶的接入方法。 新建工程 1.新建工程 1.使用Xcode新建flutter_demo_ios(模擬已有工程) 2.使用An ...
  • vue實現功能 單選 取消單選 全選 取消全選 代碼部分 <template> <div class=""> <h1>全選框</h1> <center> <button @click="checkAnti">反選</button> <table border="1px"> <tr> <!-- 全選框 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...