flux react php,Vue的Flux框架之Vuex狀態管理器

學習vue之前,最重要是弄懂兩個概念,一是“what”,要理解vuex是什么;二是“why”,要清楚為什么要用vuex。

Vuex是什么?

Vuex 類似 React 里面的 Redux 的狀態管理器,用來管理Vue的所有組件狀態。

為什么使用Vuex?

當你打算開發大型單頁應用(SPA),會出現多個視圖組件依賴同一個狀態,來自不同視圖的行為需要變更同一個狀態。

遇到以上情況時候,你就應該考慮使用Vuex了,它能把組件的共享狀態抽取出來,當做一個全局單例模式進行管理。這樣不管你在何處改變狀態,都會通知使用該狀態的組件做出相應修改。

下面講解如何使用Vuex

一個簡單的Vuex示例

本文就講解安裝Vuex,直接通過代碼講解Vuex使用。

import Vue from 'vue';

import Vuex from 'vuex';

Vue.use(Vuex);

const store = new Vuex.Store({

state: {

count: 0

},

mutations: {

increment (state) {

state.count++

}

}

})

上面就是一個簡單的Vuex示例,每一個Vuex應用就是一個store,在store中包含組件中的共享狀態state和改變狀態的方法(暫且稱作方法)mutations。

需要注意的是只能通過mutations改變store的state的狀態,不能通過store.state.count = 5;直接更改(其實可以更改,不建議這么做,不通過mutations改變state,狀態不會被同步)。

使用store.commit方法觸發mutations改變state:

store.commit('increment');

console.log(store.state.count) // 1

一個簡簡單單的Vuex應用就實現了。

在Vue組件使用Vuex

如果希望Vuex狀態更新的時候,組件數據得到相應的更新,那么可以用計算屬性computed獲取state的更新狀態。

const Counter = {

template: `

{{ count }}
`,

computed: {

count () {

return store.state.count;

}

}

}

每一個store.state都是全局狀態,在使用Vuex時候需要在根組件或(入口文件)注入。

// 根組件

import Vue from 'vue';

import Vuex from 'vuex';

Vue.use(Vuex);

const app = new Vue({

el: '#app',

store,

components: {

Counter

},

template: `

`

})

通過這種注入機制,就能在子組件Counter通過this.$store訪問:

// Counter 組件

const Counter = {

template: `

{{ count }}
`,

computed: {

count () {

return this.$store.state.count

}

}

}

mapState函數

computed: {

count () {

return this.$store.state.count

}

}

上面通過count計算屬性獲取同名state.count屬性,如何每一次獲取都要寫一個這樣的方法,是不顯得重復又麻煩?可以使用mapState函數簡化這個過程。

import { mapState } from 'vuex';

export default {

computed: mapState ({

count: state => state.count,

countAlias: 'count', // 別名 `count` 等價于 state => state.count

})

}

還有更簡單的使用方法:

computed: mapState([

'count'

// 映射 this.count 為 store.state.count

])

Getters對象

如果我們需要對state對象進行做處理計算,如下:

computed: {

doneTodosCount () {

return this.$store.state.todos.filter(todo => todo.done).length

}

}

如果多個組件都要進行這樣的處理,那么就要在多個組件中復制該函數。這樣是很沒有效率的事情,當這個處理過程更改了,還有在多個組件中進行同樣的更改,這就更加不易于維護。

Vuex中getters對象,可以方便我們在store中做集中的處理。Getters接受state作為第一個參數:

const store = new Vuex.Store({

state: {

todos: [

{ id: 1, text: '...', done: true },

{ id: 2, text: '...', done: false }

]

},

getters: {

doneTodos: state => {

return state.todos.filter(todo => todo.done)

}

}

})

在Vue中通過store.getters對象調用:

computed: {

doneTodos () {

return this.$store.getters.doneTodos

}

}

Getter也可以接受其他getters作為第二個參數:

getters: {

doneTodos: state => {

return state.todos.filter(todo => todo.done)

},

doneTodosCount: (state, getters) => {

return getters.doneTodos.length

}

}

mapGetters輔助函數

與mapState類似,都能達到簡化代碼的效果。mapGetters輔助函數僅僅是將store中的getters映射到局部計算屬性:

import { mapGetters } from 'vuex'

export default {

// ...

computed: {

// 使用對象展開運算符將 getters 混入 computed 對象中

...mapGetters([

'doneTodosCount',

'anotherGetter',

// ...

])

}

}

