查看: 2311|回复: 1

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

[复制链接]

4

主题

3

回帖

40

积分

管理员

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

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

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

×
Vuex 的用法详解
3 {: _# X8 r* R6 z% \
+ j+ L4 Z4 _2 }/ x) z; w) L本案例测试下Vuex的使用,创建一个新的web项目/ ?1 n9 ~- [6 T4 J$ \
Vue init webpack web
) U" |; _# a4 U" b安装vuex1 y. u  a9 L9 s4 l5 x
npm install vuex --save# R; f3 ^& o' l; M- u! _  }4 y
启动, npm run dev,打开localhost:8080  即可
: q; e+ U( ?! m8 G0 Q* _2 K: i; O' U
& f! j2 l; p/ S
(1)引入vuex
2 R7 v# j6 e0 z创建一个src/store文件夹,创建index.js , 引入并导出store6 E/ W- ^  L8 F
import Vue from 'vue'7 |; ?% P' Y' e
import Vuex from 'vuex'
8 X, `% D; m) A8 J  YVue.use(Vuex);
" b" f8 r7 K" \7 ~" V/ }5 ]) P: {const store = new Vuex.Store({
" l1 E& b( a# T- J3 c8 M3 J})- Z) a: D7 j* v# G# u/ H# s
export default store;5 z/ ]1 O9 F' m! G/ I8 J7 L

7 O* \9 r! v9 j' H1 ]/ x0 C' t(2)引入store到main.js; ^$ L6 L/ y  r9 e3 b
import Vue from 'vue'6 p: a# u! i( S
import App from './App', x9 F. W8 ~  h' G
import store from './store'; d5 l/ p, B5 k" d& n

) L9 J. ~) G1 g' A8 D% |% FVue.config.productionTip = false. u6 Q0 A1 N! G6 O/ j
9 a6 D6 U0 `8 x* B% f
/* eslint-disable no-new */2 @5 m& Z6 P7 I! K0 V2 Q
new Vue({
% X2 n0 t' g) g+ ^% @% a  el: '#app',, @' U" S+ V1 p
  store,
) ?7 `/ ^$ z6 R7 ~  components: { App },
( m( t* w6 V0 r' a  template: '<App/>'5 M0 t  M" @8 b) L
})
# @+ U; X) Y* a5 W* E" z1 ]: f6 _3 T5 \

- ~1 E  x" N  U0 o

, x5 l! A% c& l' j- I. W* g2 P(3) 修改 helloword.vue ,先使用state获取值进行测试
  m6 y' L$ m0 J  C: j- I( v' ZState: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;
' R% N/ c" A, B$ x3 y9 c7 G% w6 Cconst store = new Vuex.Store({7 ^6 t% w" _# V$ c+ p, n
  state: {8 [* R- h3 A* j* ]( T4 N
      count:1& Q# q% T, G/ \0 q2 e; o
  }
7 n! E% K8 u3 G. R8 H" ^& c})9 d5 Q. [0 Y" o# A: y) e

1 R2 p$ ~7 f- S% A2 h( o- }helloword.vue----
1 B/ \9 }9 ]' L1 e% a<template>. b3 _+ l* i! d$ o6 J
  <div class="hello">
1 R1 ?; H* X. B* l  v# t/ \9 j
( v4 a7 O7 @# _, i; f    <h2>{{this.$store.state.count}}</h2>: N; P/ M) f; a/ A$ v

2 g* f3 @" |$ r( ]( x4 t  </div>
) w& H8 Q9 K8 p, s* y2 N2 ?</template>. U5 T3 N! B- v$ ~$ |+ y  @. X3 j

$ J% d! \% K( t( i) {6 j: r

9 \3 G3 r- v* H显示结果为: 1 / k% D, z+ p. |5 D
  ^/ j5 W; ]; h' R

! ?1 H4 m& t% j(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:+ b+ M$ W. ?; S* d* a& L: L0 T% g- v( h
4 U$ O+ j" R0 Y7 h5 Q8 M
const store = new Vuex.Store({6 O/ ~0 ^" D' x* q. k% V
  state: {
: j0 y+ p$ Q; m7 M# A) ^9 M1 `* q      count:1) F/ V- b0 G7 V- v5 E& g
  }," W* F4 k2 U: t. h, y( W6 @% ?( G- Q4 w
  getters:{" S$ s+ S: f% o' p8 f: o% ?0 g5 {
      getStateCount:state=>{: ^, P5 A2 G1 w$ H1 _
          return state.count + 1;
) ~& n/ w$ [  M# c$ D/ Y  K      }5 Z' i$ i& g) t
  }! w! w4 r( ^6 J. L. p' p4 ~
})4 i# M$ {6 j" g8 b: x, r, a( y

