PLM之家PLMHome-工业软件践行者

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

[复制链接]

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

2470

主题

1275

回帖

8万

积分

管理员

PLM之家站长

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

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

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

x
Vuex 的用法详解
2 b" ^+ d0 K0 s7 q
- ^. ^7 h: o6 S4 r0 h* \本案例测试下Vuex的使用,创建一个新的web项目
2 q1 B8 j9 c$ y' F* nVue init webpack web1 X/ k5 O; u% e
安装vuex+ K! @5 u# Y; t, p) [  c- T
npm install vuex --save
6 g/ |* u1 C3 Q( t& A启动, npm run dev,打开localhost:8080  即可: c2 `0 `  |6 O# L2 Y0 [; E' [( c
# T7 H2 q/ x+ C, N, Y

/ l- t4 q+ n9 _5 Z% C6 J  V0 f(1)引入vuex
/ J1 F/ o, c  x9 h创建一个src/store文件夹,创建index.js , 引入并导出store" ~: a: O3 s7 k% a0 w
import Vue from 'vue'8 }) ]) l9 ]1 e" d
import Vuex from 'vuex'
& g. V9 t4 x/ D+ J) mVue.use(Vuex);
* j9 d) F, T* A% |; i% a& o/ d  xconst store = new Vuex.Store({
' f0 O0 z0 x9 T' S9 }})
$ P5 _6 [, ~5 A/ Zexport default store;7 t& G7 m. q' ?! o

' P- D+ J+ L6 c6 x5 j9 V(2)引入store到main.js
9 r/ E, c; I8 p: b( `& Aimport Vue from 'vue'* |) S; Z6 `) f
import App from './App'4 E/ _( o# U" {2 {* r
import store from './store'
# e9 w3 G( s' W: h+ }. p1 o% A- B; G& \% K6 r) j/ A
Vue.config.productionTip = false: |5 G, C% C; |& d% d- T/ c' z
  v' @2 C0 G/ N7 n" G/ c  i: ^% z2 u
/* eslint-disable no-new */: J" Z' J1 p/ p* `2 W6 f) A
new Vue({, K2 U2 r' l0 h+ ]
  el: '#app',  k2 O; m2 A# D, j2 A2 g
  store,. |) y& n8 W7 K$ L0 }+ p
  components: { App },3 G8 M! |7 q; j, H8 ^% `; j& w
  template: '<App/>'7 U# I( i' Z+ m$ z$ Y2 g! p! z
})
6 a5 h; M! u" G$ ~' G1 n; ~4 h; `4 Q* Q) y
( k8 [9 j* ?- \5 D% h

* x7 E: O( L( I" |* O4 s+ h(3) 修改 helloword.vue ,先使用state获取值进行测试
2 f  D5 H' h  W# l6 gState: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;
2 J% n! b# ^; j  q9 p$ x. k8 Fconst store = new Vuex.Store({
, V5 W0 I- @4 W5 u* F% J  state: {
# N) |$ z# r" U. J: C9 c4 B      count:1& D1 w5 \5 r. ]! O5 x" W$ Q
  }
1 \' l9 F& u6 D9 }; ^( ~})+ s) I* }, m& f

" }$ J+ G  U0 R8 S" ahelloword.vue----  {$ t7 h1 O3 G0 b, b1 a" T
<template>9 F8 z. C9 b3 P
  <div class="hello">! B3 m; v& ~: S- X

% v1 h, _! \! f: d    <h2>{{this.$store.state.count}}</h2>+ B% D% e% w6 ^; d

# c; |5 h1 }3 P  G6 u7 p. ]3 L  </div>" L: K5 v/ i! U0 w
</template>* q( [. L: {' v6 G; W' ?) ~5 P
1 H8 E# H& y# P& ^
$ m" |3 s& y  g9 X
显示结果为: 1
1 W- K2 n& M2 D" P+ w$ l8 C4 \$ n+ d5 `8 M4 K5 p9 w+ A

8 r- ~4 O* q! z. T+ b: h* r# K(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:7 m( z5 Y) b2 Q" v9 {+ l& F

4 O9 `; E  G/ B& @const store = new Vuex.Store({) ?! j7 D  \) Y. b' Q
  state: {
4 R. N4 h8 f( r" O  K      count:14 y# F* m" R5 d- K/ b
  },
3 X0 R6 h6 g' M  `2 N  getters:{$ Z2 A7 @% t( t1 d: r
      getStateCount:state=>{
& W) c) b# g0 D3 ]          return state.count + 1;
) Q; j9 U: _0 N- c, t1 D) d/ c      }
, C5 I2 @' E, e4 m# _+ t' O  }4 h+ [6 _: y' C$ I9 w
})
7 I0 q" p+ X0 i( j$ o: K! w
( j7 ^  x4 P/ g<template>
1 s0 r& g/ L8 I  <div class="hello">
& V( Y; Z) s8 H1 W: Y
7 |3 ]2 g& m' f/ X" D' Y0 A    <h2>StateValue: {{this.$store.state.count}}</h2>
/ B7 R& `; [. H     <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
& @; n0 m8 {, |+ @- V  </div>/ ?# {) a: w+ W2 m& e
</template>
1 o0 J. I, [9 W
" E4 G9 l0 a8 [2 p  o

6 q0 H- z4 ?# R( B) T/ N显示结果:9 o! V8 J' c2 l1 d8 \9 V0 E+ p4 A4 W
StateValue: 1GettesVaule: 2
. S1 [3 p6 ?( k3 X3 G2 U* P8 R1 I/ D
(5), t  b" x$ j1 @( h& o

Mutations:

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

4 p/ r1 A, v5 L% p! p" p. w$ W
修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:" Z* i, N8 g* J- R
mutations:{. C# }. Y, N6 N& r9 u9 t7 @, E$ t
      add(state){
7 t9 C3 m2 R! j0 b& U: K: D& {         state.count = state.count + 1;
. {7 l; Q0 p2 y+ X      },
9 u$ n7 L1 P& ^      reduce(state){
9 p+ N- Q# o/ O        state.count = state.count - 1;) t  ]( ^+ @" `) v
    }
3 I0 s9 ]3 A* f/ b7 r& K) v  }
4 v4 w; _) g9 T3 `  G<template>6 u  ^: n  [: E* K  k8 h
  <div class="hello">- Y) _- U! k* g2 r6 E" _
    <h1>Actions:</h1>7 j3 P8 C7 m% k5 p  t9 v
    <el-button type="primary" @click="addFunc()">Add</el-button>
6 O8 T, V# \9 U: |7 |1 c' H: z) B    <el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>  f6 R3 E! g$ N# _9 q9 {
    <h2>StateValue: {{this.$store.state.count}}</h2>
4 [/ z9 O) S# z  U2 p/ `' H    <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>0 a% L% g* X) U1 a9 C& ]) U2 a
  </div>+ {8 D2 O1 A% y% o: L
</template>& r: L/ v( N* c( @7 O2 K; F; Y" Y

3 d7 Z* @4 t' ?% o! n; q5 g; B
% [% D2 F7 M8 @6 f
结果:
  j0 ^4 b7 K' M# N$ Y0 V' E1 c4 z. `; I! j) G# [: \2 C5 d+ d

5 Q: E# S3 P2 _; ^8 s$ b) j; I# JActions:Add
ReduceStateValue: 5GettesVaule: 6! |& l6 t" D; I/ g8 I8 r. J: u

5 E) {% l; w6 \. z/ O  ]! @3 e0 ?* }6 K3 a& i. r+ `

& f& D  j% R2 `& @( e( w) Q4 q
0 t% w( d% `7 o- c
8 x2 ^$ C  {0 m
' D6 T) ^# I6 V, d7 w; Q  ]1 I2 ^

9 ~+ `% ], A% X7 A- E
2 z2 G0 @1 W& Z9 I' o(6)Actions:9 k* P! d* `* U* L* B2 E) n& G+ a

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

! r$ J  S4 r; _9 Q0 n9 T. t, E


! J% ?, j/ e  W# g% \( d% qmutations:{! j7 m! }5 y/ H$ {" O( c% l
      add(state){
: x+ |2 c/ H/ Z- H         state.count = state.count + 1;
  ^7 j$ w* l8 o. l: f% R; X% g      },9 O' c2 d: u  O5 g* w$ j
      reduce(state){
" s/ ^0 g/ E( f" [& ?9 P        state.count = state.count - 1;
% a7 I5 p. Y$ S; Y    }
) f7 i, Z0 y7 Q- k2 C, F  },
7 m5 r  ^; Q) X. R6 F  actions:{
5 j) g9 Y& W( C8 W5 m3 i      addFunc(context){$ t$ w2 S; v+ A$ B- W4 o
          context.commit("add");
# U$ x1 u3 `$ s. Z* K      },/ J1 W* d" a; x; s* \7 e
      reduceFunc(context){
8 ?9 C/ p3 Q" @' ?          context.commit("reduce");5 o; ^+ p) V6 T$ O1 ^" u
      }
+ g4 \+ U, ], O) @  }
, P' _4 M5 J& o) L) q: P

2 t- R; O3 {: g  `

/ e1 {6 y* b: A! C3 D+ Q1 y. i  \


7 E8 P1 R7 N: v) G  methods:{7 F. O7 V) `+ M- `0 q$ t
    addFunc(){
; `5 c" M0 g1 P& q* ]! D4 b7 G      //this.$store.commit("add");1 T8 d! H9 q* b# ?- x3 f
      this.$store.dispaTCh("addFunc");* S! i# i- Y& d' K& W
    },. Q; {4 D1 V; Y( F
    reduceFunc(){
& C! o. _; V4 x! m& _6 K9 ]      //this.$store.commit("reduce");  W0 h- W1 ^" Y& m7 d
       this.$store.dispatch("reduceFunc");
0 L5 G3 A, [2 \: y/ i; L, o    }* p4 D. x" I+ Z
  }
, C' J3 Z* I( e) _7 E% z) f4 p
1 D9 Q+ N) N' [( }  s$ j0 H
这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的
7 @! [. n0 Z& [8 a+ f8 A2 h实现效果一样!!!!9 `. ]) {8 l& b7 h9 ?6 ]( L7 H
+ g% G' T7 ^& h5 a7 F& |% P# k

9 @$ U5 `& f. m' V0 _9 d. B2 I
  _% b  m* F; h  K
2 `$ |' X/ N0 E7 V+ L- M


# h4 F( V4 Z% G% x( g

" T# c6 _  i$ ^* V' ^/ \- P; t3 @1 i

5 o) S0 v) M) t' Y

# P/ P3 e& N* Q$ O$ @7 E- c' `* _8 R( t5 N- ~

2 Z7 [- C2 o% Z0 v
8 D& }& g6 G2 M; N4 z3 Y

1 r4 n. t: M+ C: {+ a
; M" P# v' K% |: c: a8 V
/ C! R+ S- U! h, H' t  a* U. c* d7 N9 u
, ^" _' z( q. f9 X3 H2 h
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 doTeam.tech
回复

使用道具 举报

全部回复1

2470

主题

1275

回帖

8万

积分

管理员

PLM之家站长

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

mapState、mapGetters、mapActions

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

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


( [4 l* x1 ?1 h: J' x

& C3 k2 k+ Z9 G- C3 S

" l9 |: `2 L3 S2 o( ~* y

正常显示,效果是一样的,我们就可以不再使用很长的写法来调用了。
* g) R! ], g" |) T
2 Q% K3 r+ J7 h; a
import {mapState,mapGetters,mapMutations} from 'vuex';+ t4 H; P, k/ C
export default {
; O8 g9 ^2 h2 K  name: 'HelloWorld',; `4 d6 B) h% t
  data () {
* x* e, J2 L- n    return {% @# [# z, ]- V1 @" g, T
      msg: 'Welcome to Your Vue.js App'6 W  r; L& @; k. p
    }
" e! B4 g( u& O- r  },
: `4 X$ U7 w; m  computed:{
& K% C5 X. G0 n" B    ...mapState({" H# u7 i+ u# N, S4 W
      mapCount:state=>state.count. I4 K6 ^& U) Y
    })
- g. Z8 G2 `& j1 T3 @; d+ u  },
2 [) A$ v" f1 f) ^  methods:{4 D1 s# j0 a0 p) d( x1 b
    addFunc(){
& D3 I: x6 _, A+ k- \      //this.$store.commit("add");" k. H" E0 K; z; ]
      this.$store.dispatch("addFunc");
/ i# Y! W8 `" g, C# {    },* ?0 r. U# h4 I0 v; ~
    reduceFunc(){' V' F" u) B# \, J5 G& {( d& T/ Z
      //this.$store.commit("reduce");
  p4 Z3 J/ P7 M0 r1 @       this.$store.dispatch("reduceFunc");
, y2 q6 ]4 U; c6 ]3 x; U) d    }2 v+ m8 ~9 H* R
  }
6 ^( }/ b, \/ y, |+ x. g}
6 `. V, \4 r# s1 _- O, a
3 f; z. ?. c: ?4 c7 |
/ b0 S, T0 z6 V* M% ~" F  v

6 H+ m  `% M+ e0 ]) i. l9 y0 |+ t1 S
/ [! x: Q, g8 s2 N6 V
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 doTeam.tech
回复 支持 反对

使用道具 举报

发表回复

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

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

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

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

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

    我知道了