上面也可以寫作:

computed: mapGetters([

'doneTodosCount',

'anotherGetter',

// ...

])

所以在Vue的computed計算屬性中會存在兩種輔助函數:

import { mapState, mapGetters } from 'vuex';

export default {

// ...

computed: {

...mapGetters([ ... ]),

...mapState([ ... ])

}

}

Mutations

之前也說過了,更改Vuex的store中的狀態的唯一方法就是mutations。

每一個mutation都有一個事件類型type和一個回調函數handler。

調用mutation,需要通過store.commit方法調用mutation type:

store.commit('increment')

Payload 提交載荷

也可以向store.commit傳入第二參數,也就是mutation的payload:

mutaion: {

increment (state, n) {

state.count += n;

}

}

store.commit('increment', 10);

單單傳入一個n,可能并不能滿足我們的業務需要,這時候我們可以選擇傳入一個payload對象:

mutation: {

increment (state, payload) {

state.totalPrice += payload.price + payload.count;

}

}

store.commit({

type: 'increment',

price: 10,

count: 8

})

mapMutations函數

不例外,mutations也有映射函數mapMutations,幫助我們簡化代碼,使用mapMutations輔助函數將組件中的methods映射為store.commit調用。

import { mapMutations } from 'vuex'

export default {

// ...

methods: {

...mapMutations([

'increment' // 映射 this.increment() 為 this.$store.commit('increment')

]),

...mapMutations({

add: 'increment' // 映射 this.add() 為 this.$store.commit('increment')

})

}

}

Actions

注 Mutations必須是同步函數。

如果我們需要異步操作和提交多個Mutations,Mutations就不能滿足我們需求了,這時候我們就需要Actions了。

Actions

Action 類似于 mutation,不同在于:

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

Action 可以包含任意異步操作。

讓我們來注冊一個簡單的 action:

var store = new Vuex.Store({

state: {

count: 0

},

mutations: {

increment: function(state) {

state.count++;

}

},

actions: {

increment: function(store) {

store.commit('increment');

}

}

});

分發 Action

Action 函數接受一個與 store 實例具有相同方法和屬性的 context 對象,因此你可以調用 context.commit 提交一個 mutation,或者通過 context.state 和 context.getters 來獲取 state 和 getters。

分發 Action

Action 通過 store.dispatch 方法觸發:

乍一眼看上去感覺多此一舉,我們直接分發 mutation 豈不更方便?實際上并非如此,還記得 mutation必須同步執行這個限制么?Action就不受約束! 我們可以在 action 內部執行異步操作:

actions: {

incrementAsync ({ commit }) {

setTimeout(() => {

commit('increment')

}, 1000)

}

}

Actions 支持同樣的載荷方式和對象方式進行分發:

// 以載荷形式分發

store.dispatch('incrementAsync', {

amount: 10

})

// 以對象形式分發

store.dispatch({

type: 'incrementAsync',

amount: 10

})

mapActions

同樣地,action也有相對應的mapActions 輔助函數

mapActions

mapActions 輔助函數跟mapMutations一樣都是組件的 methods 調用:

import { mapActions } from 'vuex'

export default {

// ...

methods: {

...mapActions([

'increment' // 映射 this.increment() 為 this.$store.dispatch('increment')

]),

...mapActions({

add: 'increment' // 映射 this.add() 為 this.$store.dispatch('increment')

})

}

}

mutation-types

關于mutation-types方面的講解官方文檔很少說明,但在實際的中大項目中,對==mutation-types==的配置是必不可少的,Vuex的文檔只講解了state,getters,mutation,actions四個核心概念,下面我簡單補充下mutation-types的使用。

顧名思義,==mutation-types==其實就是mutation實例中各個方法的設定,一般要mutation方法前先在mutation-types用大寫寫法設定,再在mutation里引入使用,下面看看項目實際使用:

項目組織結構

0ecfa46bc8a3e54b692ac47e2c9dc5c5.png

在mutation-types定義好mutation的方法結構:

//SET_SINGER,SET_SONG 為mutation中要使用的方法名

export const SET_SINGER = 'SET_SINGER'

export const SET_SONG = 'SET_SONG'

在mutation中導入使用:

import * as types from ',/mutation-types.js'

const mutations = {

[types.SET_SINGER](state, singer) {

....

},

[types.SET_SONG](state, song) {

....

}

}

