PLM之家PLMHome-工业软件与AI结合践行者

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

[复制链接]

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

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

admin 楼主

2019-6-12 15:24:50

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

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

x
Vuex 的用法详解
  i4 P1 h) F  }& n
7 g* C8 ^4 u& D' |+ b4 y: F. j本案例测试下Vuex的使用,创建一个新的web项目
  o% I% s8 t4 [5 @3 z% v7 n( oVue init webpack web
* z8 D" S# ?& q0 J1 j% R安装vuex9 t; k+ \; P+ S7 }
npm install vuex --save
. @- Q$ @5 \  y启动, npm run dev,打开localhost:8080  即可: V' M5 s6 z: D3 m( z2 u

7 B& v' H+ `! }& T% W$ h6 E+ G
(1)引入vuex. g' I2 L9 |! b0 o. W
创建一个src/store文件夹,创建index.js , 引入并导出store4 Y% I' l5 P8 F% g) B2 ~' o
import Vue from 'vue'
/ x7 R/ a. R* W; ~; F1 Timport Vuex from 'vuex'
$ t# B5 O9 ^, ?/ b. C, aVue.use(Vuex);
5 z- N/ r% L( E& t% Y$ F, q# uconst store = new Vuex.Store({
1 K. G2 s8 X, J! t& P})
0 I; H: `1 `' ?9 H; T0 Z* K" uexport default store;
0 s+ [% Y) J8 E. ]3 {
% i# Z6 n/ ]/ F) z' @(2)引入store到main.js6 F: O+ M& V1 b1 x$ k1 ]. s
import Vue from 'vue'
$ t* R. Q  E6 ^$ n  i4 q( vimport App from './App'
% d- w1 S' \, |/ Q7 iimport store from './store'
6 F; o$ d( w9 S5 [/ k+ t4 _; C9 ~9 _; x0 c) R0 ~
Vue.config.productionTip = false" g$ a3 d6 H& [3 J# `
- T% n$ @& J' g) I+ F
/* eslint-disable no-new */
8 S* ]- E) _9 k, y; O1 B- v0 u& p. jnew Vue({
% X0 h1 ^) f1 F; ?  el: '#app',8 E" Y. V, k( E1 r  j' `3 t
  store,: @6 v: N% c$ r% Q) ?- |5 H  [
  components: { App },
' A- V* o1 Y* V8 h9 \* B0 A3 d, M$ n  template: '<App/>'
* F+ A& O1 Y: e})
' N" c  o5 _4 p* M$ }; o- c+ b+ [: G# Z

) w$ D: \% i. f0 P. F$ c& S
1 _0 p+ {; s8 s, G% Y8 }
(3) 修改 helloword.vue ,先使用state获取值进行测试% {: v+ W, _7 G5 k
State: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;% J  m$ d8 S) F% W8 p2 M
const store = new Vuex.Store({
: W7 _- j5 O# l- c) ?: W  state: {
7 [) B$ v2 K) }& v1 A; x; M( M      count:1# }: r, J1 I2 d7 q, S( H
  }
; @+ e& ]1 o" G: c})
! t: x& ~- V4 d+ r' f& }: `. Z2 L3 ?, t
0 w/ L% _4 J! _helloword.vue----: x; e, l- g$ L  P
<template>
2 ?, F# m( U5 n( N4 w  <div class="hello">% ?- p- v$ m) V; E  F* b

) E; M' \2 C# q4 m4 J- J4 y; e0 F3 e    <h2>{{this.$store.state.count}}</h2>
% O$ D' C; b5 M* w7 N! A& Y4 n7 z- P
  </div>! w: {' `) g( B) C
</template>% H8 G3 }2 ]" k6 R! S* H

: J7 ~! [; V4 D' t/ B1 P
; u3 O, w: _5 O' x- h
显示结果为: 1 ! m, c4 m5 k5 I

) Z7 j& t, O1 P7 T6 K

3 r5 m4 B& ]" `3 n(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:+ F6 o% |% x! |

