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

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

[复制链接]

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

2471

主题

1276

回帖

8万

积分

管理员

PLM之家站长

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

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

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

x
Vuex 的用法详解( C* I& U  z# U& N2 a- @

, N4 u6 L$ N3 S& c本案例测试下Vuex的使用,创建一个新的web项目% y* p: q: d2 i# C9 R
Vue init webpack web( A4 e/ H% Q* I/ F9 U
安装vuex. C2 V% n( n* K; s& F2 f
npm install vuex --save
' l$ o. r2 T( R  f. }" h& ]启动, npm run dev,打开localhost:8080  即可
% T& ^" H( ]$ s7 d' b! b9 B# R$ H; [& U  v8 f4 X
. s& Z9 Q/ ^3 B) K
(1)引入vuex
" D6 U  |  n9 W( N2 c" N创建一个src/store文件夹,创建index.js , 引入并导出store
) M" g) J# @: Zimport Vue from 'vue'4 `$ O' B6 F( C8 O% x% I
import Vuex from 'vuex'6 [2 a, p( }. g
Vue.use(Vuex);
% i. k) |. z- T/ K1 \- Fconst store = new Vuex.Store({% z* Q: b$ Y- F( y! G3 d
})
0 ]; F  t$ h' Mexport default store;# N9 @, w6 z3 \* D  W5 D3 T% ]
4 x3 D* R; z6 B
(2)引入store到main.js1 R9 @( \( {. [; T: I. ?
import Vue from 'vue'
( ]4 J( O  C( U) e; v7 H/ f" _, p& {import App from './App'
8 G: Q2 d2 G# j" h9 mimport store from './store'9 S* z. m2 E* f* x5 z  _
0 [, u+ v* J5 ], a- K- U3 q; a7 n
Vue.config.productionTip = false
1 ~5 r. B9 x/ G" l
8 r) T' i( N7 V" P5 ?3 e/* eslint-disable no-new */# ?; S6 g. n2 ~0 c
new Vue({
6 l5 D: C, B% `% P) t  el: '#app',
3 W9 J- s! x/ Y% e8 ]5 c" q  store,
; o6 P) Z, ~4 Z6 b  components: { App },
$ M, e. s7 r/ x% {3 C  template: '<App/>', i. I8 h6 F( Q. M! N! r0 I
})3 v" K/ n; U# ^: V

" w- [' g8 Z& m" \

" _8 c; u5 \6 g2 S" f" _3 `: L$ W) d
$ H: u. L- M! h  Z- b3 {4 T
(3) 修改 helloword.vue ,先使用state获取值进行测试
/ v7 D1 W: }. S  ~; u7 }1 MState: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;1 ]2 I8 V6 S5 b* p7 [) u, i
const store = new Vuex.Store({0 m" r( S; }, z1 D
  state: {7 H" S! b/ w% j' B- O
      count:13 {( J! W% z% c  p3 `, H/ c2 L
  }
# }0 \9 I) k8 p5 p+ r' [  S# Y7 L8 f})+ ^$ P1 L, ]: t" F9 D) d, J
! Q. X0 c1 ]! g7 r/ m$ ~& ]
helloword.vue----
2 ?* Q& Q' F0 Z6 i) T<template>+ t1 C- u( A7 V) C+ {3 l; A
  <div class="hello">* I& F. o; t. p, a' k' Z. p
6 r9 O$ T4 K4 p, I# K
    <h2>{{this.$store.state.count}}</h2>$ w' E. T' r1 j

3 M0 i4 _  L7 x; g: [) B, B  </div>( e: G- U, j$ R9 H( K7 G
</template>! D. K1 c7 S, i- S3 i) [

! ?6 P. v6 x6 ?1 B
* M! d& b) x" y+ Y4 b4 P
显示结果为: 1
4 x# v- t9 J8 `5 c: v# D; f
1 d0 \  m! N: P) O1 }! y

7 n2 x; e9 v* O$ W) u(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:: s8 R: D  \3 Q$ |4 @6 q& j; j
2 G. k. s' v  P, X
const store = new Vuex.Store({
9 ?& ~& p: a: O( m$ Y  state: {( P; |' P' h/ y3 E- r$ d" G
      count:1
4 K7 w( U: ^3 G+ b  },
6 w/ ?& P. ~# x+ O( H* u3 ^6 g. s7 }  getters:{
( M8 P/ _  j9 a$ d7 d  U      getStateCount:state=>{6 Y& g1 B5 V- R1 d  h" w
          return state.count + 1;+ N+ i4 d/ R" x! p
      }
" V: K3 N; I% N7 @  t  }
: t. A$ Q' k2 _5 p/ Y* w' l})- x* e* M& I& u0 W! i: n- N

3 j1 p, e, d1 A% u. Z2 x<template>" k, \. J0 A/ q3 S( O. E+ K7 |
  <div class="hello">
2 t- O9 m5 v8 `
! X( N; C3 |$ [+ D" x5 d    <h2>StateValue: {{this.$store.state.count}}</h2>" e  i/ Y+ L# ?1 ]9 M" t
     <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>/ f+ m! n, P- Z5 _! s8 d- U
  </div>2 n1 J' N+ ]- t0 R6 v
</template>( X4 D8 ]0 l2 D  ^/ R( f4 [
0 L* c4 s! f6 I5 O; z: F

5 J; F  d2 ]) k. u/ Z显示结果:6 c3 i8 ^/ H0 x9 H* L
StateValue: 1GettesVaule: 27 D) Y! _4 g$ Z7 d* Z
+ z- t  v1 c# k3 `3 o
(5)
8 \3 I0 ]: T1 Q. z9 O8 G) O

Mutations:

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

+ C. G5 @& \! |! M) E7 A3 P
修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:
( b: S5 p/ f9 ~+ V$ D# E" Ymutations:{
( E# I; S; h$ ?% L  m( f      add(state){4 l8 k$ ^5 S% g$ N: T6 H" b& [
         state.count = state.count + 1;' Q0 L1 o9 P) r# o5 S- Z
      },) ~5 [3 k- S* v  G' r) X+ P/ N  n% P. y
      reduce(state){- B+ }* m" Y) W7 v6 s9 d0 q, z5 ?
        state.count = state.count - 1;
+ d. D5 m/ e" |; F8 S+ K    }
, {5 y/ w) R- M# `9 s. ^, W  }
! B, \/ O( o; J" i% B<template>
! F0 |5 y: N8 q" p6 P& G' R  <div class="hello">
: d- p) g8 h1 a1 h/ c: B* O' _    <h1>Actions:</h1>
9 A4 M6 X# w" o* r. T: L0 ]; _    <el-button type="primary" @click="addFunc()">Add</el-button>
' Q' ]2 U& D1 {6 ?! `5 x    <el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>3 b0 f, I4 {$ o( ]+ U3 t/ b
    <h2>StateValue: {{this.$store.state.count}}</h2>
0 i- {2 Q9 \! {, z    <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
" B# s# P" `/ i  E8 X  </div>7 `( p+ W0 H% {" p3 `
</template>. T( }1 P$ q" H, T
; D- q  T4 O% _0 o; t$ a: q! _

  R; b% H, H; J4 C' R结果:# c; L7 H& ]0 q' z  ^  B% w1 i/ g

. c1 t; j, Q6 m- D
" F' X) f0 J) o0 s7 J6 x9 e
Actions:Add
ReduceStateValue: 5GettesVaule: 6
2 Z& e# q( t" q0 p0 m, e! D/ p/ m( x2 x
, R, S9 i7 s& S: Z; |1 S4 \  x2 `  B% G" ?" H

- R  Y$ N) g$ a$ f$ q( A0 X) H; O# ?1 |0 l+ O

; w. L1 x$ {* u% P- e/ E
. b- }) U: V2 O4 ?

: n, I: q: C# D9 q( t& \- P; @# b3 w- P# R
(6)Actions:' E5 |: A1 L& v9 U: x+ n3 u

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


" ]3 Y5 J8 N: [

3 |" t3 l3 f: B: b6 @0 |6 l/ l2 K
mutations:{
% ]) z0 }8 c8 l7 v+ v- U      add(state){
# T# X" a9 t5 x  J* q/ D% Q         state.count = state.count + 1;
) Z* ?) t! b2 q6 }2 m! [      },
& v. K" W3 N7 n      reduce(state){
# z" c8 ?2 `  ]- x/ x0 p        state.count = state.count - 1;
1 I9 e  ^, h4 Q7 M( u0 s    }5 O/ x9 X- W( {5 c4 `' x5 Q- j/ U/ Y
  },5 P: a  I2 j7 q, {; u4 Z# s) u4 B
  actions:{
4 Q2 M2 y! ?5 S7 N* E      addFunc(context){# z0 V  t. \5 D
          context.commit("add");
* f; D: Q) C% U  L) j      },
6 O6 E9 N' t, y( B# L      reduceFunc(context){
# Z2 _" K$ e9 x; d, m( P$ B          context.commit("reduce");
6 Y) P" d. F$ z5 d2 L* G9 P4 O7 G      }
' L0 L4 g$ \, s/ C. Q2 i& ~8 s; P  }( f" L4 F! L: ]. Y+ |
$ w7 c) s. |& S: U' T. \

* y1 Q2 o* Y: N' [


3 G+ b5 S& q6 B6 t  methods:{
! k/ m( o2 [, S$ O  a, U; o: Y    addFunc(){) g& \( m% F; M' u
      //this.$store.commit("add");
1 L, ?( _3 }( i4 P9 {2 B- S      this.$store.dispaTCh("addFunc");
1 w& N3 x$ s) Y+ ~& W' r    },( Q8 n( ]+ c, S
    reduceFunc(){
( W, i, k9 p9 B  w      //this.$store.commit("reduce");( |$ O; K3 G- f+ @
       this.$store.dispatch("reduceFunc");) D8 {. f9 B  y- `3 R# @3 D
    }
  h" n9 E8 ]+ _8 p- Y' R) ~+ X1 Q  }

: T$ O/ |4 H2 _8 i: B; ^" a1 v
. s6 ^3 M+ ^7 s5 B' K/ ^
这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的7 c1 C7 h) i3 K' P, {, Q
实现效果一样!!!!) R7 j( Q" a1 I- F4 j

# K& {3 `3 g# R3 \6 f# H$ E
6 F+ u( w# j) d3 }% M5 s3 z& Z) B2 N) ?# M3 m8 G4 g& G$ B
5 U0 P% e  e/ K- t4 @2 W; ]+ q. I# M


" n! D( C1 ?1 B. X7 F0 e4 Y" N

/ |/ m; @' k5 f

0 g8 p  p; m; r* V; H: X+ \" l

3 o0 ?; O( M' [/ Y" |8 u# b- Y7 j2 A; J) Y) N4 A

9 g% Y8 _1 I0 R4 v1 L
+ b' {& e' z% w. s% p; ^  @

4 `- E) a' g9 ~: T4 g1 L1 |. r. F: @; L% V
# q# r5 C" E3 o1 }8 D, b, g

" ]+ @2 @3 M" d8 ^, y
; F) j" r/ T2 T% ~% b9 m
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 doTeam.tech
回复

使用道具 举报

全部回复1

2471

主题

1276

回帖

8万

积分

管理员

PLM之家站长

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

mapState、mapGetters、mapActions

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

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


. Q+ }" P/ |* a6 Y* r, \

4 y2 W6 c" q# J5 B# @0 d. q


" e" Q* m' M9 d! J! e% d8 M

正常显示,效果是一样的,我们就可以不再使用很长的写法来调用了。
  T( A- u7 k- Z) ^& {: ?

! Z; ^! e, U8 i9 ^* h0 E  e% limport {mapState,mapGetters,mapMutations} from 'vuex';# C# w1 }! q, m/ `( G
export default {2 D0 `' g7 ?8 l. F  ]! m5 q
  name: 'HelloWorld',  E' Y5 R! |2 R$ p( n
  data () {
0 K% v; W/ r, M  _    return {9 ?7 z# s% l9 W' v9 P' R: I$ y0 _% p' p
      msg: 'Welcome to Your Vue.js App'
4 o+ Z. `. b4 X$ L# }    }
* V+ a: E1 a6 n  },
- O0 P! Y7 d) e+ g- T& x1 h  computed:{1 ~) ]+ z- T8 c6 M. k% j
    ...mapState({
+ ~* Y# {* s9 d, [: ?4 E* ]+ a; ?      mapCount:state=>state.count
5 Z- {( [- E( F( I# \! ~    })7 Q+ A7 A4 A( q. Z$ e
  },5 U* B( j) A3 n0 H; p3 H
  methods:{  W1 \) e. Y/ ?! o$ G6 L  r* D
    addFunc(){7 b! _! L* x$ \. J$ j3 C
      //this.$store.commit("add");2 r8 A- b4 i& U9 P: S& ^7 L
      this.$store.dispatch("addFunc");
; A( f9 m6 Z& f    },
2 t0 B0 ?) f- T6 D. W    reduceFunc(){
2 V( ^2 K1 E: }2 ]4 p5 d6 q% r      //this.$store.commit("reduce");
% P5 m! b# M/ Q: ?  q       this.$store.dispatch("reduceFunc");; C; g4 [) J  Z2 Y# |# N
    }
6 w) g: V! H3 S' r+ F8 z" K7 n3 N/ W0 S  }
' u' p- B# W, x3 l/ @6 i* }}9 _) m6 I' R. j$ Z* P
0 @$ Q! x7 ~- o0 F5 g. Q
# F) W! h5 N8 Q5 \% y

/ |3 ~# H$ H, v2 I( z1 M' c3 U& M  v, H
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了