查看: 2360|回复: 1

[前端框架] Vuex 的用法详解

[复制链接]

4

主题

3

回帖

46

积分

管理员

积分
46
发表于 2019-6-12 15:24:50 | 显示全部楼层 |阅读模式

请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!

您需要 登录 才可以下载或查看,没有账号?注册

×
Vuex 的用法详解
" ?$ S: N: a  |/ w# S) L0 n: ?: A- @% K1 t8 \" D1 y: c% G
本案例测试下Vuex的使用,创建一个新的web项目2 I- I8 n; |6 C" c  p
Vue init webpack web5 g' m& i7 ^+ E: Z2 H9 m" a! e
安装vuex
" W7 n1 z) j$ cnpm install vuex --save! j* E& B" n7 R+ u
启动, npm run dev,打开localhost:8080  即可
/ ?* B! C7 ?: g9 Q0 [5 [& ]: b! n/ A) f- \

! v% T+ m. _1 t(1)引入vuex
9 ^7 M5 }4 _* U0 \( f& Q创建一个src/store文件夹,创建index.js , 引入并导出store
2 N( h2 K& G9 `% C% ~, uimport Vue from 'vue'
/ |/ _7 T$ l0 S7 h5 \4 C) @) gimport Vuex from 'vuex'! e$ k4 ^  Z% d% |
Vue.use(Vuex);
9 k" L+ m0 K  z  A+ vconst store = new Vuex.Store({
) x5 y8 p5 _1 b- p, x4 n})
5 r% k- [8 I" S. I8 Q3 Q% jexport default store;# |  y3 z$ j! U/ n3 J& W

# {1 u& B0 F" ?(2)引入store到main.js
' z8 X! W( U1 @3 [1 ^import Vue from 'vue'
" b( e( T8 ]2 l2 d% Cimport App from './App'& {. Q5 A, B7 D
import store from './store'
% g, u5 U# L. ]4 h$ d' d* Z7 q6 h; n  \9 {8 h
Vue.config.productionTip = false9 y+ ^& l2 C! V+ k; }

+ ~$ Y+ w- j1 Z1 _1 Z/* eslint-disable no-new */
* {( w" B0 B- e, \new Vue({0 m. @1 C' l$ ]: \: p8 [
  el: '#app',0 J8 W& K' v% h: E7 A) N4 m( ]
  store,9 s, T2 j( G! t4 W3 Y+ a% O
  components: { App },
8 Q- F" p1 r" {  template: '<App/>'+ M4 }, A( \% q" o$ B; P2 m. M/ e& U
})9 y. h5 y  r* ?8 {9 S' p
- b7 V& o) L8 o* t
5 ?' h$ D6 {8 q7 a1 y8 x% ?. _( W! _
5 {9 Y; l4 `! h+ ]1 t- W
(3) 修改 helloword.vue ,先使用state获取值进行测试
' h- N+ z5 I; @7 G6 CState: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;
" W# ~' V$ J4 a9 |: rconst store = new Vuex.Store({. G5 d9 T9 a& N
  state: {
4 A; A  J. [+ A  X5 x      count:16 k1 t2 ^, o' R8 l. T( _* y3 c
  }( h' b+ s0 a! e  _! `
})
0 O2 m3 t: Y' Q' ?/ D: f2 F& y; o5 A9 Q+ i' Y
helloword.vue----' w& ~8 R8 k) S. k+ _& k+ r9 w$ Z7 X
<template>* {' k5 C& ^" C4 y  r; G1 z: T
  <div class="hello">( A; N: _" b; D- Z0 C3 Z

- r9 D" ^4 |" t' j    <h2>{{this.$store.state.count}}</h2>2 }! {' s! @: k( a% D6 z
# b  B( N# ~* M  W6 `
  </div>
! V3 V2 h: w* n5 b0 \8 H- k- @</template>
+ m- n& Z& p0 C5 R
& _5 g. u* U5 _3 p% F  A
1 L) J7 C+ C4 q
显示结果为: 1 ! S0 U6 A2 a1 y+ {' \8 O$ ]
9 Y3 g6 s1 Y3 J: X1 S
9 k: N& Z7 `$ B- J& g
(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:
- [2 G2 C$ f' L% P) B# I
( d) e# ^& E  ?# {const store = new Vuex.Store({
" Q0 }* V' M3 b* ?  state: {
6 I2 i# u8 B% N+ G2 Z      count:1
+ g2 X- |4 E# F5 n3 o  },2 W( y1 @! s! l) H
  getters:{
$ u6 ]/ S. }' }0 k: Z      getStateCount:state=>{
& m) l; J* y  a8 R! q" m1 P          return state.count + 1;
! S  u* ]; t+ |      }. F& ]' U/ t+ A
  }  i4 w' M* N: {, f5 ^" D1 F/ e) ]
})
8 I& ]- ^' B( m2 K. n% Y/ i; M* Y/ x5 w$ r0 {
<template>( ^$ R1 s$ j, W& \' F% z4 C# _
  <div class="hello">7 ^, w/ g# V4 J& w7 U

2 j' q. p+ D5 @2 ?3 I! G# p  t% A    <h2>StateValue: {{this.$store.state.count}}</h2>% O; J+ V2 m. @# y
     <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
1 O0 {( M4 J9 a8 W! \) v  </div>
. [& d4 J% Z. i+ C</template>/ p# u. E5 c) n! u& ^0 H

! U' Q$ p+ `0 i# k
6 N8 K* i5 E; r
显示结果:$ U- f. K  U5 ?- x8 a" \0 W* Z* W
StateValue: 1GettesVaule: 23 P) m  l; Q. C8 `; S
1 ]% ^, j! z$ f  X
(5)8 g; k6 x- Q! e

Mutations:

数据我们在页面是获取到了,但是如果我们需要修改count值怎么办?如果需要修改store中的值唯一的方法就是提交mutation来修改,我们现在Hello World.vue文件中添加两个按钮,一个加1,一个减1;这里我们点击按钮调用addFun(执行加的方法)和reductionFun(执行减法的方法),然后在里面直接提交mutations中的方法修改值:


" [3 Z8 r! l4 }# ^; x7 L5 e修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:
' K3 [# ]" Z! l/ Mmutations:{$ v4 ]+ A! |! A- T- y6 L
      add(state){1 r& z( ^9 ?  p6 a: A  j+ a
         state.count = state.count + 1;% z3 h' u5 L5 z+ a# ~+ a
      },
1 [1 e* T- C5 u7 ?, s      reduce(state){4 ~: q2 `, P4 J& f, F; C
        state.count = state.count - 1;
! |2 G3 w# ?* q$ h/ q    }
  C+ {7 Y% n3 `) R  }* F' w( U8 D& \8 Z9 @- x& C
<template>
- B  G/ h) S3 t3 D( ]  <div class="hello">
1 g, \( @+ c: _" B" a- A4 C' a    <h1>Actions:</h1>4 n# u' E7 O# |5 C2 D4 T3 g
    <el-button type="primary" @click="addFunc()">Add</el-button>6 ?% Z4 u$ H" M' r) x
    <el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>. @& N- ]. ?* ], m, p" H
    <h2>StateValue: {{this.$store.state.count}}</h2>+ n8 t# j- d- z* F  o
    <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>4 A5 t2 H/ T  `% s5 R9 }  J
  </div>  i8 O- H& O5 |7 S
</template>/ O0 [9 s5 |$ ~6 l9 R, P' A% p8 C

5 @# L& K2 \# A' l% i; u3 |

& a2 K6 j8 C5 X$ ]9 m- D结果:
- t% E* z3 |5 F, O
  S" L2 e& G' ?' [

5 ~" d1 q9 L& Q4 d$ k8 g  V6 vActions:Add
ReduceStateValue: 5GettesVaule: 6
) m0 Z0 R0 ~* h# W+ H* T
$ C% B/ x- }& ~7 }) u* P- M, q: b1 g. i( r0 z0 v$ i

& e+ F  `. F/ x: |7 O( u0 {5 V% \1 N' E2 D

' o, r" a  R7 g, b3 F
( T2 V" a; |6 J9 B/ |5 v" w; [

0 X3 ?5 H, b8 d" O2 _: t# B  {% T0 k: V* ]( g% \! q& n0 g2 M
(6)Actions:
6 z& i* `& M. M, O6 k- ?

我们看到,当点击三次后值从2变成了-1;页面上的值是改变了;我们达到了修改store中状态值的目的,但是,官方并不介意我们这样直接去修改store里面的值,而是让我们去提交一个actions,在actions中提交mutation再去修改状态值,接下来我们修改index.js文件,先定义actions提交mutation的函数:


$ r6 ^6 C$ w- P1 e8 B, l7 t

2 [& ~5 r6 y  |4 v4 F/ w
mutations:{
+ ?) [& r- M1 E: D0 O( x      add(state){
: `3 H+ D- s+ n4 n! C. ^3 V         state.count = state.count + 1;, D( K  z. p- w. V' Z) x7 H+ M$ R
      },
( K; f3 _3 c! f% P) x+ d      reduce(state){
+ }, C9 n/ w& B/ \7 T5 j        state.count = state.count - 1;/ N  I# y4 C& f2 K0 L* r
    }, }7 G! E* D1 g9 r8 E
  },2 ?9 @# N: P2 M9 x  L# N6 k
  actions:{
( g7 m7 g/ q8 l% h      addFunc(context){
# B, {5 R9 Q' W1 H( Q& @* p          context.commit("add");
8 \9 `5 ~; j; G$ C" I$ `8 E      },
; R1 M( u) b8 n% f      reduceFunc(context){
3 y+ {8 K+ P+ D0 o          context.commit("reduce");" _, V, b- w& s- R7 g+ G
      }
0 P# H. K4 Q3 x' s3 \' s, `! i  }
1 G/ G5 ~6 G* d+ @0 P0 e; Q  t

3 R( y. u9 r" G$ f* w, E" Q


9 Y6 a2 ^/ e2 f


- E+ M* N9 c" o1 P, U4 @  methods:{% W2 N6 Y. E% X2 I' L5 P% ^
    addFunc(){
" m- b) k! p% L* X* k6 Z      //this.$store.commit("add");1 u* a2 U2 E* K7 R
      this.$store.dispaTCh("addFunc");
% W3 d% ~& z% W# s0 m    },
. t0 E* k3 Y6 Y$ X    reduceFunc(){
* b5 o) E' F# h+ K7 M' q* n/ L2 ^      //this.$store.commit("reduce");
6 L9 y" m* L/ I) E% l5 y       this.$store.dispatch("reduceFunc");. }2 s& o% r; b' l
    }; j7 H3 \4 H! F0 r3 N6 ^2 ]
  }
0 j- \. d/ |" K! H

5 Z) @$ w, u1 W% J9 G6 |! J; Z- U这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的
% W9 J) k! T  F% L+ f2 N5 @实现效果一样!!!!
! d. r+ C8 E8 L2 d) H& @% h8 u8 K$ J8 i+ P4 C) x/ A
& ?- p5 ^# ~3 \
- _8 F' n0 W. h9 E5 S
' `: t* ^* A  c6 T+ h# @

9 f+ B1 q) ]# Y5 g& T