6 h3 d) n2 k. S/ l7 z9 _0 Dconst store = new Vuex.Store({, L4 ]7 d$ a6 p7 T% d
  state: {
% X" M( k! ?1 w) w, L) k& M1 c      count:1
/ K" G7 u, W' T  },
( u* y  `0 e5 Q) e' @6 Y  getters:{
! h( Y0 B+ @: w2 v8 R# z      getStateCount:state=>{) i1 s, n6 w+ Y! g9 B
          return state.count + 1;- w: v: X; P, P  p
      }
  ^- S& b- X& y0 I2 P/ O  }
& [: m/ Y* J% M2 X4 Q})$ m0 e' G4 \* @9 Y9 n" [3 L
( {0 o' x; g3 h
<template>
/ U9 c+ Z( _' C/ a/ K  <div class="hello">
. z% m& L/ l3 }% U4 `
4 I* X+ \4 v; M1 e8 n; I8 k    <h2>StateValue: {{this.$store.state.count}}</h2>% S0 T+ y1 G% u5 n
     <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
# Y: \# R/ w5 R  </div>3 i' v9 |3 l8 _3 \4 ]6 K
</template>
* [* s. L4 v: i# _2 s4 c- N0 z3 H' @: J& S7 H! Y8 T

6 u. x3 T( Q9 y5 N: f$ I显示结果:
7 S6 e2 w1 f' D, E2 ?2 vStateValue: 1GettesVaule: 2
/ F% Z4 `  R/ f; u4 c1 c0 [4 ]# e' y8 _5 l9 c+ r+ K
(5)
. C' p9 i) i1 m0 ]/ B3 @$ u

Mutations:

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

( j) o( s& o& X+ _+ z% B9 h
修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:
+ n4 a# r0 ]1 d# `; `) Tmutations:{
& S$ y/ n8 u# q1 u/ h" ?6 K      add(state){
/ S! g" y* ]: P9 o3 G, b) J         state.count = state.count + 1;* W* m; o& A! L7 ~
      },
! ^" p' z7 B& s- Q$ z* P# j      reduce(state){& }* b% t  y6 S, k% d$ U8 R
        state.count = state.count - 1;
4 e' ]0 D1 S! w, \( t+ U    }' Y& E2 c1 r! e( ?! F* A% ]0 j
  }* |! [9 M1 F# @. E
<template>
& g0 s- t+ J8 v  <div class="hello">3 D- K: v8 W+ ?. J6 P  \% Q
    <h1>Actions:</h1>
; p6 k9 j! C8 n6 W- ^! U; T6 z! @' I    <el-button type="primary" @click="addFunc()">Add</el-button>
4 O8 s+ h# C0 D9 W: _$ z% a. l" v    <el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>1 a9 B7 `- f( Q- ~, [9 X
    <h2>StateValue: {{this.$store.state.count}}</h2>
) Y( ^2 @% W% T9 c  }    <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>  B0 `' M* w. y4 V8 U0 G5 w
  </div>
. h7 k7 L, u3 p/ G7 d0 [9 ^. v6 x/ H</template>2 N) M& r* X. R5 ~% w

0 K; v2 F4 A3 O6 {9 @. h& Y8 ^! }

; O$ o* N6 A% b% \7 x结果:1 L4 Z/ U+ e# R! \' j7 U& d* u  j
9 A" R' g( \0 U6 |! s, x$ B
* y9 M( g( Y/ c9 o+ a
Actions:Add
ReduceStateValue: 5GettesVaule: 6" k# n* j0 i2 Z$ Z4 L7 Q+ L

/ L' }; y& S, h" f4 a- e8 s6 {7 Y- S

+ z& ^7 f2 A" l3 ^8 P: D. a4 z- O3 W

. X. K3 q. j% K. e  U1 h0 J3 R
6 R; _# A& S& f/ N: Z# K3 F! w) y* e% c

9 H  S) |6 }8 `7 y6 p0 c! C! p% j5 X9 O; u6 p
(6)Actions:
6 \. m8 l, P8 ~

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


1 L: k5 k% L; l6 c


5 f# W1 Y+ q% W" ~. \8 }mutations:{; n. J( w5 W, a9 d3 b& R
      add(state){
' k7 x, p0 p4 g2 l& x         state.count = state.count + 1;
( @$ j% W6 Y& a, m; k1 w( e      },* g& |2 }+ Z. p" d, S
      reduce(state){
, H9 F* Z8 u* {, v3 o, z( B- M        state.count = state.count - 1;
. y, Q0 ?. |$ p! V    }4 A( U' l$ x5 g7 R% L% G: d) L" R
  },
5 a7 M  _" `. i$ W  actions:{
+ X3 q) T$ c; Q& Y- K      addFunc(context){. L7 y) T0 r; i/ Z  Z, @3 G) @
          context.commit("add");8 y! u2 w/ h( P' a) _' q2 Y% \, z
      },( }, e8 R8 C4 v* q% U/ V; x; V
      reduceFunc(context){
$ z, T+ G/ {$ P2 v% b7 S9 ?2 V! Z          context.commit("reduce");
& d/ s& _: ^) [* b; A" B% I' x% z      }
9 F2 ?) t5 F- r/ M+ r  }+ Y- Q0 ]2 E7 v4 y9 y

9 W: T# x/ w9 a( `: r2 b

, k2 H+ ]) R" I: M

. S: _1 C/ \1 D! o( h8 _
  methods:{; Y; q) `% [4 \2 s: s+ j8 C
    addFunc(){
6 [3 b2 {" s8 @5 e      //this.$store.commit("add");
0 c( d9 o0 ^" W, s: Y      this.$store.dispaTCh("addFunc");6 h+ H; y/ h' R4 B. K5 P' X' E& e" L
    },
' M/ C: T% X3 x5 j" Z8 D    reduceFunc(){
- @4 B. V% }" G! f) M8 R      //this.$store.commit("reduce");% Y3 b" f) ?) s. o
       this.$store.dispatch("reduceFunc");# l* \" b) D9 d) ^+ c) ~
    }
8 J- u% m6 X- E/ n3 b& W8 u  R! d  }

- _1 j, ^+ Q$ M
+ l0 U( s. V8 z8 X
这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的
# y0 `4 W" c6 \! j/ G: @+ }实现效果一样!!!!# r% H# `) R) d
# ?, {. a* b6 R+ I2 W
! `# x+ @% V4 h; q; W8 t

! M, ?) w8 x1 L( E: e/ ~: [

  H+ d  X8 t3 o$ r. l

% J2 F/ Y; v1 A9 X


) d0 d/ I5 O  a* [$ [: Q7 h& ~. |; H
: ^$ u3 C1 f$ V- R" y
3 \& S6 L$ {) Z- l9 G

6 w3 ]/ z' Y4 ~# h3 W$ p% F( `' x# i
( |: d$ p: c0 B) Q. r
3 S" {* b1 g; ~8 m: x1 \7 p

: s* c) W! V7 K! K  W7 H9 z; W, m+ g( S- S0 t# y

0 O" V1 V% q) M* m6 c% b0 z; v! @* i! g: o: z9 `) Z9 ^8 K: V
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 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文件如下:


8 T- b8 ]+ B, V6 l) u

* M! R5 @$ F8 l* g+ f

9 r  z  C5 H: }. O6 R; U

正常显示,效果是一样的,我们就可以不再使用很长的写法来调用了。
/ O; V/ r. n6 d) ^5 O9 d3 \

9 H4 q# S  j- @; d' ?# ]  uimport {mapState,mapGetters,mapMutations} from 'vuex';
0 f7 F$ e6 e" D* I; _export default {
! u2 c: N, o4 z) D  name: 'HelloWorld',+ m/ H; q5 r4 |; ]2 g
  data () {
/ m6 f3 t1 x( {- @  A, f    return {) Q' t1 e7 v# F; G
      msg: 'Welcome to Your Vue.js App'
. J$ g  t( Y1 M# p5 |& j8 {    }
! m; a1 o$ ~+ u+ F+ U  },( {( @) H" Z8 U0 P
  computed:{* p+ H( I, }- D, U; M( e
    ...mapState({
# W7 e; o3 F8 {1 L! I) \      mapCount:state=>state.count
# S" a5 v, L% m% |1 l    })
3 L6 L$ P' V( d. r) y  {1 L% f  },
8 c9 b$ N! v+ i/ i; I  methods:{3 w/ E* R! V  a4 b: t5 W1 L8 E
    addFunc(){
, V7 d! @. U' N! _& Y  @      //this.$store.commit("add");% c+ y1 h5 p: L: h+ k% A( s
      this.$store.dispatch("addFunc");6 U6 `0 l% D! [9 y
    },! h0 ^+ u; {5 |5 p; }" m( x
    reduceFunc(){
) g; W( A3 t( j( k1 X      //this.$store.commit("reduce");  {7 o! R8 D% g
       this.$store.dispatch("reduceFunc");; y% z" h5 }6 n3 G. @
    }
2 o# A" o9 r3 t. `  }
& F! R4 J, K  H# k+ k}
) k8 o( Y  @- ]& F" u9 z& k
% C8 f# d1 S. M, i8 W( i$ P7 B, ?3 Q$ O9 Z) O# V

2 O/ q3 {% N2 s. ]
, j6 C: M& Y0 b1 H9 F
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了