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

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

[复制链接]

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

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

admin 楼主

2019-6-12 15:24:50

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

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

x
Vuex 的用法详解& B0 {( D0 n6 T3 B7 r
1 `8 m+ q0 N4 u/ m6 K8 u2 C& P7 {
本案例测试下Vuex的使用,创建一个新的web项目
: `, W! j/ @# c1 m- g/ _Vue init webpack web) K, K: ^# F0 g0 M
安装vuex
- o$ l3 P0 k. h( H; C; r, X5 m9 {npm install vuex --save
% ^9 E+ M/ ^& q0 e5 C( ?( a, X启动, npm run dev,打开localhost:8080  即可0 W7 W0 d7 e$ }5 k8 x2 ~0 m
7 y5 O. F, z, \

2 L- A( c) c0 ^( T. ~! ~* f8 b(1)引入vuex+ M) E1 ]# t" Q" f  u* R
创建一个src/store文件夹,创建index.js , 引入并导出store+ F: H" F3 ~: g' D( w
import Vue from 'vue'' G$ ~/ |. Z3 u# W7 T- a. R
import Vuex from 'vuex'
) `( B; {1 X' j6 Q2 p* ?Vue.use(Vuex);# m/ R9 W, I0 V1 P
const store = new Vuex.Store({5 Q- h0 B+ u8 D$ r$ u* K7 O
})" p3 i" E( v; X( y" P  b) @
export default store;
( B! K. q" [$ Q) J1 @" {" N! L8 A+ c  Z% ]) a8 W! `
(2)引入store到main.js) \8 V& r4 G7 K. ]! S8 i0 z
import Vue from 'vue'
4 n* P* B) ~+ ]& r. Cimport App from './App'
  [3 a5 H9 X# K3 ^import store from './store'/ g% f; Z: F, F" P" `
, c$ m% C4 @* s- I5 n# p
Vue.config.productionTip = false
1 n- B0 @% w: ^' j% j  c8 `3 e0 W6 ?# t
/* eslint-disable no-new */
1 f* m4 L- e1 m8 ]9 Q0 s% Znew Vue({
" v) u) H) y1 ]0 A  el: '#app',4 [* T9 z! y0 D# {
  store,7 J( b- W# _& N. l+ C0 n2 M- S! X/ r
  components: { App },
1 l; f' n4 a* Q) w# b& I2 U/ Z. X  x7 m  template: '<App/>'
' e- @0 `' y) S7 K* G+ j})- f9 i. `+ @2 }# s* P) U$ u

3 U9 o( [+ }0 }

( X* q1 Y1 i1 q! q4 x- w
( @, }2 W* U0 c
(3) 修改 helloword.vue ,先使用state获取值进行测试: L0 Y: {! S; \$ ^; r
State: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;
  n8 F/ X) f% I# }# l, Lconst store = new Vuex.Store({
: a/ j' B* D7 S: Z* U: P1 G/ I  state: {6 y3 E6 ]* x2 H5 r$ V7 L
      count:1
. A) y+ k/ U  i8 M& U  }
* t' I' T& h% N! j- j7 J3 [/ e})
# q/ T8 P1 C6 ]. P
0 q2 [; E7 T1 f" q6 [helloword.vue----1 B& a4 z7 B4 ?  C# N
<template>
6 c+ V1 w0 x) n  <div class="hello">
3 W) R9 _: }0 N1 l5 c" |; l$ b. O$ D4 C, R% n3 S4 `
    <h2>{{this.$store.state.count}}</h2>
9 r7 H1 ~- e. c( A
6 x3 D; s* |5 K, R' L  </div>
( i& Y. D( u0 x) @</template>
4 p! ~9 _$ }' R/ B4 Z- c+ w* B8 Z, H* N
& g) W/ ?5 Y% c
显示结果为: 1 . t% f( _$ R- @) R2 L( `" Y' ~( b
' U# Q( O: {8 r  {

  g6 n' n7 s& h8 M. j(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:
  I( {3 f/ ]- L, e" U
, A) M3 V$ h+ zconst store = new Vuex.Store({
/ L4 n, i" z# B  Y4 V5 h  state: {  P3 f! j/ U' Z- L0 C
      count:1. b, o0 \# O6 G, P: Q7 V
  },
) m9 {5 c1 h. l! _/ I: P  getters:{
" y, l. q% ]# K4 M      getStateCount:state=>{
% [/ `3 R4 @! p. R. t" Z          return state.count + 1;
% J% u3 a( z6 g      }
! U4 p; X' G. p  }/ i8 X5 ]5 Q4 p* E# M3 v, F& f
})
8 T1 g6 |& F2 n5 @2 H/ X
  A1 ]9 b- d* V' s* b7 \! x<template>