- l$ @/ s* ~3 F- _' F+ a9 C<template>
# N0 r& n( O8 Y5 b. z9 f! P  <div class="hello">
+ n& a7 V( L* |6 {9 t
# w9 Z6 {* E" D6 A4 [" _0 Y    <h2>StateValue: {{this.$store.state.count}}</h2>
! u" y% F9 j. ?9 J9 D; V6 t, G) [6 @     <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
/ _  L' J; {5 y$ M  </div>
5 N; C' k4 N: z+ @</template>& |  s( s6 h, }" t5 V6 I) M/ Y

6 ^0 [# j1 g& V  T
" O) E2 [+ i- n
显示结果:" {$ z6 w6 k6 C% c, j3 X9 f
StateValue: 1GettesVaule: 2
1 ]' C2 s: Z, z! J+ Q, [
3 ^2 X5 g  X; |, G* u1 x& K1 l(5)8 D, ?7 X/ N, E) N

Mutations:

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

1 q6 x8 r$ ?5 H3 ~! K. i, A5 w
修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:
7 u5 f6 v' j8 I5 h, r- @mutations:{6 a7 I3 Y8 D) m& |1 U3 X4 f' @
      add(state){
# r; q8 P  K! B         state.count = state.count + 1;
& S% g+ g- x7 l( m% S7 X3 I      },6 e4 B* T) i. t; C" Q8 {! y
      reduce(state){
4 x. B$ u/ @. p5 _) A: I1 Z        state.count = state.count - 1;
& E6 B% I. }  U2 i6 O& z( A    }" Q8 F3 M$ {+ f! F" l
  }
& L$ n* c9 {3 L0 \: t: u( a<template>
% i; F& ^5 h0 [- a$ @; V  <div class="hello">$ j0 E! ^* l, ?2 `! Q5 w
    <h1>Actions:</h1>* [' V; ^/ {2 O9 Y9 ?. {
    <el-button type="primary" @click="addFunc()">Add</el-button>
, Y& I1 R) T: d, Y5 _' u5 l    <el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>0 h  g9 |" R0 E5 `( `- l
    <h2>StateValue: {{this.$store.state.count}}</h2>9 U( {1 ]  q# m4 i7 Q
    <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>9 |1 Y$ C' d& ?) {2 a
  </div>
( ?! S# t' z9 `; E# m</template>& u; u4 K4 t/ Z8 ]+ a  }3 H  ^6 Z9 `
& k5 y' b6 |: d# Y

, g$ q/ p# C: f  F结果:
) g) z7 J& M! D$ X/ B3 \3 J+ q7 R% q
8 F9 Q6 ~; a! d6 \
Actions:Add
ReduceStateValue: 5GettesVaule: 6& g; L" J* B2 v. C+ j# f
% m6 a# M  ]/ z/ D; m; S4 e: @

. k& H* {- G9 R( ^
! e& [$ j: [0 X6 ~" Y

6 y2 K3 A% p: E' f, r/ W

0 d% |4 H- f9 s9 \: u6 s  `5 C
' v- o' e. B, ?# Z0 P7 }
+ k" v1 o+ \9 r* w5 F& _
5 X/ Y# d, h- V# k% `
(6)Actions:
" u( D- @0 E/ I4 M

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

0 c) i+ K2 F0 A$ k( O


8 ]( n& F" R8 b$ D) j. zmutations:{
  r- D: @8 I8 J      add(state){; i9 R, F8 a6 r/ V( Z! g8 C0 t$ g
         state.count = state.count + 1;" E: @2 X1 [; P- K  G$ w% m
      },3 B9 ?8 S, @+ y: p& n  Z
      reduce(state){9 r6 M& W1 Z. _: }& ]0 X$ Q
        state.count = state.count - 1;; z! {$ x) R8 @5 U" G1 `
    }
$ `* C0 Y* K1 d3 D; r0 W  },
* N: K+ b6 g2 I2 B  actions:{3 @% P. q9 i6 k+ W+ o
      addFunc(context){! Z6 P+ H: b$ k% R1 _
          context.commit("add");
" ~3 I; B) v. Y) O8 K      },5 Y, j7 H; P% |; s; y: c! d2 G
      reduceFunc(context){
+ p" m: g' J& C9 X* I8 R0 {          context.commit("reduce");
9 z& S0 J* U* v      }
9 Y* T( S9 C. c% g  }5 ~) P3 Z+ f6 F. p

+ d, R; A$ o) P. R8 }0 c

( Y! h: |3 O2 j# b


) K/ c) \  ~& U! q# f3 ^; J  methods:{4 m: ?0 k8 E9 Y! J- B0 B
    addFunc(){
9 O! d2 @8 ]: _/ K  a, x" Z7 }      //this.$store.commit("add");
: e! V3 B; `9 }* g6 x      this.$store.dispaTCh("addFunc");
! c% N4 N! D& v    },
* z" R; Z% ?6 f    reduceFunc(){
( K( _1 ^" N- Y2 g; K* ]4 M! ?8 O      //this.$store.commit("reduce");* F2 o: m7 e3 N) K. h
       this.$store.dispatch("reduceFunc");
; k1 ]) i* ~( Q    }! A$ W1 {* ^- R) c& w8 ~
  }
' r9 X3 K' d0 q  ]) M

