摘要:使用狀態(tài)對(duì)象的訪問我把理解成構(gòu)造器中的里面存放一些數(shù)據(jù),例如用戶姓名性別身份證號(hào)等等。
vuex是配合vue一塊兒使用的一個(gè)狀態(tài)管理工具。
我通常使用它來保存一些全局的數(shù)據(jù),例如用戶登錄信息,用戶身份信息,總之一些在很多頁面都會(huì)使用到的信息,都保存在vuex里面,用的時(shí)候就不需要再去請(qǐng)求接口了,直接去vuex里面拿就可以了。
先放官網(wǎng)地址
npm install vuex --save配置
我實(shí)在vue-cli環(huán)境中使用vuex的,所以這里就以這個(gè)環(huán)境作為項(xiàng)目文件結(jié)構(gòu)來寫配置了。
先在src/assets文件夾中新建一個(gè)vuex/store.js文件,建好之后在文件中寫如下代碼:
import Vue from "vue" import Vuex from "vuex" Vue.use(Vuex) const store = new Vuex.Store({ state: { name: "xiaoming", count: 1 } }) export default store
在main.js中引入store.js:
import store from "@/assets/vuex/store"; 在全局構(gòu)造器中注冊(cè)一下:(這里千萬別忘了) new Vue({ el: "#app", router, components: { App }, template: "", store: store //在根實(shí)例下面注冊(cè)store,相當(dāng)于全局注冊(cè),可以全局調(diào)用 }) //題外話 //在vue-cli中,引入某些特定后綴的文件是不需要寫全后綴的,就像上面這個(gè)store //因?yàn)樵赾onfig/webpack.base.conf.js文件中,有這樣一段代碼: resolve: { extensions: [".js", ".vue", ".json"], //這些后綴的文件可以不寫,可以自己隨意添加 alias: { //模塊別名定義,方便后續(xù)直接引用別名,無須多寫長(zhǎng)長(zhǎng)的地址 "vue$": "vue/dist/vue.esm.js", "@": resolve("src"), //從src文件夾開始尋找文件 } }
到這里,vuex已經(jīng)在你的項(xiàng)目中安裝好并且可以使用了。你只需要在vue的html的部分寫上如下代碼:
{{$store.state.name}}//頁面中會(huì)顯示"xiaoming"
或者在構(gòu)造器里面寫:
console.log(this.$store.state.name); //打印"xiaoming"
html代碼書寫取值的時(shí)候可以不加this,script代碼中必須加this。
使用1.state狀態(tài)對(duì)象的訪問(我把state理解成vue構(gòu)造器中的data)
state里面存放一些數(shù)據(jù),例如用戶姓名、性別、身份證號(hào)等等。之前我的訪問方式是:
{{$store.state.name}}
但是上面這種寫法太長(zhǎng)了,而且看起來不直觀,查閱過文檔之后我發(fā)現(xiàn),訪問state對(duì)象可以有以下三種寫法:
//如果我想在頁面中只寫{{name}},可以這樣寫: 1. computed: { name() { return this.$store.state.name; } } 2. import {mapState} from "vuex"; computed: mapState({ name: state => state.name //es6箭頭函數(shù) }) 3. import {mapState} from "vuex"; computed: mapState(["name"]); //這種寫法最簡(jiǎn)單,推薦
2.訪問mutations方法(我把mutations理解成vue構(gòu)造器中的methods)
先在store.js中寫上如下代碼:
const store = new Vuex.Store({ state: { name: "xiaoming", count: 1 }, mutations: { add(state,num) { //接收一個(gè)外部參數(shù) state.count += num; }, reduce(state) { state.count --; } } })
原先我調(diào)用add和reduce方法的時(shí)候,寫法是:
{{count}}
但是這種調(diào)用方法的寫法也太長(zhǎng),需要寫上$store.commit這種東西,太啰嗦。
模仿訪問state的方法,它也有另外一種便捷的寫法:
import {mapState,mapMutations} from "vuex"; methods: mapMutations(["add","reduce"]), //需要注意的是,state寫在computed里面,而mutations寫在methods里面,因?yàn)樗窃贎click之后的方法
現(xiàn)在你可以這樣調(diào)用它:
{{count}}
3.訪問getters(我把getters理解成vue構(gòu)造器中的computed)
getters就像一道門,每操作一次數(shù)據(jù),都會(huì)經(jīng)過一次它。
現(xiàn)在,在store.js中加入getters代碼:
const store = new Vuex.Store({ state: { name: "xiaoming", count: 1 }, mutations: { add(state,num) { //接收一個(gè)外部參數(shù) state.count += num; }, reduce(state) { state.count --; } }, getters: { add100(state) { return state.conut += 100; //每操作一次count,它都會(huì)加上100 }, changename(state) { return state.name + "c"; //每操作一次name,它都會(huì)拼接上一個(gè)c } } })
怎么調(diào)用它呢?模仿state的調(diào)用方法。
因?yàn)樗鼈兌际菍?duì)數(shù)據(jù)進(jìn)行操作,不涉及方法,所以getters也寫在computed中。
import {mapState,mapMutations,mapGetters} from "vuex"; //現(xiàn)在來看computed的代碼要怎么寫 //在寫state的時(shí)候,我們把computed中的代碼寫成了這樣: //computed: mapState(["name"]); //那如果現(xiàn)在再加入mapGetters,就需要改變computed的樣子,具體應(yīng)該這樣寫: computed: { ...mapState(["name","count"]), //es6擴(kuò)展運(yùn)算符,用map必須得用這個(gè),否則會(huì)報(bào)錯(cuò) ...mapGetters(["add100","changename"]), count2: function() { return this.$store.state.count; } }
此時(shí),每當(dāng)你操作一次button按鈕,無論是加法還是減法,它都會(huì)對(duì)count進(jìn)行+100的操作。當(dāng)然,此時(shí)的name是不會(huì)改變的,即使你引入了changename方法,但因?yàn)闆]有改變過name,所以就不會(huì)出發(fā)changename方法。
4.訪問actions
actions與getters的用法相似,但是它是異步調(diào)用,寫在methods里面。(說實(shí)話我是沒看懂這個(gè)actions有啥用)
先來完善一下我們的store.js中的代碼:
const store = new Vuex.Store({ state: { name: "xiaoming", count: 1 }, mutations: { add(state,num) { //接收一個(gè)外部參數(shù) state.count += num; }, reduce(state) { state.count --; } }, getters: { add100(state) { return state.conut += 100; //每操作一次count,它都會(huì)加上100 }, changename(state) { return state.name + "c"; //每操作一次name,它都會(huì)拼接上一個(gè)c } }, actions: { add1(context) { //參數(shù)context即全局上下文對(duì)象,store context.commit("add",10); //通過context調(diào)用add方法 setTimeout(()=>{context.commit("reduce")},3000) }, reduce1({commit}) { //{commit}是另一種傳參方式,一個(gè)封裝好的commit commit("reduce"); } } })
寫好actions方法了之后,就來調(diào)用它,調(diào)用方法跟mutations差不多:
methods: { ...mapMutations(["add","reduce"]), ...mapActions(["add1","reduce1"]), aa(i) { console.log(i) } }
在html代碼中使用:
reduce1方法調(diào)用了mutations中的reduce方法,每次點(diǎn)擊減1;
add1調(diào)用了mutations中的add方法,每次點(diǎn)擊加10,同時(shí)在3秒鐘之后,會(huì)調(diào)用一次減法,減去1;
因?yàn)檫€有g(shù)etters的設(shè)置,所以每次操作的時(shí)候還會(huì)再加100。
以上就是vuex的大致用法了,我平時(shí)只有state用的比較多。
我對(duì)vuex的理解很淺,如有不對(duì)的地方,請(qǐng)指正。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/52213.html
摘要:我們通常稱之為狀態(tài)管理模式,用于解決組件間通信的以及多組件共享狀態(tài)等問題。創(chuàng)建指定命名空間的輔助函數(shù),總結(jié)的功能首先分為兩大類自己的實(shí)例使用為組件中使用便利而提供的輔助函數(shù)自己內(nèi)部對(duì)數(shù)據(jù)狀態(tài)有兩種功能修改數(shù)據(jù)狀態(tài)異步同步。 what is Vuex ? 這句話我想每個(gè)搜索過Vuex官網(wǎng)文檔的人都看到過, 在學(xué)習(xí)源碼前,當(dāng)然要有一些前提條件了。 了解Vuex的作用,以及他的使用場(chǎng)景。 ...
摘要:而鉆研最好的方式,就是閱讀的源代碼。整個(gè)的源代碼,核心內(nèi)容包括兩部分。逃而動(dòng)手腳的代碼,就存在于源代碼的中。整個(gè)源代碼讀下來一遍,雖然有些部分不太理解,但是對(duì)和一些代碼的使用的理解又加深了一步。 筆記中的Vue與Vuex版本為1.0.21和0.6.2,需要閱讀者有使用Vue,Vuex,ES6的經(jīng)驗(yàn)。 起因 俗話說得好,沒有無緣無故的愛,也沒有無緣無故的恨,更不會(huì)無緣無故的去閱讀別人的源...
摘要:說實(shí)在話,我在閱讀文檔的時(shí)候,也很難以去理解,甚至覺得沒有使用它我也可以。介紹那么到底是什么引用官網(wǎng)的說法就是是一個(gè)專為應(yīng)用程序開發(fā)的狀態(tài)管理模式。它采用集中式存儲(chǔ)管理應(yīng)用的所有組件的狀態(tài),并以相應(yīng)的規(guī)則保證狀態(tài)以一種可預(yù)測(cè)的方式發(fā)生變化。 前言 先說句前話,如果不是接觸大型項(xiàng)目,不需要有多個(gè)子頁面,不使用vuex也是完全可以的。 說實(shí)在話,我在閱讀vuex文檔的時(shí)候,也很難以去理解v...
摘要:說實(shí)在話,我在閱讀文檔的時(shí)候,也很難以去理解,甚至覺得沒有使用它我也可以。介紹那么到底是什么引用官網(wǎng)的說法就是是一個(gè)專為應(yīng)用程序開發(fā)的狀態(tài)管理模式。它采用集中式存儲(chǔ)管理應(yīng)用的所有組件的狀態(tài),并以相應(yīng)的規(guī)則保證狀態(tài)以一種可預(yù)測(cè)的方式發(fā)生變化。 前言 先說句前話,如果不是接觸大型項(xiàng)目,不需要有多個(gè)子頁面,不使用vuex也是完全可以的。 說實(shí)在話,我在閱讀vuex文檔的時(shí)候,也很難以去理解v...
摘要:說實(shí)在話,我在閱讀文檔的時(shí)候,也很難以去理解,甚至覺得沒有使用它我也可以。介紹那么到底是什么引用官網(wǎng)的說法就是是一個(gè)專為應(yīng)用程序開發(fā)的狀態(tài)管理模式。它采用集中式存儲(chǔ)管理應(yīng)用的所有組件的狀態(tài),并以相應(yīng)的規(guī)則保證狀態(tài)以一種可預(yù)測(cè)的方式發(fā)生變化。 前言 先說句前話,如果不是接觸大型項(xiàng)目,不需要有多個(gè)子頁面,不使用vuex也是完全可以的。 說實(shí)在話,我在閱讀vuex文檔的時(shí)候,也很難以去理解v...
摘要:使用,引入之后用進(jìn)行引用。在模板中引入們剛建的文件,并在模板中用輸出的值。在文件中加入兩個(gè)改變的方法。和單純的全局對(duì)象有以下兩點(diǎn)不同的狀態(tài)存儲(chǔ)是響應(yīng)式的。改變中的狀態(tài)的唯一途徑就是顯式地提交。 vuex 是什么? Vuex 是一個(gè)專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式。通俗的解釋就是,Vuex 就是為 vue 組件之間進(jìn)行數(shù)據(jù)共享而開發(fā)的插件。 vuex 什么時(shí)候用? 實(shí)現(xiàn)數(shù)據(jù)...
閱讀 2212·2021-11-25 09:43
閱讀 1177·2021-11-23 09:51
閱讀 3511·2021-11-23 09:51
閱讀 3637·2021-11-22 09:34
閱讀 1573·2021-10-09 09:43
閱讀 2134·2019-08-30 15:53
閱讀 3171·2019-08-30 14:07
閱讀 579·2019-08-28 18:14