PLM之家PLMHome-国产软件践行者

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

[复制链接]

2019-6-12 15:28:01 1981 1

admin 发表于 2019-6-12 15:24:50 |阅读模式

admin 楼主

2019-6-12 15:24:50

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

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

x
Vuex 的用法详解$ k9 m  k+ z# |5 {' r7 w
8 F2 z3 [; s8 M" K- Y
本案例测试下Vuex的使用,创建一个新的web项目8 x  |- b7 C0 S; W9 k& Z& G
Vue init webpack web9 }" ]% O0 p( W6 H4 n- T* E
安装vuex
$ R9 @# Y1 p: [: c2 I- U/ B. Bnpm install vuex --save
' {& K7 A' m/ u启动, npm run dev,打开localhost:8080  即可
$ Q* I& ^: Z* F/ F0 ~( J! H6 o+ Y
* }$ I2 q* {/ h" ^! a1 L3 }' X. B3 N
(1)引入vuex
) {, J# w7 z. o3 L' i5 S6 m创建一个src/store文件夹,创建index.js , 引入并导出store
  X0 m8 ?& {( K3 S0 Cimport Vue from 'vue'" r- p" {# E9 L% H; D5 e0 A+ J4 ]
import Vuex from 'vuex'
( I8 k! J/ i- C( z; q2 L, bVue.use(Vuex);, q7 l4 H" J& V. G" y3 q) L
const store = new Vuex.Store({1 R$ g8 h$ a4 y# H  `! |
})1 X6 y0 n' f6 S  J- L3 }
export default store;
  q! _+ S4 N; ~8 [+ c& x! ?- \
8 s( [( O& V7 ](2)引入store到main.js
) h0 ?0 `5 Y0 @; S9 P# @) Iimport Vue from 'vue'
* y5 i$ F; `5 d) l5 Y" o; Z9 j# T1 bimport App from './App'  ?2 ?1 g6 [( _
import store from './store'
3 e8 m/ b/ G' J1 {1 S& q4 @3 o* w2 a0 c. Q
Vue.config.productionTip = false* s8 `6 B0 x3 g" e% t" A, R

% ]$ U' n# L# W( p7 c3 k% G/* eslint-disable no-new */
* f4 R6 Y4 S7 Z% Pnew Vue({0 [- p, u9 B5 ?1 J9 `* k, f
  el: '#app',9 T, x: `1 N% j  H7 @9 w5 z
  store,& H$ G7 @$ B& ~# N0 {  L
  components: { App },1 \9 d; X  z* C- e: f( l) ^' D: J
  template: '<App/>'
& |# J) W+ u0 E4 m})' H! O6 M  o1 T2 V, M

3 P& t* e1 c& e% [* ?

& x. d9 s: l% m* a+ e" T: h

( M: u9 z6 p0 E(3) 修改 helloword.vue ,先使用state获取值进行测试
3 X. X9 q# a# G! V1 S3 X  eState: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;
, k4 O! s8 r$ L. c2 ?8 r0 }% A. n. Gconst store = new Vuex.Store({. q0 v& a/ r: G0 ?
  state: {
. M9 W; o3 d- F! a6 `1 ?      count:1
& o8 f5 O6 v4 \# S, C7 x" m  }4 y5 ~# u4 ^8 m
})
0 }0 ^! {! K+ W; w0 E' D! ^  r/ D9 a, F  k4 Y( x& Z
helloword.vue----
; r9 z- V& \0 M% J$ W8 e* M<template>% D9 ]# ?1 q7 o" A4 F6 e& K5 v
  <div class="hello">
( I; [$ [' X) l3 j2 z" Z1 }4 ~/ O
) o3 v! c3 H) {+ a9 v    <h2>{{this.$store.state.count}}</h2>
/ K+ o+ ?7 O+ g; H- v1 _
- {2 E) O: a# A# i6 P: k2 I  </div>) y  s+ I8 \- `7 z; l2 \! q) U* I7 q
</template>
, {  }4 D4 b- B2 z" J2 c9 R( M9 l% R
# Y  W( S2 V6 Z2 M
显示结果为: 1 & W# P6 L2 a- A& x) b2 F

; D; u" h+ {% P+ ^2 ^
- x! F. J6 y5 J, w+ h* s6 d1 r
(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:
# q8 r: C, w( R+ z
1 x5 z0 a8 g% D+ A1 J2 I2 h5 g5 Iconst store = new Vuex.Store({
# X7 I) k4 r( |( b  state: {
. F% V& P7 ?% O1 f; `0 z; Z. [      count:1# Q% D! [5 q; d6 J
  },
2 V* {1 A8 q9 A  Y7 a7 U# A" ]  getters:{/ l, }4 I  n) g; n. y8 ]  g
      getStateCount:state=>{
5 K) T' N* K+ X/ g$ l          return state.count + 1;
# P2 }1 {0 \2 S! j& i9 X      }
/ P, R% a6 y; @! b/ }* m/ Q  }* e- |/ u: K: |- Z1 R
}), r& C- r1 |9 h, C5 p. e& p* L

! w0 ^% t( }! k<template>0 Y4 ^  m: e5 L9 @1 I6 P0 t$ r
  <div class="hello">
3 P) g$ X" ~! S, v5 w4 X( h. q
' i& u- o- G' j  }    <h2>StateValue: {{this.$store.state.count}}</h2>
) Y$ X2 @* s. F! F$ j     <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
2 j) B% F7 x; s5 M  </div>8 k3 y- H. ?& y5 s
</template>
' z3 p0 Z, ~* V# K  z+ t4 T
& ?0 Y  Q6 o( v/ Z! G
4 U+ B" j- a' D' _: N
显示结果:6 f6 Y/ B" i3 I0 B6 \1 r/ V0 N
StateValue: 1GettesVaule: 2* N% ^+ a1 w7 T" `9 f) X( T
7 j  p: s; y. X. n( b) c2 Z! Y
(5)# G9 }: V2 V: E+ d* J

Mutations:

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

( Y1 U4 T# X" f8 a' N
修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:* I% m0 s+ J$ s
mutations:{* o9 i3 `; K, I' v- B1 D+ j
      add(state){
9 Y7 k/ B5 I8 s3 e+ d* D/ i         state.count = state.count + 1;
/ ^: F, j3 I8 n      },
: D, w2 z/ x' p% d* }2 P      reduce(state){
% J* o$ e, n2 V7 u        state.count = state.count - 1;2 z! }2 d& T; K+ i8 w3 o% `
    }) B3 p5 z: g  c' f$ W+ r3 T0 y
  }
& v) N' B( L5 _2 E<template>
. J6 B% m3 w  G4 N5 x5 G1 w  <div class="hello">
/ M  |3 S1 ^; L1 U2 y4 V    <h1>Actions:</h1>
; b) F8 ?8 ]' O8 D    <el-button type="primary" @click="addFunc()">Add</el-button>
# t  {7 v* k- ^; }# H$ T3 J$ q    <el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>* d& }; R  c  h. c# x+ C
    <h2>StateValue: {{this.$store.state.count}}</h2>
( L5 d0 X/ G5 I2 O    <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>( C% E8 h, X6 {, X3 X" l: V1 x5 L
  </div>9 t; T2 E3 ?; b* t
</template>6 k6 a- t0 s6 H8 h
4 Z: J! v/ g; X3 z" X! h
: c1 ^' g  @9 ]) l- Y
结果:- C+ y$ V+ ]0 G4 w- a! C- K; Q! q
9 H. s# Y. H4 I: r: H

. {8 ], S; t5 _0 yActions:Add
ReduceStateValue: 5GettesVaule: 6
7 O; o8 r0 \8 F  H$ ]- K; G2 r/ u, M1 t" C1 g- x3 _! r/ M

( n. n& A2 n. L5 _4 ~8 S

$ `8 f$ J7 w" E3 w
) q/ l1 t8 ?1 }: _, |2 P8 i
) Y/ g3 B& x! j! Q4 w# W
9 S' n6 ~" C  o  y+ B* x2 Z
! w, a1 d9 O3 s3 f5 |9 M7 m5 Q3 N
$ G# _) j+ R/ _* Z
(6)Actions:+ V. X0 `" d, y0 L  w

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


3 v6 T! z; F% [9 a) Z: _


! i, R+ U) J8 F# |% g* W" Cmutations:{
6 Z8 V# M$ Z/ x3 I1 U8 n" E      add(state){9 }# A1 s* g' F
         state.count = state.count + 1;
, h% b& s) n6 K; S% U' `+ U$ T      },
* M9 _( S* j$ J1 X$ l5 m( \0 T8 M      reduce(state){
8 ?  J1 n6 m. w+ e; D        state.count = state.count - 1;
2 m( B6 C# V# |1 [5 K; V    }
  C' ^5 p, |0 z  },
9 r$ m* F( r! S7 ~# b  actions:{+ r6 o* |. \, k& k4 c
      addFunc(context){
! W& ]. ~$ S# y  ~  R3 P& H          context.commit("add");
( U. Y+ z# o+ O) [6 Q      },
' J4 w3 @* q5 p; B$ j! n2 V      reduceFunc(context){
! U, d# h$ b8 ?: P3 {8 f3 K          context.commit("reduce");
! Z6 L1 T5 y3 V$ F: u8 i0 ~      }3 [% K( c  r* g+ S7 |
  }
  N- L3 b4 v, d0 i

7 q$ Z, m+ M5 A. n" O

; u+ m, q- K' U6 [


) Y* u* X  T$ j2 e( N2 ^6 o  methods:{' h$ Y9 Y) E6 k$ F4 u" i
    addFunc(){& U4 \3 z& E. H$ S
      //this.$store.commit("add");
5 i0 T# p; a( v& E      this.$store.dispaTCh("addFunc");6 W2 o3 U: W/ i- G
    },, }* h, M, J- \/ t. `/ K7 w2 H
    reduceFunc(){
: s3 r0 r8 @* [! l      //this.$store.commit("reduce");5 R) g5 r: l% D# F3 g" j% i' n
       this.$store.dispatch("reduceFunc");2 L6 o) i7 X1 L- U7 r
    }
# ~% J' ?' p4 g7 ?2 ^  }

4 y- ~0 J3 ], l3 k

3 a/ ^3 N$ u* U3 v1 w这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的
  L2 U/ S6 I4 i7 K5 r实现效果一样!!!!
' I  |* R- A4 z# ]7 n
( A3 ]! o: i; I. v0 v! V& q4 o4 X: X7 z, U* E, K( t+ [

0 C2 B( S+ N0 m* R5 Q

. Z8 `! e, X& b$ [' ^# F0 o& y8 t

3 ~: L! e' A0 X3 e  ^1 N$ p) c


' E7 y! y* p# ^( v2 a, `5 T! M9 K7 O$ A$ F& y9 o) Z7 d

! Z  n4 n$ z1 o: I# D- Y" I7 C! j  p
3 W% A$ p) X7 i- B3 ]

! o/ o. j2 a! |! D% W  t3 W; l4 p
4 e6 e) W6 g$ P: e* U) r6 ]! y) w5 {8 A+ `" @! X0 g- [5 C4 M
) `1 O* ?/ y5 z/ m9 i
3 k3 I) a# Q7 U5 |# e& W* X
" M% S* Y( o2 r, E. s  h* e" q4 F
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ doTeam.tech
回复

使用道具 举报

全部回复1

admin 发表于 2019-6-12 15:28:01

admin 沙发

2019-6-12 15:28:01

mapState、mapGetters、mapActions

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

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

) H& d( ~( ~7 P  P

3 v7 T( ?2 ?% B# r! |: R7 Z; R: r


$ G2 {6 i! M. t! d9 O

正常显示,效果是一样的,我们就可以不再使用很长的写法来调用了。
/ Z- }2 \! r9 T' }
4 A- s7 o  t* Q" O1 N0 z3 ?
import {mapState,mapGetters,mapMutations} from 'vuex';/ l' j- F* j: I% N  X/ x  o
export default {4 s) K& Q2 H! \/ z6 O* B, [
  name: 'HelloWorld',0 A5 H5 C) k/ _5 c  }
  data () {# r" Z! E- D/ h! O7 _9 S" P9 z. l# R
    return {: Q5 ~" t$ R; O! N) H% {- B
      msg: 'Welcome to Your Vue.js App'! p+ B: |( \$ I  A: M' X
    }0 C! k+ O# i( x( i0 [% D
  },- e# S* l" ^* o4 n/ _  D( k7 a% v  Q
  computed:{
2 ?0 s3 Q) ^3 X0 Y    ...mapState({2 w0 `9 @5 I- f
      mapCount:state=>state.count( Z. L$ X: X" G" g* `
    })
6 U& u7 i6 h! x- B" ]! w( x6 h0 B  },
# ]  h* V) l8 @0 x# ]4 q/ d2 E  methods:{/ l3 |: q2 U2 z6 y) F
    addFunc(){
: E& E. G# w$ [8 i& \/ o. y0 n      //this.$store.commit("add");0 _% Q( R( T0 {
      this.$store.dispatch("addFunc");
0 c2 L% N& I% p9 L" a% \    },
2 g; U& C6 t) \" |7 f    reduceFunc(){, i( }; j: ^* l& S' j* N
      //this.$store.commit("reduce");
, y3 U' T8 r: K. p- U       this.$store.dispatch("reduceFunc");! G1 m7 P! C4 }6 H9 c
    }: r; k5 y: B) B& X$ C' R
  }( P. A/ D. e2 m( H1 T" w( v
}
0 S* q0 X* {5 D" p8 ]' A/ O+ ]) `  r, ]4 L* z; Q4 b
# O* A8 W! `* N" s
/ s6 c4 s+ l: q6 f* ]

8 }# t5 m3 X& ~2 O+ k) s
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ doTeam.tech
回复 支持 反对

使用道具 举报

发表回复

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

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

    本网站(plmhome.com)为PLM之家工业软件学习官网站

    展示的视频材料全部免费,需要高清和特殊技术支持请联系 QQ: 939801026

    PLM之家NX CAM二次开发专题模块培训报名开始啦

    我知道了