; i4 v7 T, q3 a0 C# U2 |  <div class="hello">- H2 I( R2 Q) j
: Z5 @! k' |' E3 B, o6 F, c; Q% R
    <h2>StateValue: {{this.$store.state.count}}</h2>
0 Z2 s, f/ f3 O* W     <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>7 T, g& u7 |6 y  W" x' d# D
  </div>6 S0 \; }2 L% Y) t2 C. E
</template>
, ^4 b) U. u$ _8 d2 M8 v) G
* R7 A! Q% ?) P3 `

0 K+ T/ g9 e. t6 n显示结果:+ m6 s1 y( M% x- V! c6 P3 g' k
StateValue: 1GettesVaule: 27 _* N2 U7 D$ g) @5 B
( D" g5 Z0 l' R" I/ c
(5)) N! z. P: T' B

Mutations:

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

& {$ D, `* ~5 T- E; K! p  Q7 G
修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:
: p% @1 N* y& b1 D5 L% L% Pmutations:{
9 ?; l- r+ w! W      add(state){+ e: `/ C* L& G/ K& `
         state.count = state.count + 1;
4 U1 N5 D- ^2 {      },+ K! ~4 e6 {" @* d8 \- {
      reduce(state){- n4 [# R$ ?  ~) _! m8 r# ^
        state.count = state.count - 1;+ f: \" t3 W2 N" \/ \* `: R
    }' C- v2 O, q4 B) D& ^2 \( w3 }% }
  }$ k( I9 x  C  R% }" ^7 N5 J3 V
<template>
- b0 F: ^& o) j) f$ i  <div class="hello">7 v, a# z% _8 |( z
    <h1>Actions:</h1>3 F+ ~+ _* v( i( o$ i, z0 x- x
    <el-button type="primary" @click="addFunc()">Add</el-button>
3 Q2 o( J& w& `& H    <el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>, b5 [& Z; j2 D5 u% m. J
    <h2>StateValue: {{this.$store.state.count}}</h2>
& U3 k7 l, q' f    <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
0 b7 U3 N/ \7 @4 ^/ ~  </div>  s) T  C2 V% s8 k
</template>
* a$ P! J( S9 w1 k; v  S6 f* l9 V7 M

; o7 O  ~" g; J/ _0 y结果:
0 o' v# x; J/ }" i/ v+ Q; L, D% l9 d8 j5 O) C# T9 G2 I# b' D1 u4 [

8 d% i. u- x  C' S/ YActions:Add
ReduceStateValue: 5GettesVaule: 6  K  S1 _6 o1 k; ?
, t  z/ H2 p' e2 w4 G, u5 a
  K$ Y# ]2 j6 p; C

' w3 C1 X+ o/ [) c* z! d
& z% o/ D' O1 Y1 B
, q/ {) e" n, t! j0 `" w! x

/ @9 U1 z' T6 w: a; j$ U5 M( e
/ @2 C) }1 x$ `2 P: l
, N; F+ k, u4 i, _$ \
(6)Actions:
' D! N  ]9 p6 b2 X( _  t0 S9 f

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


% |- s$ z6 B+ I' B; H

, ?/ p' }' B. H5 o
mutations:{
8 \8 }% |* `- r5 m0 g      add(state){
  D3 h" E5 s' P7 H$ K: i         state.count = state.count + 1;0 K) R$ K3 p8 o% d  G
      },) R2 k0 d" n% {; u1 e9 p! ^5 y, n& t
      reduce(state){% j% z4 L/ b& [* Y( b7 j
        state.count = state.count - 1;. _/ y$ E+ c/ U
    }
! h/ o: ^( n% B2 _: y! h; F( V  },7 f, h" b( t: K6 }
  actions:{: a- b: f0 W/ s; [0 v" b, O# T) j
      addFunc(context){
+ B. f4 i( |) ]) |" p; d          context.commit("add");( t: \6 o7 _: q6 Y  \5 x3 R& I, a8 p
      },8 W( @& W! _- P5 q: o1 C
      reduceFunc(context){
8 b# s2 i/ N* B  ^  a- \          context.commit("reduce");, j3 T4 r0 c0 @
      }8 n! K/ ~2 P8 r: Q4 i8 p
  }! m  G% A- H0 r& i
- }3 \# J6 d! j' N! ^( N( |

0 ?+ I+ e: \3 }. @/ `


& M& Y* |: ~7 ]" k  methods:{4 X- F) X  c1 ^& S. S' m( u
    addFunc(){/ b% r% W5 H: F- ~
      //this.$store.commit("add");; v" x; h8 z8 J0 F, k6 P# {2 V* C9 m
      this.$store.dispaTCh("addFunc");
/ I  ?1 m' G* e  Y' C: ]% A$ E    },
" s3 y) ~7 ~; N- N; ^3 X. N/ E    reduceFunc(){( r2 }6 F. B; d$ e( Z! J
      //this.$store.commit("reduce");6 ]+ k" e) ~: O- {6 ^9 _4 p! [+ ^
       this.$store.dispatch("reduceFunc");
- K% h- U5 D# i% R$ B    }' A/ G5 T3 C9 a: }8 I! g
  }
1 O1 `. c# P( F) H% f
, @- l3 Q5 o9 c! p! u0 }
这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的0 o! Y8 e9 I7 D1 d& V3 p$ i! p
实现效果一样!!!!+ j0 S: ?/ R9 \
' v1 J$ C# P5 E  y' ~# I
7 f5 ]2 B9 Y5 L/ X! O; L8 X  j
, q7 m- k' N7 `( y) L; R
' r0 K. Q- i3 j6 s: l3 b

, N  ~: p4 ^7 n' d# t


0 q8 k. ~, v7 v9 M+ k9 z
  y+ n( F0 }& c. V& x
( V' U5 m( G8 z3 N) G1 a
. A/ |: I! X: r% @+ h5 j

8 p4 W9 w* U. M+ v

  K; y; m; v: I) T% k
! t0 W" j: J! M# ~1 U9 J; v) P) G7 M: J5 B
( L& c0 D. B5 f. N9 ?8 I3 ]8 M& ?

7 J8 O! Y- L/ B! s- f1 L
" `' z& w6 C" ]2 S2 c
上海点团信息科技有限公司,承接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文件如下:


% A5 L8 x- y/ ~1 A3 S$ T+ k3 [

5 A; a% g9 z. [9 c


7 w( |2 |. F* H! z

正常显示,效果是一样的,我们就可以不再使用很长的写法来调用了。
2 d: ^3 N# g0 ^
+ J- V  I/ z4 M4 G9 g: A& r7 @
import {mapState,mapGetters,mapMutations} from 'vuex';
6 @- L/ `! v- Q* a  d1 [export default {0 o0 w  o3 r& o0 b% R; H! Y
  name: 'HelloWorld',- |. X0 M4 K% o0 ~; F: W/ A0 D& C  y! Y
  data () {
$ r3 O4 d! l: s5 Y) v4 \' \    return {
) n& k6 q. u: P$ K. v      msg: 'Welcome to Your Vue.js App'
6 Z. `* o4 z/ Z    }4 h/ e+ x* B* ]+ d* z- [5 p" N. Y
  },5 O+ ]  E) I& Q: A) H9 r" h- K
  computed:{
. N: S8 L2 c0 d: I    ...mapState({/ F7 {3 E! l0 V
      mapCount:state=>state.count
9 I  k6 b+ o% J+ F6 F, }    })' s. R4 a# E! G1 G% n
  },
5 e8 L: t0 Q: g0 H  methods:{* p* |0 K& P: f4 L4 {4 ?1 j8 c
    addFunc(){
4 r, A$ S$ o, g- r      //this.$store.commit("add");" K- g- x' \/ g4 l' O# {! u% }+ ~9 o
      this.$store.dispatch("addFunc");% \; O: p$ [2 ^$ f$ \5 v
    },
; K) X( ?! j1 n2 Q& P% u# a    reduceFunc(){/ M) {! Z( I# M# Q1 K
      //this.$store.commit("reduce");
; U1 A# }$ J' ^4 K1 o0 B- F       this.$store.dispatch("reduceFunc");
. u5 x& \- N, `/ B2 S! M4 E9 f5 n    }; B# v- v3 x2 U, ?
  }+ u/ t- i0 N, y; z
}
; o" f9 N# t2 s, x/ m6 u3 v- u
' _! d/ }3 y7 a; F- p2 K* j* H5 T# }6 Y: z

6 O. R6 z3 t0 J) `& q' [: k1 R0 ?, U' w
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了