7 X5 r7 V4 u4 V  f( o* W2 e3 r* B* S" z% n  V, m

4 C5 l; u2 e+ n8 n
1 Z9 J2 u) a; k0 Q" M" q+ z
$ S! R) u2 a6 Y
+ z) u" x; ?1 k. H& e8 \+ P
' v. ~/ s4 [1 U0 I1 w6 n

6 {! [1 X5 E7 p; W" Z1 h0 T5 b" A# p: |" g$ j; J5 u6 G

2 ]: J5 I( c! Z' L. S' i" q! v( |8 Q% q1 X$ f
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复

使用道具 举报

4

主题

3

回帖

46

积分

管理员

积分
46
 楼主| 发表于 2019-6-12 15:28:01 | 显示全部楼层

mapState、mapGetters、mapActions

如果我们不喜欢这种在页面上使用“this.$stroe.state.count”和“this.$store.dispatch('funName')”这种很长的写法,那么我们可以使用mapState、mapGetters、mapActions就不会这么麻烦了;

我们修改Hello World.vue文件如下:


4 I! R8 T1 M# q, M7 z, q

, p" W) X9 U6 U9 ^" @+ F* F  H* q

$ m; @3 X7 [# s" E  X

正常显示,效果是一样的,我们就可以不再使用很长的写法来调用了。$ k. {) P8 o% ?& c* W6 ]: {

5 j' k' J# V# N' h0 simport {mapState,mapGetters,mapMutations} from 'vuex';% L+ r: [! r9 W+ @, ^
export default {
; u. q- X! j5 ~. D" {  q( C$ E8 F3 c  name: 'HelloWorld',$ k1 s' p- z5 K. L/ ~2 e
  data () {
+ W3 B& S) K1 D4 ?( O! L) v    return {" @: D' ?$ N& g: r$ g5 k) M
      msg: 'Welcome to Your Vue.js App') g' H1 \* x0 `
    }
/ A' e$ e5 Q  I2 ]. E- I  },# @1 x' X& }1 M# d8 R
  computed:{& u& b4 g( A9 `: q, u1 _
    ...mapState({
: x9 ~2 V, v: P- H& ^$ U0 F      mapCount:state=>state.count7 E, |5 _2 o. \; Q) u
    })
* R  G* n; E$ N8 J  },
% W) V; y9 }! n  methods:{: ]3 L. N/ z. H) j
    addFunc(){0 d; `' ?. s) Z8 Z6 A+ K8 s
      //this.$store.commit("add");
* L' v4 C7 U, r8 j      this.$store.dispatch("addFunc");3 |% |& Z$ X( s6 A( d5 i& t. x/ {
    },
- P( a) u, w8 B& x0 h2 p8 t* J' h    reduceFunc(){* O; n0 D2 c3 u9 f( h, b
      //this.$store.commit("reduce");" y" U# Y$ W' b6 d- A- J/ g! }
       this.$store.dispatch("reduceFunc");
% G! z+ T4 [. d( @, `% X  n    }4 |5 r$ u9 a5 ]- A" C* N
  }% e' o# N5 k1 D* c& c! m
}/ t$ U1 o; z7 N& e: }  l
+ G, J. i1 s1 z8 l6 X7 `

5 _0 q5 u3 z) x6 x4 p! J

8 c3 E# x$ a( ?: n8 V( e! d. R
) L0 }! o- d& m
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

在本版发帖
关注公众号
QQ客服返回顶部