" ^/ ?& w; ]; Q; v$ J* N这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的
! K* O8 S7 c. @- k% Q  W; u* n* p实现效果一样!!!!+ X$ [6 i& v4 I/ w( i
9 S" ]0 \4 O; |: F

' q7 T  S2 ]( M$ o: k" w/ R& k: @5 {  R

5 q+ |. U+ P- D* y' y9 o$ u. p. k

. y* c2 C7 z) c

6 `: }* |: R7 C  r3 @7 g6 U8 j4 _

( V& K: i% K+ J" i! [% D+ A; e
  ~+ W( `0 U+ ]" x) @" |; ]9 D

8 d: C) m# _& [8 K$ z/ h
* n2 M% l1 u$ u
2 k+ V1 s1 N! S& Z5 K' u2 Z
+ R1 L; G% S1 m2 d8 b" F" I

, L- w' `. C+ R5 J+ W% V7 W$ J; H) v6 q

  v; I% E# ^" q7 Z( c4 O+ ?, i) \5 f# ?
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复

使用道具 举报

4

主题

3

回帖

40

积分

管理员

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

mapState、mapGetters、mapActions

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

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


' f9 U( X9 e% e- z5 g* _" b; @

; C& i2 Z2 m3 O! p

! h( J# y" D2 ]5 @( f! W

正常显示,效果是一样的,我们就可以不再使用很长的写法来调用了。9 q( Z' i- J; u9 F: `

! n" a) O3 g5 F0 G; ^import {mapState,mapGetters,mapMutations} from 'vuex';
0 I1 z+ k+ T* ]/ t! g) bexport default {  v1 h; @5 J- W4 d
  name: 'HelloWorld',  h5 D+ x* ?. G
  data () {" A. q& N$ c9 k: _% y
    return {0 k% ]( k! ^) [: P$ U
      msg: 'Welcome to Your Vue.js App'
9 P5 E9 b/ Y- a( @$ \    }
" j: Z$ [5 }# S- I! c! l1 J. `$ y  },
  X+ A! e7 i* t9 }( ^& \2 X  computed:{
. `8 ?7 t" Z' Y. ^6 l8 H$ F    ...mapState({
3 e/ Z. {) a, }& @. q3 |      mapCount:state=>state.count* |* z& z  C' ]& u5 O
    })  U9 H' Q. c) h9 t1 l# A
  },
" a% g" p. Z# t7 g; x  methods:{) P% g6 Q: p' {
    addFunc(){
+ a) Z& A" o" A1 p  f' M+ ~      //this.$store.commit("add");& G: K# D3 Y* P5 g& \8 e
      this.$store.dispatch("addFunc");
. P' @! ?- Y& g* H# T* E" i6 o. i    },
) X- j1 \+ @, n1 x6 _( \# h    reduceFunc(){4 S& ?+ x( f- Q  b4 d7 D9 D
      //this.$store.commit("reduce");
" `, b9 Z' C) O, ?2 |& {* a6 F) H       this.$store.dispatch("reduceFunc");
3 w" t1 z3 V% c& s  Z    }# w. u% H3 P! }  F& c
  }
4 ~1 [, @, {4 Q% s# q/ V- Z/ S( H$ J}4 e$ W7 T* v; ~/ P+ M0 I
4 t# f6 x( X  t( i0 L8 K7 m" G
- D- y# `) V+ g
$ D% C- }0 z. P2 b: E' V
9 X, R/ Q6 Z& g$ U8 R7 G7 V
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复 支持 反对

使用道具 举报

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

本版积分规则

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