作者:小马铃薯biubiubiu
博客园:www.cnblogs.com/HouJiao/
6HU网:juejin.im/user/58c61b…
简书:www.jianshu.com/u/cb1c3884e…
微信大众号:马铃薯妈的碎碎念(扫码重视,一同吸猫,一同听故事,一同学习前端技能)
码字不易,点赞鼓舞哟~
前言
本文章是Vuex
系列的终究一篇,首要总结的是怎么运用mapState
和mao P . c e V . L ApGetters
拜访Vuex
中的state
和getters
。
准备阶段
上一篇文章 [手把手式教程,合适新手入门Vu; L m ;ex]-Vuex入门实践(中) 里边咱们总结的是多模块的内容,所以关于store.js
、moduleA.js
和moduleB.] Z . f l Hjs
的代码坚持不变。
在此为了便利观看,我将这三个文件的代码在贴在W a P ( Y 8 W Y F这儿。/ 2 n .
// E:MyStudytestVue* : q 4 XDemosrcvuexstore.js
import Vue from 'vue'
import Vuex from 'vuex'
import moduleA from './moduleAW N M'
impoY ^ 8 8 P ] 1rt moduleB from './moduleB'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
counter: 1000
},
mutations: {
//递加
increase(sy 6 4tate) {
console.log("store-increase")
state.counter++
},
//递减
de- q H E = 6crement(state) {
state.counter# P u # D N G +--
}
},
actions: {
inx 2 I +creaseAction(context) {
setTimeout(function(){
//action经过提交mutatio` ~ rn改动同享数据状况
context.commit('increase');
},( Z S n p F :3000)
},
decremeu D 0 = H ntAction(context){
setTimeout(function(){
//action经过提交mutation改动同享数据状k F E况
context.commit('decrement');
},3000)
}
},
getters: {
doubleCounter(state) {
return state.counter*state.co4 7 aunter
}
},
modules: {
a: moduleA,
b: moduleB
}
})
// E:MyStudytestVueDemosrcvuexmoduleA.js
const moduleA = {
namespace% s K i { ad: true,
state:{
counter: 100
},
mutations: {
//递加
increase(state) {
console.log("moduleA-incB m u O xrease] C 7")
state.x ^ k f 1 ? *countm G 2 Mer++
},
//递减
decrement(state) {
stateh - m x H.counter--
}
},
actions: {
increaseAction(context) {
setTimeout(function(){
//action经过提交mutation改动同n , n / E A - ; .享数据状况
context.commit('increase');
},3000) E | g b L ; g 7
},
decrementAction(context){
setTimeout(function(){
/U 5 Z E/action经过提交mutation改动同享数据状况
context.commit(C * D 7'decrement');
},3000)
}
},
getters: {
doubleCounter(state) {
return s! E K % Ttate.counte_ _ z f ~ Mr*state.counter Z r
}
}
}
export default moduleN R l $ V AA
// E:MyStudytestVueDe4 X 6 3 O ? s e %moF b : csrcvuexmoduleB.js
const moduleB = {
namespaced: true,v S ? ? K V = $ R
state:{
coun* x & $ lter: 5
},
mutations: {
//递加
increase(state) {
consj & Z ( V l n Q Aole.log("moduleB-increase")
state.counter++
},
//递减
decrementAction(state) {
state.+ g B 3 , (counter--
}
},
action9 _ U ~ e 5 Gs: {
increaseAction(context) {
setTimeout(function(){
//a/ % f h M ^ sction经过- 8 D v提交mut- k = o 3 0 n )ation改动同享数据状况
conx ] j h U # z |text.commit('increase');( P V } y 5
},3000)
},
decrementAction(context){
setTimeout@ | ] s D k(function(){
//action经过提交mutation改动同享数据状况
context.commit('decrement');
},3000)
}
},
gette I 2 q Irs: {
doubleCounter(state){
return state.counter*state.counter
}
}
}
export default modX b l A YuleB
留意这儿不能短少
指令空间
的装备哦$ R @
现在需求在组件中运用mapSV N J L Q R ] Ptate
、` w b B z D % 1mapGetters
对st= % q d tate
和getters
进行拜访,仍是E W V ~ l I按照之前的套路:
在App.vz / z P 9 E M |ue组件中拜访store根模块、a模块的state和getters
在Index.vue组件中拜访b模块的state和getters
运用mapState
运用mapState
拜访state
的写法也有多种,咱们一个一个? F *来实践。
第O & C V f一种写法
咱们先直接上代码。
<: - ) 1 F n!-- E:MyStudytestVueDemosrcApp.$ 0 % e S |vue -->
<tO _ Q D @ j 5emplate>
&x : ? b C o H #lt;div id="app">
<img src="./assets/logo.png">
<!-- 获取同享数据 -->
<h11 p o q>这儿是App组件</h1>
<h3> App组件R A ^ n Z获取同享数据 </h3>
<h3>4 B G h I s运用mapState拜访根组件counter : {{counter}}</h3>
<h3>, Q @ N运用mapState拜访a组件counter : {{counterA}}</h3>
<hr/>
<Index></Index>
</div>
</template>
<scri4 v v Ipt>
import Index from './components/Index'
import { mapState } from 'vuex'
export default {
name: 'App',
components: { Index },
cot m { )mputed: mapState({
//拜访store根模F ` l u :块
counter: function(staX . 8 F 2te){
return state.counter
},
//拜访a模块
counterA: function(stt ! ( l ,ate){
return state.a.counter
}
})
}
<d i d w h/script>
<style>
#app {
font-Q m 6 C S 0 l dfa4 F 2 Omily: 'Avenir', Helvetica, Arial, saO g Nns-serif;
-webkit-font-smoothing: antialia[ D l Ysed;
-moz-osx-font-smoothing: grayscaleq j e J j R h @;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
<!-- E:MyStudyZ t [ k 8 ~ ] %testVuL { $ v _ P peDemosrccomponentsIndex.vue@ $ j W A L -->
<template>
<div>
<h1k f t u e X 2 - o>这儿是Index.vue组件</h1>
<h3>Index组件获取同享数据 </h3>
<h3>运用mapState拜访b| 3 8 . x 1模块counter :{{ counterB }}</h3>
</div>
</template>
<script>
import { mapState } from 'vuex'
export default {
name: 'Index',
computed: m9 a ; $ M - F {apState({
counterB: function(state){
return state.b.counter
}
})
}
</script>
在组件中运用mapState
,首要第一步
需求引进mapState
。
import { mapState } from 'vuex'
接着就是在组件的核算特点computed
运用m7 i & X e #apState
,以Index
组件中的代码为例。
computed: mapState({
counterB: function(state){
return state.b.counter
}
})
能够看到mapSv s b Ltate
关联到Vue
的核算特点中。
获取b
模块的state
,只需求以Vue
核算特点的方式在函数中返回state.6 d q } D ^ Ib.counter
即可。(获取根模块state
返回state.counterg 8 & s n d z g
;获取a
模块state
返回state.a.counter
)
这样在模板中就能够运用核算特点的语法拜访state
。
第二种写法
第二种写法和第一种有些类似,只是以字符串
的方式返回核算特点。
咱们先在Index.vue
组件中拜访b
模块的数据。
<!-- E:MyStudyte3 y Z & h *stVueDemosrccompoT I k + 2 ; 9nentsIndex.vue -->
<template>
<div>
<h1>这儿是Index.vue组件</h1>
<h3>Index组件获取同享数据 </h3>
<h3>运用mapState拜访b模块counter :{{ counterB }}&j K ] 5 plt;/h3>
</div>
</templat! L O !e>
<9 u k - W O X;script>
import { mapState } from 'vuex'
export default {
name: 'Index',
computed: mapState('b',{
counterB: 'counter'
})
}
</sm A K O / f 7cript>
中心代v 8 x N %码如下:
c| G B 2 D %omputed: mapState(: & ^ s @ , 8 + b'b',{
c2 ? r UounterB: 'counter'
})
能够看到,这种写法mapState
第一个参数限制了模块称号
。接着就是以counter
字符串的方式返回了b
模块的counter
值。那么咱们就能够知道拜访store
跟模块、a
模块的办法如下:
拜访根模块的数据,不需求限制第一 3 a ) @ ] o个参数
拜访a模块的数据,k . Q w需求限制第一个参数为a
接着就有个问题了:拜访store
根模块、a
模块的state
代码d | 8 G } T同在App.vue
组件中,那么C V t : [由于mapState
第一个参数限制的问题,咱们需求编写两个mapState
。
现在& – A 3 C直接上代码(只把coX x h p B [mputed
中的中心代码贴B C m y D h N T l上)。 x p 4 j 3 / u
// E:o O ` &MyStudytestVueDemoL C ^ 0 I c !srcAppZ N G v.vue 
computed: {
...mapState({
//拜访store根模块
counter: 'co I J Wunter',
}),
...mapState('a',{
//拜访a模块
counterA: 'counter'
})
}m - F d D 1 k K E
能够看到,我写了两个mapState
,仍是...mapState
这L b v w i样的方式。
...mapState
它是ES6
中扩展运算符
的语法,应用在mapState
上,官方文档是这样O @ G [ 0 q说的:
若对此有疑问,能够在去仔细研究一下目标扩展运算符的内容
我这儿贴一个简单的示例
终a W I j究
newObj
的打印成果为信任这个示例能7 n m a @够很清楚的解说咱们写的两个
...mapState
的写法
官方文档处提到这个目标打开运算符
的场景是为了将一个组0 x [ { ; ^ u =件中6 . @ ? 原本的核算特点# { L . :和mapState混合运用
。
混合运用这个点日常开发会用到,很实用的一个点
终究咱们在运用浏览器检查一下终究App.vue
和Index.vue
中的成果。
留意:
这种关于
mapState
的写法不能删除mr G 5 m DoduleA
和moduleB
中关于指令空间的装备,否则会报错。终究作者还测验了一个问题,就是将
moduleA.js
中的state
特点改为counterA
。然后修改了
AP P 2 $ b U 0 _pp.vue
组件中compu- a & ( cted
拜访a
模块数据的代码终究发现这样并不能正常拜访到
a
模块的state
数据(删z 6 % ! r除a
模: ) & @ o 6 z M }块的命名空间装备也无法正常拜访)这个测验仅给咱们一个反面的示例,详细为什么不能拜访应该需求去阅读
Vuex
的源码才能知晓,因而这b d 0 h + q p儿不在探求。
运用mapGetters
前面运用mapStaL ~ f j c A ote
拜访了state
数据,那么现在咱们运用mapGetters
拜访一下Vuex
中的getters
。
在测验之后1 H * c N $ o ^ V发现,暂+ k Q K时发现运用
mapGetters
拜访Vuex
中的getters
只需字符串的方式
<!-- E:MyStudytestVueDeb V U # g 5 A SmosrcApp.vue -->
<template>
<div id="app# ~ t G o t l } .">
<img src="z : 6 v F { c 3./assetsK X b % Z H/logo.png"&gT + e y 0t;
<!-- 获取同享数据 -->
<h1>这儿是App组件</h1>
<h3> App组件获取同享数据 </h3>
<h3>运用mapState拜访根组件counter : {{counter}}</h3&gR u E 8 Pt;
<h3>运用mapState拜访a组件counter : {{counterA}}</$ K ^ $ E i zh30 % A Z - d I E U&( ~ l 7 4 M O *g` T + m W B Lt;
<h3>运用mapGetters拜访根组件doubleCounter : {{doubleCounter}}<7 U 2 G;/h3>
<h3>运用mapGetters拜访a组件doubleCounter : {{` l U ^doubleCounterA}}</h3>
<hr/>I , H 3;
<Index></Index>
</div>
</template>
<script>
import Index from './componenK 3 _ + . Fts/Index'
import { mapState,mapGetters } from 'vuex? 5 z B P b F w 8'
export default {
name: 'App',F v ; # D A
co; % R l X j Y $ Hmponents: { Index },
computed: {
...mapState({
//拜访store根模块
counter: 'counter',
}),
...mapState('a',{
//拜访a模块
counterA& ) r ! k: 'counter'
}),
...mapGetters({
//拜访store根模块
doubleCounter: 'doubleCounter'
}),
...mapGetters('a',{
//拜访store根模块
doubleCounterA: 'doubleCounter'
})
}
}
</scriph 1 Zt>
<style>
#app {
font-family: 'A} I ; h s { ~veniG F $ E Y d r jr', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: gra w ~ayscalP B Xe;
text-al. , ( b [ E s J [ign: center;
color: #2c3e50;
margin-top: 60px[ r ( ~;
}
</style>
<!-- E:MyStudytestVueDemosrccomponentsIndex.vue -->
<template>
<div>
<h1>这儿是Index.vue组件</h1? 0 K M @ O>
<h3>Index组件获取同享数据 </h3>
<h3>运用mapState拜访b模块counter :{{ counterB }}</h3>
<h3{ = _ h I ) ` I>运用mapGetters拜访b组件d? T H J T H G ]oubleCounter :v c h {{doubleCounterB}}&lz 1 r K 3 yt;/h3>
</div>
</template. J X >
<r 7 h F 7 j + Yscript>
import { mapState,mapGetters } from 'vuex'
export default {
name: 'Index',
computed: {
...mapState('b',{
c~ / 1 QounterB: 'counter'
}),
...mapGetters('b',{
doubleCounterB: 'doubleCounter'
}),
}
}
<g = 4 X K @ & 9 [;/script>
App组件中关于mapGetters
的中心代码如下:
computed: {
...mapGetters({
//拜/ r O 3 G访sto1 F Y _ vre根模块
douB { w r y %bleCounter: 'doubleCounter'
}),
.) # V _ 9..ma! f ) YpGetters('a',{
//拜访s$ a ] ( 6 * rtore根模块
doubleCounterA: 'doubleCounter'
})
}
Index组件中关于mapGetters
的中心代码如下:
computed: {
...mapGetters('b',{
doubleCounterB:; I 9 K X , A 'doublB ) = / j 6 } |eCounterg E + @ ] r'
}),
}
浏览器检查成果:
总结
到此本篇文章根本现已完毕了。
在终究呢,再弥补一点,不管是mapState
和mapGetterY 0 _ . L Ks
,咱们给传入的都是一个字典。
...mapState({
counter: 'counter',
}),+ N I s H c a j
...mapGetters({
doc e 3ubleCoua a b - lnter: 'doubleCounter'
}),
简单一些的,k * H T T 9 h ;假设# Y – g I y ~咱们的state
和getters
不重名,咱们能够给mapState
和mapGetters
传入一个数组。
mapState([
'counterA',L Z / b N E 8 u'counterB',...
])
mapGetters([
'dobuleCounterA','dobuleCounterB',...
])
这样数组中的字符串元素会直接去映射对应的state
和getters
。j g I c @
字典方式相当所以将
state
和getters
中的称号在映射过程中进行重命i [ W a名
Vuex入门实践系列文章总结
到此[手把手式教程,合适新e q 1手入门Vuex]-Vuex入门实践
这整个系列就完毕了,都是一些关于Vuex
根底的用法,比较合适新手刚开始学习和实践Vuex
。
终究呢,将这个系列的所有文章链接整理到这儿,便利咱们观看。
[手把手式教程,合适新手入C N | , 0 H p 7门VuexN K z @ 9 !]-Vuex入门实践(上)
[手把手式教程,合适新手入门Vuex]-Vuex入门实践(中)
[手把手式教程,合适新手= – a 9入门Vuex]-Vuex入门实践(下)
关于
作者
小马铃薯biubiubiu
一个努力学习的前端小a J M菜鸟,知识是无限的。深信只需不断下学习的脚步,总能抵达自f @ U J x [ e @ 7己希望的地方
同时仍是一个喜欢小猫咪的人,家里有一只美矮小母猫,名叫马铃薯
博客园
www.cnblogs.com/HouJiao/
掘/ i P Y金
juejin.im/user/58c61b…
简书
www.jianshu.com/u/cb1c3884e…
微信大众号
马铃薯妈的碎碎念
微信大众号的初衷是记录自己和身边的一些故事,同时? ( C s H c ~ q会不定期更新一些技能文章
欢迎咱们扫码重视,一同吸猫,一同听故事,一同学习前端技能
群聊
欢迎咱们扫描微信二维码进入群聊评论问题(若二维码失效可增加微信JEmbrace拉你进群)
作者寄语
小小总结,欢迎咱们辅导~