結語

看完上面對vuex的講解相信你已經入門了,現在可以看看具體的項目加深理解,可以參考我的github一個購物車例子: https://github.com/osjj/vue-shopCart

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

本條技術文章來源于互聯網,如果無意侵犯您的權益請點擊此處反饋版權投訴

本文系統來源:php中文網

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

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

相關文章

php config(),php config

PHP 的安裝由于php是一個zip文件(非install版),安裝較為基本解壓就行。把解壓的 php5.2.1-Win32重命名為 php5。并復制到安裝盤目錄下。例如安裝路徑為 c:\php51 找到php目錄下的 php.ini-dist或 php.ini.recommended文件,重命名為 php.ini,并復制到系統…

functions.php 在哪,functions.php常用函數

在設計WordPress主題時,在functions.php文件里添加一套通用的自定義函數將會大大提高開發效率,這樣就不必每次開發主題時都需先查找然后復制同樣的函數。這里記錄一些常用的函數,方便以后使用!給頭部添加feed鏈接WordPress2.8以后…

java基本數據類型存儲,JAVA - 基本數據類型的存儲空間長度

1.整型類型 存儲需求 bit數 取值范圍 備注byte 1字節 1*8 -128~127short 2字節 2*8 -32768~32767int 4字節 4*8 (-2的31次方到2的31次方-1)long 8字節 8*8 (-2的63次方到2的63次方-1) 長整型數值后綴為LJAVA 沒有無符號類型JAVA中…

matlab回調函數,matlabGUI回調函數介紹.pptx

matlabGUI回調函數介紹GUI開發環境的常用工具與回調函數和GUI程序文件GUI開發常用工具1、控件面板2、對象對齊工具3、對象瀏覽器4、tab順序編輯器5、屬性編輯器6、菜單編輯器7、M文件編輯器回調函數回調函數是控件接收到用戶的操作時調用的特定函數,每個回調函數都是…

余額交易查詢 php,深圳通余額查詢的API

深圳通余額查詢的API,可以通過深圳通號碼查詢到余額及卡有效期等信息。 用到Domxpath和Curl兩方面的知識。 源碼已托管到github,另外要加載個類:myclass 項目地址:https://github.com/skiy/dev 演示:http://api.oupag.…

食餌捕食者模matlab,幾類食餌-捕食者模型的定性分析和數值模擬

摘要:生態問題一直是人們普遍關注的問題,特別是生態問題中的食餌-捕食者模型,則處于舉足輕重的位置。如何更有效的控制、調節生物種群,使之保持良性發展,則具有非常重要的生態意義和應用價值。解決這類問題的主要工具是種群動力學模型,解決的依據是數學的理論和方法…

數組填充php,php數組入門教程之數組填充

本文介紹下,有關php數組之數組填充的一個例子,有需要的朋友參考下。在php編程中,對數組元素進行填充,可以使用array_fill()函數。來看下面的例子,array_fill()函數——填充數組函數:";print_r ($array…

php在類定義一個我靜態變量,php中靜態類與靜態變量用法的區別分析_PHP教程

php中靜態類與靜態變量用法的區別分析static是定義一個靜態對象或靜態變量,關于static 定義的變量或類方法有什么特性我們看完本文章的相關實例后就見分曉了.1. 創建對象$object new Class(),然后使用”->”調用:$object->attribute/function&…

matlab 排序點,matlab如何進行排序?

來自SORT的MATLAB文檔&#xff1a;If A has complex entries r and s,sort orders them according to thefollowing rule: r appears before s insort(A) if either of the followinghold:abs(r) < abs(s)abs(r) abs(s) and angle(r) < angle(s)換言之&#xff0c;具有復…

matlab不同調制方式下性能比較,用不同調制方式實現跳/擴頻混合通信的抗干擾性能...

論文寫作指導&#xff1a;請加QQ229366758摘要&#xff1a;介紹了BPSK&#xff0c;QPSK&#xff0c;16PSK&#xff0c;FSK&#xff0c;MSK及GMSK 6種數字調制方式的特點&#xff0c;采用Matlab中的Simulink建立了各種調制方式實現DS/FH混合擴頻系統的仿真模型。重點研究了跳/擴…

matlab cd參數,MATLAB變量參數列表?

