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

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

[复制链接]

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

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

admin 楼主

2019-6-12 15:24:50

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

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

x
Vuex 的用法详解
! ?8 A2 O! f! S8 F. A& M  _0 p$ K% L: n- {0 L/ t
本案例测试下Vuex的使用,创建一个新的web项目8 ]. X% g: ~0 J  g- K3 D6 K
Vue init webpack web
; f3 ]) Q5 ?& A* q/ u' ?安装vuex
. n; f7 v5 b' f3 Vnpm install vuex --save
% t7 w) G0 ^* A# C2 @, ^启动, npm run dev,打开localhost:8080  即可5 ^& Y* H0 _' l/ a" E6 m% Q

9 G* G/ ~) A3 Q& F9 M0 n
5 @3 v% U# ~+ Z% }& d* B(1)引入vuex- L8 p( R7 H: ]$ H) |* H) V
创建一个src/store文件夹,创建index.js , 引入并导出store
7 A% A+ I5 \. k- yimport Vue from 'vue'
5 H- g2 K" T, g( K* [& Fimport Vuex from 'vuex'
5 c! c& m7 [# O% tVue.use(Vuex);
; T( z! s" \" V0 T) m' Zconst store = new Vuex.Store({
* L3 e  l8 a+ u6 U: d! n$ N; L) d3 Q})( w( y1 \. U2 y- E* T7 ?9 S
export default store;
+ Y1 [( |7 |% D/ |9 I7 k) K$ T( x( N
(2)引入store到main.js# p. k( B5 u; Q. j
import Vue from 'vue'& T% G# b- ^0 C  y9 h
import App from './App'
2 B' _# Q6 ?! d% E: b  v1 h. jimport store from './store'
/ K0 Z1 r$ L1 J2 M  ^- L, V; b$ Y; g% t( }" @+ |( N5 T
Vue.config.productionTip = false: f3 \' [' M7 n, M" D

' F3 x8 q, @& P7 u: k; a+ h% p/* eslint-disable no-new */
9 \! M0 x2 o0 ]; ynew Vue({
1 t2 t; q* q- @7 y& H  el: '#app',
" Z) F$ I6 L1 S. d  ?- I: B6 F5 m  store,
. K2 V7 ~" O% G* k9 k  components: { App },: C! q. l' r7 [' K  E7 w
  template: '<App/>'- G: Q- _9 ]8 o% ^  d  \' b2 _& `8 C, v
})8 r% E; c/ D& x) g9 D
- @, l: O6 c; v0 _) S/ y; Y% h
; R* V/ e5 G: Y8 c6 z3 @
6 Z' U% y; V/ ~$ C- B0 i% Y
(3) 修改 helloword.vue ,先使用state获取值进行测试6 H) Z0 [7 d2 [1 h& T9 G
State: vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;6 e/ E( ?" `4 i, B
const store = new Vuex.Store({9 C! j% Q1 Q$ I; x+ l$ @/ T
  state: {8 x6 }9 J# h/ x2 T+ t/ k4 }3 n
      count:14 p& o" `3 y$ `6 G+ |
  }. J2 |5 a& O9 i/ ?1 z6 K
})
8 g2 C! Q9 Y! Z# d! Y* j  H/ K# }9 K( X- h" U6 W) S6 X
helloword.vue----
. m* H; L" F9 B<template>6 {" ^" Z, N2 C& l
  <div class="hello">9 w. q' n& x1 }/ y$ {

) Y9 J+ i/ a6 o3 q$ C, g2 J* s    <h2>{{this.$store.state.count}}</h2>% \* I1 b6 g8 V+ }; n- O' G

7 s& w2 ~) K$ O1 g7 H8 S  </div>
! J$ _4 |" }: C& s" ~3 [% H+ c</template>* Y8 R% D% E* K! X" E

* G/ v9 I  K9 `, `+ b# X

( `7 D& u4 R) P1 a- I显示结果为: 1
2 Y' D& l% [0 O7 t( A4 E: g! c. Q+ [7 O( ~
! ]) x1 v0 d, b) X  x
(4)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,这里我们可以通过定义vuex的Getter来获取,Getters 可以用于监听、state中的值的变化,返回计算后的结果,这里我们修改Hello World.vue文件如下:. W8 Z- I) r$ W* e6 M* Y% G

8 j9 a. M' B2 K8 k" ]const store = new Vuex.Store({
2 Q# O2 V$ |/ |4 y, K% t  state: {* U6 E) Z2 X$ Z7 N; R. X
      count:1) d, |5 w) X( ]9 z
  },5 n5 s0 H% [8 y5 |7 e; J
  getters:{& ?! x# s3 \8 W6 ?4 a1 ?/ r
      getStateCount:state=>{
3 C- `/ ^& N2 X* p0 H+ p/ X          return state.count + 1;) `9 K6 z) N2 O- j6 ^, `
      }+ p$ O% V, h7 r% o. w; n
  }
