查看: 2442|回复: 1

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

[复制链接]

6

主题

4

回帖

60

积分

管理员

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

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

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

×
Vuex 的用法详解
4 J! w% X6 a0 I6 o) }
1 j; p; A4 s/ P7 |本案例测试下Vuex的使用,创建一个新的web项目
, H; q: y5 X7 T: C( e; S" Y# ]Vue init webpack web5 c# @; @$ V9 q( b$ V( \9 `
安装vuex6 s: t' n) T0 J4 f2 r: z
npm install vuex --save, {% H6 l" r  l
启动, npm run dev,打开localhost:8080  即可1 `% p: h* O! T8 |# A6 Q2 d
; {9 P3 O, X1 F: B
* A: @% ]- E) K; K) @9 [2 o
(1)引入vuex# O' e( s3 E2 P' G6 q
创建一个src/store文件夹,创建index.js , 引入并导出store
) u6 c/ Q' h1 s$ b7 h5 L5 |4 p. qimport Vue from 'vue'" n: A; g" K: g- V7 E
import Vuex from 'vuex'- A( ]( M7 N$ Y1 r2 s
Vue.use(Vuex);$ q" s3 C4 |) y6 q. x( N% K
const store = new Vuex.Store({
, y, Y. f! y) h+ @6 m- f) i( h+ x8 i. \})$ U% \) e4 o% i4 f* p5 v& K6 w- J( K
export default store;( W; f' `- O. `2 ^' C

% ]! S& Y4 s3 |! v7 b; Y(2)引入store到main.js
7 q6 P9 U- L& eimport Vue from 'vue'
& B5 o, Y+ Q7 U& F) L+ w' s9 bimport App from './App'  u& R1 W) ^# L) ~
import store from './store'
+ d8 V+ K& d" m: J: e" d2 G* w' C# [6 H9 I* a
Vue.config.productionTip = false
3 X1 y9 y% M* c  ^5 H) i
; }! [; c# }$ p1 N/ }/* eslint-disable no-new */+ ~/ x6 ~5 t* P6 U
new Vue({
" K3 h( V- ^9 F0 X3 A  el: '#app',; d* Z6 \9 d5 C7 p6 T
  store,
1 H% L3 d/ F5 `  components: { App },0 Q8 B5 n; ^( M: D6 G& l% y
  template: '<App/>'
. n4 D1 ^" ?. N: B9 W0 p})
9 W, }3 @; {  L8 J, }
& o: ^" d5 t7 @1 T  @

% v7 k! @3 K" o' n2 _* [" k  m
  V* S8 R7 H4 q! @
(3) 修改 helloword.vue ,先使用state获取值进行测试
9 c0 T; a/ T& z  @& rState: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;0 [, I' ~5 M* v) {( w2 t' ]: i
const store = new Vuex.Store({, n6 @* h0 y9 M6 c% z+ d
  state: {7 n8 e; k* e/ J  v* E4 p6 A6 u8 M
      count:1
1 Y& J/ e* o4 c! Z  }$ E, D; h* A* U4 S
}); c& c& }9 P, }. T9 O

0 q" q! A- E8 n; T9 S  B3 n7 ?helloword.vue----
4 A0 p3 @( x0 c7 V3 g<template>& k% i$ C, Z- v/ g( g5 a
  <div class="hello">
% {) j' o: f- t, \# v: u& k! |8 y" P3 b9 v( S: Q
    <h2>{{this.$store.state.count}}</h2>' \! {0 J8 M' V2 ]
. T) Q- H6 h: c% E: }# y. u
  </div>
" g# D6 D6 o$ w0 S, i% Z; `: s</template>
# _8 T5 A& i" P; u; e9 l7 w
' I/ r0 L2 F, \9 ~  k6 _
# N' N# f) |' {
显示结果为: 1
7 F! [; a" ]7 R- h% ?
+ g5 ~' o, ~+ l* ^( V8 s2 k, T
7 r: }' l5 {8 M$ a; w
(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:
& `  z- \8 s2 f  T1 a- o  O) e: J9 E) c
const store = new Vuex.Store({, y% y- F" z" B# p+ O
  state: {) e. B$ t' X- a* d+ m2 S
      count:1
. R+ D& J- R7 s. z8 r/ V& |1 m  },
0 z& k' r9 S) s  getters:{* K; E$ l3 l+ ~; x3 V( \; O( ?: N
      getStateCount:state=>{
& f1 D6 I, H# p          return state.count + 1;
$ I$ a, Q" q% h2 B. g/ e$ e; ^      }
: S3 W9 j; `+ t  }
4 q% `1 f1 J* T2 M: h4 `! e# r})
- e# _5 f0 z% O9 b* Q" O- a
5 S: i: m# D9 A. D! g- L" e<template>2 O! O: G4 v$ h" p& t) Y$ g
  <div class="hello">