默認值default value對于用戶沒有傳遞參數值時給函數進行自動賦給該參數的值?比如上述的例子中&#xff0c;阻尼系數&#xff0c;用戶通常不清楚&#xff0c;可以由系統給出更為合適。怎么做到呢&#xff1f;?可以結合MATLAB的一個函數nargin&#xff0c;它能給出函數輸入參數…

java 旋轉方向,Java 2d方向鼠標點旋轉

使用Graphics2D旋轉方法確實是最簡單的方法.這是一個簡單的實現&#xff1a;int centerX width / 2;int centerY height / 2;double angle Math.atan2(centerY - mouseY, centerX - mouseX) - Math.PI / 2;((Graphics2D)g).rotate(angle, centerX, centerY);g.fillRect(...)…

基于matlab 的燃油噴霧圖像處理方法,基于MATLAB的燃油噴霧圖像處理方法.doc

基于MATLAB的燃油噴霧圖像處理方法基于MATLAB的燃油噴霧圖像處理方法摘要:提出了基于MATLAB的燃油噴霧圖像處理方法。通過對噴霧圖像的采集, 分割和濾波處理, 將多幅圖像轉換融合為一幅比較清楚的二值圖像, 對拍攝的噴霧圖像進行了去噪及二值化等初步處理, 并提取其輪廓圖, 求取…

matlab聲音信號時域頻域轉換,關于處理用采集卡采集到的聲音時域信號轉化成頻域信號........

求助各位大神&#xff0c;我用麥克風通過采集卡采集到了一段聲音數據&#xff0c;數據在附件里&#xff0c;矩陣中第一列為時間&#xff0c;第二列為采集到的聲音的電壓信號&#xff0c;采樣頻率為1萬Hz&#xff0c;做出時域圖和頻域圖的程序如下所示&#xff1a;clear;clc;loa…

win7和mysql亂碼,windows本地mysql數據庫存入中文亂碼

windows本地mysql數據庫存入中文亂碼作者:PHPYuan 時間:2018-07-23 03:41:20出現的問題&#xff1a; 我這頁面存中文到數據庫會亂碼 我打了斷點 中文是傳到后臺dao層的 然后我試了下 把我本地項目連服務器數據庫 保存不會亂碼 我就懷疑是本地數據庫有問題 然后我用navicat寫了個…

畢業設計matlab在誤差處理中的應用,畢業設計MATLAB在誤差處理中的應用要點分析.doc...

畢業論文任務書院(系) 機械工程學院 專業班級 測控082級 學生姓名 馬 魁一、畢業論文題目 MATLAB在誤差理論中的應用二、畢業論文工作自______ ___年____ _月___ __日 起至____ _____年 月_____日止三、畢業論文進行地點: 陜西理工學院四、畢業論文內容要求&#xff1a;傳統的數…

帝國cms 未審核 showinfo.php,帝國CMS批量修改文章未審核狀態及批量修改上線時間...

帝國CMS批量修改審核文章未審核狀態&#xff0c;批量自定義指定文件上線時間&#xff01;用法&#xff1a;后臺增加自定義頁面 PHP CODE:$infouptimeto_time(2016-06-12 10:50:19); //上線時間$sql$empire->query("select * from {$dbtbpre}ecms_".$class_r[2][…

php 完美防sql注入,PHP 完美的防XSS 防SQL注入的代碼

PHP "完美"的防XSS 防SQL注入的代碼function gjj($str){$farr array("/s/","/]*?)>/isU","/(]*)on[a-zA-Z]s*([^>]*>)/isU",);$str preg_replace($farr,"",$str);return addslashes($str);}function hg_input_b…

oracle 并行執行 殺掉會話,oracle – 為什么即使我禁用并行DML和并行DDL也會創建并行會話...

READ和WRITE并行性并不總是捆綁在一起.alter session disable parallel dml;僅禁用語句的WRITE部分的并行性. READ部分可能仍然并行運行.由于這是MERGE操作,因此并行提示請求讀寫并行寫入.此外,并行提示覆蓋alter session disable parallel query;,即使它不覆蓋alter session d…

oracle臨時表空間占用率過高,ORACLE 臨時表空間使用率過高的原因及臨時解決方案...

數據庫temp臨時表空間增大&#xff0c;一般在數據安裝時設置臨時表空間大小&#xff0c;默認的情況下都是設置為自動增長。這樣會引起一個問題&#xff1a;在數據庫使用中temp表空間會自動擴展的越來越大&#xff0c;造成磁盤空間使用不足。引起臨時表空間增大主要使用在以下幾…