. ~$ i' n% ~- s+ q})6 h1 v" B+ |# Q  N7 ~7 F% D9 I1 E
3 [& f. q1 s; |; q6 J7 ]* V
<template>, @/ |3 [! {0 N% ?! ?2 t/ Z9 r
  <div class="hello">
5 i2 M6 y- t+ m5 K. V/ R" B" V% E; Q7 t- U8 g8 Y" L7 _# ~. S
    <h2>StateValue: {{this.$store.state.count}}</h2>
% X2 v( Z' s5 ~8 S8 {     <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>
' G9 s0 Z& T$ E% ~' Q$ i! w+ I  </div>
$ K- Z8 j! u* q4 V$ w</template>
1 T6 t: Q2 c% R  Y  G7 i; e" l% {' B- |, s; k; K
# x5 F( K: E6 h* T
显示结果:' x3 ^% f# C  F- ~% L
StateValue: 1GettesVaule: 2
3 O0 H5 v4 K) \" ~; z' K6 g
3 l2 V% Q2 P4 ~7 t1 T' M* i6 Y* N! ]; Y1 T(5)
& k- f, X5 N8 z6 G

Mutations:

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


4 ?$ s+ t, I# Q修改index.js文件,添加mutations,在mutations中定义两个函数,用来对count加1和减1,这里定义的两个方法就是上面commit提交的两个方法如下:
& c# r! o- n" S" U$ H; K+ Fmutations:{1 }6 w$ x2 j5 {  Y
      add(state){
4 z0 C+ u6 Z, i  ?! A0 {+ _: L         state.count = state.count + 1;5 R" r9 j: B4 h) C* o
      },/ l: u6 C( j+ ]! B
      reduce(state){& P0 a4 p% P1 P+ k0 ^
        state.count = state.count - 1;
+ F# j5 h- [9 J2 h/ X    }+ K; i  m2 x( U4 e9 t( I
  }5 E$ u  J" i1 Q
<template>  O$ n  b! \: }+ ~- f- T
  <div class="hello">
2 i+ {+ t; N* ^9 m% o0 p/ h    <h1>Actions:</h1>0 v7 y+ ~5 {! e5 s( o! Q0 S
    <el-button type="primary" @click="addFunc()">Add</el-button>
1 {4 R& ~7 n$ t2 f$ W/ f    <el-button type="Secondary" @click="reduceFunc()">Reduce</el-button>$ D$ ~* k8 a( @% R5 s
    <h2>StateValue: {{this.$store.state.count}}</h2>
, \( f: I$ b/ h) o- i' y- c4 N    <h2>GettesVaule: {{this.$store.getters.getStateCount}}</h2>8 G7 j( L8 F' K2 V- c' e" V2 u. B3 r
  </div>
5 g& O2 p) T( X: i+ T& g# [! i( ^2 w</template>. e% L; v2 y- v6 U& g  S- B" y8 d

6 H7 u( C+ b5 k: t7 l# Y# q7 E, j5 T
+ t9 I6 f: T8 d& B
结果:
' z2 u3 z' d/ ]' k- }+ C# x" {
. D1 h6 {& S5 P: X, P2 v
4 ~) @9 `7 o' C1 R( ^
Actions:Add
ReduceStateValue: 5GettesVaule: 6' G) ~0 `- j4 U1 H% _' b

. [, {" B0 m: u+ E8 S( U
/ v; ~$ f* ^) L: g

3 i$ e% r2 M2 g) ]9 j
' L& s* q& V( S' `( g
; _& z: h, [( V5 A0 M( C
* h0 r, t  M3 D% d) I! C( G

0 i8 s- P! p) y3 l, d$ H
$ B' M. c, c: j! s+ v9 y(6)Actions:
5 F8 i' Q( H. T8 T9 b$ f

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

  d' B3 Y2 t# P+ J! x0 u


( a' Z% C+ w' D- t; I% @$ lmutations:{  z: {' p7 @+ b
      add(state){
5 x1 _9 J' N: S) |" E3 {         state.count = state.count + 1;
0 K7 z9 u8 {* ~1 B+ a' \. S" R4 v      },
8 m& k, U5 |1 G* m) x, F      reduce(state){
" {8 W5 K, a2 c; G+ \! b$ Z% K! b        state.count = state.count - 1;9 t7 w, J& l$ }2 V6 u
    }8 v0 H- M, B0 V; d* z& G
  },
; t# p2 B% y1 `  actions:{
( V) D/ A( s8 u" h      addFunc(context){6 u, |! V: [2 Y, y1 R3 L
          context.commit("add");
% O9 j: U- D# ~  ?. e$ s      },
( ~9 `  x' d9 @& `  m. e      reduceFunc(context){1 F  d' j4 p, j( u  ^- k& l8 w0 K
          context.commit("reduce");
& {+ S' j/ N) L5 C      }
4 U* L* w4 c$ A, H- ?  }
  O$ j$ B- J5 f9 S: Q) ?3 h
8 D+ z! A& S# H4 b+ G$ R& U7 z/ d

4 A( P8 e& K! T/ j  n( ^

3 y+ c+ {' M* X0 b6 |/ ~  ]
  methods:{9 m% J% O* ^' K- b/ E
    addFunc(){# n$ A& R  Y1 B' _" O. m. [7 o
      //this.$store.commit("add");
0 _. K* ]3 k+ O, q      this.$store.dispaTCh("addFunc");: J" v- w6 v- d- k
    },
/ F* c2 `: P# Q+ B    reduceFunc(){
+ X$ B) S  v: [* }) {# I      //this.$store.commit("reduce");8 Y' i1 C: u  z4 [& L8 A& y
       this.$store.dispatch("reduceFunc");
- ^0 o8 X& M  Z8 y    }
! n& H& a( y) X  }
* N. ]! A+ E* z% y: p
. H! Q% S) W3 S  o. F5 C
这里我们把commit提交mutations修改为使用dispatch来提交actions;我们点击页面,效果是一样的: S: u5 l6 }/ Q. V
实现效果一样!!!!! \0 o7 k( f3 M' Q1 J( q3 b/ E7 j/ J
+ r/ }- ^+ d# M" j; X( X% z

' O1 W( e, [4 }7 \- Q- [8 R  k  d
3 v1 N9 t+ @6 {% p. d4 T

9 ]7 @% f& f, i% w5 ^1 Z1 C3 ?


" z- L' a0 t; T* F


* }$ a+ O- X, A& e- Q) }. Z2 W
( X3 B0 d$ v: F/ v3 [/ P: V; ~

6 B; }( k  I9 D* [! z& t; d. _0 }7 J

# ?6 \6 ]+ k. l( T% }" K

/ Y+ a5 w: p! Y5 \# L. C1 ~! ^1 |9 _% O1 b3 _: x2 g. ?* C

8 I7 G! i, F1 B7 P; b7 i0 y+ Q
9 Z; p. u1 K7 m, C& v8 a5 O0 G. O: I0 L. Q/ U' N  s3 U
9 T" r/ J( i3 Z' ^5 W8 V
上海点团信息科技有限公司,承接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文件如下:


! f1 J. }1 l! g' n/ x% Y( z


8 x- @* V: y$ H* R

9 c& {- @8 t2 q" r, H

正常显示,效果是一样的,我们就可以不再使用很长的写法来调用了。- L7 H$ z5 `; ]$ ?+ F# J, Z
$ b! v" ^4 U; k! H; x
import {mapState,mapGetters,mapMutations} from 'vuex';4 ]3 s* C. F+ }$ ]* A' Y' f0 R
export default {
& n" S8 R0 B) ~( |8 `1 h" f6 |  name: 'HelloWorld',4 J: V! l" K8 \" d9 f% y
  data () {
! i- U& Z" G" W: f6 `+ R$ g  ?    return {' \, O4 ?5 Y9 Z: w( }! Q
      msg: 'Welcome to Your Vue.js App'
4 v7 k' l; U3 T3 g    }
' U  M) Q9 q% Q$ u! X5 Y9 J* |  },
' F0 N' D1 J; _$ `( i9 w/ a0 u$ ?) ~  computed:{
4 y4 q. K' H" \5 H    ...mapState({
, |1 e  A) z( e. \  n9 D      mapCount:state=>state.count! V# J5 Q, V9 E& _" H
    })
5 W& O* m3 l9 h9 W. A( v3 J  },
8 X5 O; I: M- J8 D6 B( W  methods:{( |+ D- L4 a+ ^* Y/ F* R
    addFunc(){
: u) _/ p, K2 [2 H      //this.$store.commit("add");0 {8 x2 C8 l: i2 j8 u
      this.$store.dispatch("addFunc");' R" p2 C+ ^3 h# Q* ~
    },: n5 g% M  l2 F) f; e
    reduceFunc(){! }2 _/ N  u. X' V9 o
      //this.$store.commit("reduce");  {5 w7 R% r; t0 _) u! E
       this.$store.dispatch("reduceFunc");0 G9 A  n) a) D+ \. B( c' I
    }# _. S( ?4 R' m2 I$ q4 C7 g
  }4 @" ^( k* F( _" }- R6 F
}8 r, O6 ^: H. N) P$ Z) P/ R

1 {, |$ w1 f( B6 q1 K: R
, \: K+ J+ \! W* r2 L$ y: S

. ]! j  B% M! r9 V6 e1 m' z5 {, J# ^7 H7 b' d" a
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了