4 w  n0 Q5 y+ W; S
$ s2 I' |7 a+ R9 }1 {% i& N    <h2>StateValue: {{this.$store.state.count}}</h2>
$ C$ D, L. t2 |- P! n$ U( U; x3 i     <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
; U# h4 ^6 S' ^! k9 s; S1 h5 f  </div>
# Y& r6 b6 Y8 ?+ U</template>4 Q" z1 Y# U' `$ t/ y
) N( v  m2 K% N% \( t% A

% V8 w5 x: n* X* q; ]显示结果:+ H+ u) h! @5 I9 M  C, y
StateValue: 1GettesVaule: 2  ]* ~6 t, R" u
& y% P) [2 n& ?3 ~4 U  t+ [2 u
(5)0 i1 u5 p4 n% I$ M! T) \

Mutations:

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

0 F1 Z- {( y* K7 {7 K
修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:
. o5 X1 e( j/ I8 m& U+ P' K# amutations:{
* F- k) r5 w: m& o$ r      add(state){
8 H* \! m  C2 Z( }2 O0 t         state.count = state.count + 1;
/ l. i6 E* L' P$ E! c- [      },
% |/ D$ ~. f& P  o( A# F/ b      reduce(state){2 o# k; U" l8 m  o
        state.count = state.count - 1;
: q, ~& P: q  o0 _2 p    }( m: U: ^/ M0 [2 g0 B2 K: e4 t
  }
) E' g, C2 X7 U& b4 a<template>
+ Y9 }2 |7 F& D; }  <div class="hello">
6 Q. {& E$ H! j- G9 [, L    <h1>Actions:</h1>
% K# R# n4 p* q  c# u    <el-button type="primary" @click="addFunc()">Add</el-button>" u1 A2 |& S% H
    <el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>
( f9 R% x( K0 u$ i# X7 V8 i1 A    <h2>StateValue: {{this.$store.state.count}}</h2>4 k0 ?3 k: V. z( b3 F! x
    <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
: Q9 b; f6 H  q$ l* m" t  </div>7 v  n( l1 g- d
</template>
( g/ o# y, Z" w7 T- u# N
1 f: A& n7 G) W: m
! X/ R9 B+ S, D. z/ T# W
结果:
, ^& I! W; y0 A4 n
2 B4 ^; c# w, r/ N
) o: Y- ?4 @# u6 P
Actions:Add
ReduceStateValue: 5GettesVaule: 6. Y  X+ s7 t4 M: \# [

, j4 j5 f, d* l% }! f- A9 C
. x' i9 Y. z; L1 ~% u, W

9 N3 E) \- L. G6 S8 b
+ h7 Z" D2 b. B6 ]/ H

% {, s; I0 ?9 b
' b3 Y9 X0 K# N* y

8 Q* A- L$ W# s) N# @
! w1 }* j0 i- Y1 F0 A6 ~(6)Actions:
/ U9 L; X0 O) E( J

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


+ }- G1 V. L" w7 {+ D' r; f" P

' ?  M* p( m$ ^& H3 X5 V; x) A
mutations:{/ i4 k* T4 z7 |( Z9 l5 x- N: V: [
      add(state){
( A' I; U* Q1 e0 r  a% D         state.count = state.count + 1;
/ t9 y6 D. P- e      },
' m" }9 b+ B5 Y. L      reduce(state){. U7 W9 }* N' a. T# r0 }
        state.count = state.count - 1;
0 W8 k3 ?1 T1 @3 J, V    }
/ {* o& J) \6 N4 A) P7 J, Z+ _  },
5 r* H. p' P) ^( W) _7 X5 Y  actions:{; u4 l1 n* \4 ?
      addFunc(context){% S* O; |0 @0 Z5 F# F" S
          context.commit("add");
7 h5 z& a" V) D      },4 {- r9 p* K; G4 N, ?; Y9 X
      reduceFunc(context){
. R' B4 N% D% ]" `5 n          context.commit("reduce");
2 h" k, t4 l& O4 ~. h      }
( }: T+ s0 v, A1 c7 X; [1 N  }
4 C% |) W: a2 y3 U
9 u  x. z! L% g7 |+ o, T: V


, s& Q+ b  k( k: X/ V1 s( J& s9 z

, A6 G, T$ ?( |5 J& r& t6 @
  methods:{
* }4 ~3 T4 \. ?* M/ V( G0 k# h    addFunc(){
' {0 k" u; k/ C% c- h5 ~" h: A8 r, Y      //this.$store.commit("add");
. r6 S2 j8 p  `  ?) B      this.$store.dispaTCh("addFunc");
7 n6 r% Y- j& n6 S3 B+ m: g    },
) [! Q: _1 _+ s) @    reduceFunc(){6 h: @5 a0 J  N) M. Q
      //this.$store.commit("reduce");. }3 G) m0 \3 Q: M; c3 \  Z2 m
       this.$store.dispatch("reduceFunc");
8 G- q# g3 W/ v; [& S, s% V    }
; X; Y( y* W- O! h( Y2 Y& h# f  }

+ u) i+ C: Y# x3 t) _
8 q5 j/ w4 D% p: o2 f, D9 u
这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的
, w4 J% x+ R6 a8 L实现效果一样!!!!
9 H3 F7 P8 M% ]+ \0 [$ z* }& G- ^8 o. k: l+ |; o. Z
9 r; Y) v' q5 n
3 v7 x8 H! H+ _

1 t0 g/ P# I4 W

/ t8 E. K( W) K# t; m

; a  O+ B6 e+ o2 m% A- K6 O
8 I* Z9 x7 k* ]0 K7 X+ z4 r+ I% L
! c- m; q8 o- w

0 y/ Q0 d% K3 N: f* d4 X! u
8 E. {+ M1 U8 W2 x
. g+ ~6 Z3 C6 q( ^2 Q: J1 @8 U9 @
- f4 h* c& h( P' S5 k. d# J; S

* @4 m) y' o( n- \+ D2 `) W
' F8 i& ~% q  b  c. {$ M
, {  a5 Q* J% J* |+ g" L
6 V+ l4 @9 @! [9 }6 j0 \
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复

使用道具 举报

6

主题

4

回帖

60

积分

管理员

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

mapState、mapGetters、mapActions

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

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


4 ^4 ^( e& w4 A* g1 i

7 e+ l* ~2 X. V, K9 l* g7 U) F


5 x( ?* @# V& p( }

正常显示,效果是一样的,我们就可以不再使用很长的写法来调用了。" v. q/ F- J4 e) O6 I

: \# p" h0 Y2 c9 E' V; c1 Timport {mapState,mapGetters,mapMutations} from 'vuex';$ B" c3 _2 X) |* R
export default {
: F4 `! X& }: t" B3 ]6 G) Y( \  name: 'HelloWorld',) \% s" Q( n  n; Y2 ]
  data () {& A0 H  F- s7 Y6 z# n
    return {3 p* |/ l) T4 N, h  f/ F, {
      msg: 'Welcome to Your Vue.js App'/ n1 e0 M" F7 m( J5 }. b( {4 w- {
    }
* ~7 ~- T$ l. p8 ~0 T  },' N& G. s) e& {% l! Z0 W" N/ F5 ?: h
  computed:{# }! y$ t1 J4 F6 L$ v" X! l2 B
    ...mapState({
+ \% ^8 `. o' b4 _( h      mapCount:state=>state.count
! b, X% p- T& g0 v! [" s    })5 p# _' B0 f8 y+ |3 b& k! a$ U
  },3 l3 L# m# ]* r  F& f) z/ H
  methods:{
: W8 _! n- Q( {+ G7 F: {' d& r    addFunc(){
# m6 y! o' m3 r8 J# D* T      //this.$store.commit("add");
3 g: N8 {& C3 Q9 V      this.$store.dispatch("addFunc");
0 f# ~7 t8 j/ Y) Z; Y    },9 i% K, ^# \* M7 R9 G7 V! S
    reduceFunc(){4 E% s/ n& F$ Y5 [' D
      //this.$store.commit("reduce");" U' [! l1 s& y9 t: B1 W
       this.$store.dispatch("reduceFunc");/ R% |' @$ u6 m: P- }
    }% G- [' {. s8 i& D
  }
' R8 ^+ s7 `+ b! R6 ^}7 I% U# c+ S5 N5 ~2 C, E" e! b
# J/ s, a2 T: `5 @, B" t4 I

! ]' L! y2 U+ |9 z' @/ t
; P6 d" f- y7 Y" H7 \4 s

  ]0 J$ b& d; w6 o+ _3 t- `
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复 支持 反对

使用道具 举报

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

本版积分规则

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